This shows you the differences between two versions of the page.
|
saisp:labs:11:contents:09 [2014/05/18 14:00] mihai.carabas created |
saisp:labs:11:contents:09 [2016/05/23 17:35] (current) alexandru.carp [09. [BONUS - 10p] tcng (traffic control next generation)] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ==== 09. [BONUS] HTB - u32 hashing tables ==== | + | ==== 09. [BONUS - 10p] tcng (traffic control next generation) ==== |
| - | Generarea de mână a filtrelor folosind ''hash tables'' este anevoioasă și NU se recomandă. Vom folosi un program C, disponibil [[http://vcalinus.gemenii.ro/prefixtree.c||aici]]. | + | Utilitarul ''tc'' oferă un control foarte bun asupra parametrilor QoS. Dar, din păcate, sintaxa este foarte complexă, greu de reținut și puțin lizibilă. ''tcng'' este un utilitar cu o sintaxă mult mai expresivă, asemănătoare limbajului C. Folosind aceasta sintaxă, el poate genera comenzile ''tc'' echivalente. |
| - | Descărcați și compilați programul ''prefixtree'':<code bash> | + | Pe stația ''gateway'' descărcați și instalați utilitarul ''tcng'':<code> |
| - | root@gateway:~# wget http://vcalinus.gemenii.ro/prefixtree.c | + | root@gateway:~# wget http://archive.debian.org/debian/pool/main/t/tcng/tcng_10b-3_amd64.deb |
| - | root@gateway:~# make prefixtree | + | root@gateway:~# dpkg -i tcng_10b-3_amd64.deb |
| - | cc prefixtree.c -o prefixtree | + | </code> |
| - | root@gateway:~# ./prefixtree | + | |
| - | IPv4 u32 hash filter generator - (C) 2006 Calin Velea | + | |
| - | Syntax: prefixtree {prefix.in} {u32filters.out} {interface} {src/dst} [batch] | + | Un fișier ''tcng'' are următoarea sintaxă simplificată:<code bash> |
| + | dev INTERFATA | ||
| + | { | ||
| + | QDISC () | ||
| + | { | ||
| + | class ( ACTIUNE ) FILTRU ; | ||
| + | class ( ACTIUNE ) FILTRU ; | ||
| + | ... | ||
| + | class ( ACTIUNE ) FILTRU ; | ||
| + | } | ||
| + | } | ||
| </code> | </code> | ||
| - | Vom scrie fișierul ''prefix.in'' care trebuie să conțină pe câte o linie adresa IP pentru care vrem să ne genereze filtrele și ''classid''-ul asociat. | ||
| - | Modificați scriptul de la exercițiul [[saisp:labs:11:contents:07|]] astfel încât să introducă perechea ''adresaIP:classid'' în fișierul ''prefix.in'' în loc să adauge filtrul asociat. Adăugați și masca adresei IP (''/32''). | + | Ne propunem să creăm un fișier ''tcng'', echivalent configurațiilor HTB de la [[saisp:labs:11:contents:05|]]: |
| - | <solution -hidden> | + | * Creati un fisier numit ''eth0_htb.tc''. |
| - | <file bash htbht.sh> | + | * Specificați interfața ''eth0'' în câmpul ''dev''. |
| - | tc qdisc del dev eth0 root | + | * Specificați ''QDISC''-ul ''htb''. |
| - | tc qdisc add dev eth0 root handle 1: htb | + | * Pentru fiecare clasă, specificați acțiunea ''rate xMbps'', unde ''x'' este lățimea de bandă corespunzătoare. |
| - | tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit burst 128k | + | * Pentru fiecare clasă, specificați filtrul în formatul ''udp_port == ABCD'', respectiv ''tcp_port == ABCD'', unde ''ABCD'' este portul corespunzător. |
| + | <code> | ||
| + | dev eth0 | ||
| + | { | ||
| + | htb () | ||
| + | { | ||
| + | class ( rate 1Mbps ) if udp_dport == 8000 ; | ||
| + | class ( rate 40Mbps ) if udp_dport == 6000 ; | ||
| + | class ( rate 5Mbps ) if tcp_dport == 21 ; | ||
| + | class ( rate 3Mbps ) if tcp_dport == 80 ; | ||
| + | } | ||
| + | } | ||
| + | </code> | ||
| - | > prefix.in | + | Rulați ''tcng'' pentru a obține comenzile echivalente ''tc'':<code bash> |
| - | + | tcng eth0_htb.tc | |
| - | classid=2 | + | |
| - | for j in $(seq 0 15); | + | |
| - | do | + | |
| - | for i in $(seq 1 254); | + | |
| - | do | + | |
| - | classid=$(($classid + 1)) | + | |
| - | tc class add dev eth0 parent 1:1 classid 1:$classid htb rate 100mbit burst 128k | + | |
| - | echo 10.0.$j.$i/32 $classid >> prefix.in | + | |
| - | done | + | |
| - | done | + | |
| - | + | ||
| - | classid=$(($classid + 1)) | + | |
| - | tc class add dev eth0 parent 1:1 classid 1:$classid htb rate 100mbit burst 128k | + | |
| - | echo 192.168.1.1/32 $classid >> prefix.in | + | |
| - | + | ||
| - | classid=$(($classid + 1)) | + | |
| - | tc class add dev eth0 parent 1:1 classid 1:$classid htb rate 100mbit burst 128k | + | |
| - | echo 192.168.1.2/32 $classid >> prefix.in | + | |
| - | </file> | + | |
| - | </solution> | + | |
| - | + | ||
| - | Rulăm comanda ''prefixtree'' pe fișierul generat:<code bash> | + | |
| - | root@gateway:~# ./prefixtree prefix.in filters.out eth0 dst | + | |
| - | lines parsed: 4066 | + | |
| - | total hashtables: 4 | + | |
| </code> | </code> | ||
| - | Observați conținutul fișierului ''filters.out''. Aplicăm filtrele generate:<code bash> | + | Inspectați comenzile ''tc'' generate și observați asemănările cu comenzile introduse manual. |
| - | root@gateway:~# chmod +x filters.out | + | |
| - | root@gateway:~# ./filters.out | + | |
| - | </code> | + | |
| - | + | ||
| - | Testați din nou folosind ''iperf''. Obervați faptul că stația ''gateway'', cea care face limitările, nu mai intră în load (thread-urile kernel ''ksoftirqd'' nu CPU usage foarte mic). | + | |