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). | + |