Klasifikace provozu site

Ivan Novotny, 99231@mail.muni.cz


Obsah


Uvod

Klasifikaci provozu site rozumime doplneni sluzeb standardnich siti o moznost, jakym zpusobem ma sit resit problem sveho velkeho vytizeni. Sit nam dokaze hodne zatizit jedina sluzba (napriklad FTP). Pote nam jiz budou velice spatne fungovat ostatni sluzby, protoze pro ne zustane pouze kousek kapacity site.

Diky klasifikaci provozu site muzeme nastavit ruznym sluzbam ruzne priority - napr. ssh by melo mit vyssi prioritu nez ostatni sitove sluzby. Dale muzeme podle ruznych pravidel nastavovat minimalni (garantovane) a maximalni rychlosti ruznym sluzbam, ale i jednotlivym stanicim na lokalni siti. Diky omezovani sirky pasma mohou dnesni ISP (Internet Service Provideri) nastavovat svym klientum ruzne sirky pasma, mohou nastavit, aby jednu linku sdilelo vice uzivatelu, a tim ji efektivne vyuzili.


Fronty paketu

K usmernovani sitoveho provozu se pouzivaji tyto fronty paketu (qdiscs) :

Tyto fronty jsou az na vystupu ze zarizeni, tj. je zde problem omezovat rychlost na vstupu.


Omezování sirky pasma pomoci tc & HTB

HTB je shaper s podporou trid. Diky nemu muzeme vytvorit stromovou strukturu - tj. pro kazdy pocitac nebo sluzbu pouzijeme list stromu. Na tyto listy muzeme zavesit nekterou z predeslych front, pokud zadnou nezavesime, tak se pouzije standardni fronta FIFO.

Priklad vytvoreni htb stromu za pomoci tc

#napred smazeme koren byvaleho stromu
tc qdisc del dev eth0 root

#vytvorime novy koren 
tc qdisc add dev eth0 root handle 1:0 htb

#nastavime rychlost pro koren tohoto stromu
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 1Mbit

#Vytvorime syny, kteremu nastavime minimalni (garantovanou) rychlost, maximalni, a prioritu paketu
tc qdisc add dev eth0 parent 1:1 classid 1:10 htb rate 128Kbit ceil 256Kbit prio 3
tc qdisc add dev eth0 parent 1:1 classid 1:11 htb rate 128Kbit ceil 256Kbit prio 3

#trida s vyssi prioritou (napr. pro ssh apod.)
tc qdisc add dev eth0 parent 1:1 classid 1:12 htb rate 128Kbit prio 1

#na tyto tridy povesime SFQ
#perturb je hodnota v sekundach, po ktere dochazi k nejakemu prepocitavani
tc qdisc add dev eth0 parent 1:10 handle 10:0 sfq perturb 10
tc qdisc add dev eth0 parent 1:11 handle 11:0 sfq perturb 10
tc qdisc add dev eth0 parent 1:12 handle 12:0 sfq perturb 10

Nyni mame vytvoreny htb strom, a potrebujeme nastavit pravidla, ktera jednotlive pakety priradi do jednotlivych listu ve strome. Toto delame pomoci univerzalniho nastroje U32 matcher. Dokaze pakety srovnavat dle zakladnich veci jako jsou cilova a zdrojova adresa, ale nabizi mnoho dalsich moznosti - diky nemu muzeme porovnavat hlavicku paketu doslova po bitech.

#nyni nastavime, ktere sluzby poslat do ktereho listu stromu
#u32match dle dst ip
tc filter add dev eth0 parent 1:0 protocol ip u32 match ip dst 10.0.0.10 flowid 1:10

#dle src a dst ip
tc filter add dev eth0 parent 1:0 protocol ip u32 \
match ip dst 10.0.0.11 match ip src 147.251.205.1 flowid 1:11

#dle ciloveho portu
tc filter add dev eth0 parent 1:0 protocol ip u32 match tcp dst 22 0xffff flowid 1:12

V mnoha pripadech je lepsi si paket napred oznacit pomoci firewallu a pote pouze matchovat toto oznaceni.

iptables -t mangle -A FORWARD -p tcp -d 10.0.0.10 -j MARK --set-mark 10
tc filter add dev eth0 parent 1:0 protocol ip handle 100 fw flowid 1:10

Omezovani sirky pasma pomoci IMQ

IMQ - Intermediate Queueing Device - je virtualni zarizeni, diky kteremu muzeme omezovat traffic i na vstupnim zarizeni. IMQ muzeme nainstalovat podle tohoto navodu.
IMQ je virtualni zarizeni, tudiz s nim pracujeme obdobne, jako s ostatnimi zarizenimi :

modprobe IMQ

#napred toto zarizeni vypneme - zda se mi, ze zde je nejaky bug, diky kteremu po vice imq0 up za sebou dochazi ke zduplikovani IMQ stromu
ifconfig imq0 down 
ifconfig imq0 up

Dale musime presmerovat vstupni traffic ze zarizeni do tohoto IMQ zarizeni jeste pred jeho jakymkoliv zpracovanim

iptables -t mangle -A PREROUTING -j IMQ

Nyni nam jiz nic nebrani udelat IMQ strom, ne nepodobny htb stromu

tc qdisc del dev imq0 root
tc qdisc add dev imq0 root handle 1:0 htb
tc class add dev imq0 parent 1:0 classid 1:1 htb rate 1Mbit
...

IMQ je velice uzitecna vec z ceskych luhu a haju, ale ma jeste nekolik bugu a neni extra moc stabilni - snad proto se zatim nedostala do oficialniho jadra.


Dale o shapingu

Jednim ze zpusobu, jak resit traffic shaping na nejakem routeru, je povesit na kazdy interface na vystup HTB a na vstup IMQ - timto dosahneme omezeni trafficu v obou smerech.

Efektivni je zaroven pouzivat pro zarazovani do htb trid firewall, diky kteremu muzeme zajistit pakety, ktere nepatri do zadne tridy :

#napred oznackuju kazdy paket, ktery router forwarduje nejakym defaultnim cislem
iptables -t mangle -A FORWARD -j MARK --set-mark 1000

pro kazde zarizeni
{
	VYTVORENI_HTB_STROMU
	VYTVORENI_IMQ_STROMU
}

#pote oznackuju pakety podle prislusnosti k jednotlivym tridam
iptables -t mangle -A FORWARD -p tcp -d 10.0.0.10 -j MARK --set-mark 10
...

#a pakety, ktere nepadly do zadne tridy zahodim
iptables -t mangle -A POSTROUTING -t mangle --match mark --mark 1000 -j REJECT

Pokud se vam nelibi vytvareni htb a imq stromu rucne, je zde mozno pouzit programy :


Rozdeleni zateze na vice rozhrani

Pokud v kernelu povolime tzv. bonding - (CONFIG_BONDING=y) - mame moznost sloucit vice fyzickych rozhrani do jednoho virtualniho (napr. bond0). Na toto virtualni zarizeni muzeme jiz povesit htb stromy, popr. dalsi fronty paketu. Je mnohem efektivnejsi mit zarizeni sloucena do jednoho a zde rozdelovat rychlost, nez nastavovat rychlost na kazdem zvlast. Vice o jeho nastaveni najdeme v $kernel_directory/Documentation/networking/bonding.txt


Testovani provozu

Pro testovani provozu se da pouzit znamy program iptraf.


Odkazy

http://www.root.cz/clanky/htb-jemny-uvod/
http://luxik.cdi.cz/~devik/qos/htb/
Polske howto, jak rozjet IMQ (step by step :))