Toto je jednoduchá kuchařka pro HTB. Neklade si za cíl ani nějak hluboce
rozebírat problematiku, ani polemizovat nad dalšími možnými vzužitími HTB,
ale velmi jednoduše nastavit důležité datové toky pro malou firmu připojenou
přes 256kbit linku do Internetu.
Ke správnému fungování je třeba linux 2.4.20 a vyšší (nebo starší s
patchnutou podporou HTB) a tomu odpovídající utilitu tc.
Dobré rady do začátku:
- HTB pracuje zásadně na interface, které je pro packety odchozí,
tj. zejména to budeme chtít řešit pro download dat do firmy, takže to bude
eth0, což je síťovka která vede do firmy (192.168.2.20). Pokud budeme
chtít ořezávat i odchozí provoz (z pohledu počítače na firmě upload), pak
je potřeba celý skript zopakovat ještě jednou pro interface, které směřuje
do Internetu, toto není v mém skriptu vůbec řešeno.
- Z toho okamžitě plyne, že nelze jednoduše ořezávat provoz pro náš router,
takže pokud na něm běží SMTP a proxy, tak máme vymalováno a potřebujeme použít
IMQ, což je o řád složitější. V praxi se spíš spokojíme s občasnými výpadky
disciplíny, když např. někdo posílá 4MB mail nebo když se stahují updaty pro
naši oblíbenou distribuci. A oželíme proxy.
- Pokud přes linku teče víc dat, než je ona schopna zvládnout, shaping
přestává fungovat. Celý QoS je o tom, že se snažíme přesunout frontu
packetů od našeho providera k nám; to se nám ale podaří jenom pokud není
linka úplně plná. Pro dobrou funkčnost je potřeba nechat pár kbit stále
volných, třeba já mám linku 256kbit a beru si jen 224kbit.
- Pokud máme linku např 128/64, máme vystaráno o rozdělení
download/upload, které nám dělá provider. Pokud máme ovšem linku 256kbit
oběma směry, je to větší problém, protože si poměr download/upload musíme
stanovit sami. Dynamicky (mezi download a upload) to jde zase jenom přes
bájné IMQ. Doporučuju nastavit jenom download a doufat, že se to uploadem
moc nerozhodí, popř. omezit upload na nějakou rozumnou mez a nechat tam
překryv, ve kterém sice HTB nebude fungovat, ale co se dá dělat. (Pro
256kbit např nastavit download na 224kbit a upload jenom oříznout na 128.)
- Pokud nám na našem routeru běží ještě nejaká další služba, (např. samba
server :) a nastavíme datový tok na takovou službu na 100Mbit (viz. níže :),
je rozdíl mezi třídami tak velký, že si na to HTB začne právem stěžovat.
Prý to pak nefunguje dobře (s čímž bych já osobně mohl polemizovat, protože
ten skript, co je dole, funguje přesně dle mých představ i s touto chybou).
Pokud se tomuto problému chceme vyhnout, můžeme nepoužít parametr "default"
u defnice qdiscu a vynechat řádek uvozený komentářem "Intranet traffic", prý
to pak funguje líp.
Doufám, že jsem zatím zájemce o HTB příliš neodradil, tady už následuje
samotný script:
#!/bin/sh
#
# chkconfig: - 11 89
# description: Single -- purpose settings of tc to Orange & Green server
DEV=eth0
start () {
echo -n "Starting QoS tc.init: "
# Vytvorit hlavni disciplinu:
tc qdisc add dev $DEV root handle 1: htb default 2
# Internetovy provoz:
tc class add dev $DEV parent 1: classid 1:1 htb rate 224kbit ceil 224kbit
# Intranetovy traffic:
tc class add dev $DEV parent 1: classid 1:2 htb rate 100Mbit ceil 100Mbit
# Pro prodejce:
tc class add dev $DEV parent 1:1 classid 1:10 htb rate 112kbit ceil 192kbit
# Do Komarova:
tc class add dev $DEV parent 1:1 classid 1:11 htb rate 96kbit ceil 192kbit
# Zbytek:
tc class add dev $DEV parent 1:1 classid 1:12 htb rate 16kbit ceil 192kbit
# Vyberu a oznacim provoz
# !!! Pozor, vicekrat oznaceny packet si pamatuje posledni cislo !!!
# Vytvorime novou tabulku:
iptables -t mangle -N internet
# Cokoli z Internetu (tj. ne z adres 192.168.2.0/24) oznackujeme
iptables -t mangle -A internet -s ! 192.168.2.0/24 -j MARK --set-mark 3
# Tady se nenecte mast privatni adresou, 192.168.1.0/24 je pres
# IPsec a prislo pres internet!
iptables -t mangle -A internet -d 192.168.2.0/24 -s 192.168.1.1 -j MARK --set-mark 2
iptables -t mangle -A internet -d 192.168.2.0/24 -s 192.168.1.88 -j MARK --set-mark 2
# A toto jsou nasi dva prodejci, zdravime!
iptables -t mangle -A internet -s ! 192.168.2.0/24 -d 192.168.2.103 -j MARK --set-mark 1
iptables -t mangle -A internet -s ! 192.168.2.0/24 -d 192.168.2.102 -j MARK --set-mark 1
# Toto nevim, co znamena :)
iptables -t mangle -A POSTROUTING -o eth0 -j internet
# No a tady si nastavim, ktere ze to toky maji kam tect:
tc filter add dev $DEV parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
tc filter add dev $DEV parent 1:0 protocol ip prio 3 handle 2 fw classid 1:11
tc filter add dev $DEV parent 1:0 protocol ip prio 1 handle 3 fw classid 1:12
echo Ok.
}
stop () {
echo -n "Stopping QoS tc: "
# Smazat vse:
tc filter del dev $DEV prio 3
tc filter del dev $DEV prio 1
tc qdisc del dev $DEV root
iptables -t mangle -F
iptables -t mangle -X internet
echo Ok.
}
case "$1" in
start)
start
;;
stop)
stop
;;
*)
echo "Usage: tc.init {start|stop}"
RETVAL=1
esac
exit $RETVAL