HTB - tool HowTo


Trafic shaping cu Kernel 2.4.20, HTB-tools si slackware linux 8.1

      Hierarchical Token Bucket ( HTB ) inlocuieste cu succes Class Based Queueing ( CBQ ) datorita modului de operare precis si usor de inteles pentru toata lumea. Diferenta fata de CBQ este ca banda se aloca unei ( sau mai multe ) clase iar in momentul in care banda alocata clasei este depasita ea poate imprumuta ( temporar ) banda dintr-o alta clasa unde nu este folosita la maxim sau deloc. In plus, fata de CBQ, se pot aloca unul sau mai multi clienti unei clase. Toate clasele si toti clientii se stabilesc intr-un fisier de configurare.

       Printr-o serie de programe ( HTB_Tool ) se poate simplifica configurarea, monitorizarea operatiunii de alocare de banda. Primul program numit q_parser citeste un fisier de configurare ( in fisier sunt stabilite clasele, clientii, limitarile de banda ) si genereaza un script pentru setarile HTB; al doilea program q_show afiseaza in timp real situatia traficului si a benzii alocate pentru fiecare clasa/client conform fisierului de configurare.


// Begin disclaimer // Nu sunt responsabil de felul in care folositi aceasta informatie. Este descrierea pe care am folosit-o eu si functioneaza in conditiile descrise de mine. Daca calculatorul pe care instalati & configurati htb-utils o ia razna sau se defecteaza - nu sunt responsabil pentru acesta. // End disclaimer //


    Ca sa intelegeti mai bine cum functioneaza, precum si pasii care trebuie urmati ca sa folositi cu success HTB-tool, o sa descriu un exemplu real folosit de mine. Am folosit o banda de 256kbps pe care am impartit-o la 4 clienti ( minim 48kbps - maxim 64kbps /client).

      1. Pentru kernel 2.4.20 ( este deja patchuit pentru suport HTB ) se vor selecta urmatoarele optiuni pentru HTB:

 
#
# QoS and/or fair queueing
#
CONFIG_NET_SCHED=y CONFIG_NET_SCH_CBQ=m
CONFIG_NET_SCH_HTB=m
CONFIG_NET_SCH_CSZ=m
CONFIG_NET_SCH_PRIO=m
CONFIG_NET_SCH_RED=m
CONFIG_NET_SCH_SFQ=m
CONFIG_NET_SCH_TEQL=m
CONFIG_NET_SCH_TBF=m
CONFIG_NET_SCH_GRED=m
CONFIG_NET_SCH_DSMARK=m
CONFIG_NET_SCH_INGRESS=m
CONFIG_NET_QOS=y
CONFIG_NET_ESTIMATOR=y
CONFIG_NET_CLS=y
CONFIG_NET_CLS_TCINDEX=m
CONFIG_NET_CLS_ROUTE4=m
CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=m
CONFIG_NET_CLS_U32=m
CONFIG_NET_CLS_RSVP=m
CONFIG_NET_CLS_RSVP6=m
CONFIG_NET_CLS_POLICE=y


      2. Binarul tc din pachetul htb3 trebuie copiat in /sbin ( htb3.6-020525.tgz ).

      3. htb_util-0.2.3 ( http://sgi.rdscv.ro/~ionuts/htb-tools ).
        - se dezarhiveaza si se compileaza sursa:

 
root@slackware:/home/arny# tar zxvf htb_util-0.2.3.tar.gz
root@slackware:/home/arny# cd htb_util-0.2.3
root@slackware:/home/arny/htb_util-0.2.3# make

 

        - in urma compilarii vor rezulta binarele q_parser si q_show.

      4. Se editeaza fisierul de configurare. ( un exemplu este in docs/simple.cfg, tot acolo gasiti si o descriere referitor la cum arata si la ce se refera fiecare element din simple.cfg.)

--- asa arata fisierul de configurare clienti48-64.cfg folosit de mine.
      ( fisierul de configurare poate fi numit dupa dorinta, eu am folosit acest nume ca sa stiu ca in fisier se afla clientii cu banda minim garantata 48kps cu urcare max. 64kps; in cazul in care folositi htb.init este important numele fisierului ).

// PRECIZARI // Formatul fisierului de configurare este asemanator cu formatul fisierelor de configurare ale bind-ului. Consumatorii de banda sunt impartiti in clase. Aceste clase nu pot partaja banda intre ele. Membrii unei clase (clientii) pot partaja aceeasi banda in functie de parametrii specificati in fisierul de configurare. O clasa poate contine unul sau mai multi clienti. O clasa cu caracter special este clasa default care specifica latimea de banda alocata celor care nu sunt inclusi in nici o clasa. Rata de transfer se specifica in kbit. Inceputul rindurilor cu # se considera comentariu. // PRECIZARI //

------------- // begin config file \\ -------------

#Fisier de configurare pentru o banda de 256kps impartita la 4 clienti cu minim garantat 48kps cu urcare pina la 64kps.
#se defineste clasa, respectiv canalul mare de 256kps.
class class_1 {
            bandwidth 192;
            limit 256;
            burst 2;
            priority 1;

##### clientii cu configurarile aferente ( valabil ptr toti cei 4 clienti ):
# bandwidth 48 - minim garantat;
# limit 64 - maxim pina unde poate urca;
# burst 2 - nr maxim de kb trimisi odata ( daca nu setati cum trebuie burst-ul atunci s-ar putea ca limitarile/garantarile sa nu #iasa chiar cum trebuie; dupa htb-manual "...for 10Mbit on plain i386 you need burst 12kb" );
# priority 1 - prioritatea clientului in clasa;
# dst - destinatia catre o clasa de IP sau un singur IP;
# - in cazul unui singur IP, reprezentarea arata in felul urmator: 192.168.1.10/32;
# -- daca se doreste limitarea pe un port anume la un singur IP: 192.168.1.10/32 80; - limiteza traficul pe portul 80 (http)
# --- daca se doreste limitarea pe un port anume la o clasa de IP: 192.168.1.0/24 21; - limiteza traficul pe portul 21 (ftp)
# ---- se mai poate folosi si src ( adica sursa traficului ) la care reprezentarea este asemanatoare cu dst. #####


               client client_1 {
                  bandwidth 48;
                  limit 64;
                  burst 2;
                  priority 1;
                     dst {
                        192.168.1.0/24;
                           };
                 };

               client client_2 {
                  bandwidth 48;
                  limit 64;
                  burst 2;
                  priority 1;
                     dst {
                        192.168.2.0/24;
                           };
                 };

               client client_3 {
                  bandwidth 48;
                  limit 64;
                  burst 2;
                  priority 1;
                     dst {
                        192.168.3.0/24;
                           };
                 };

               client client_4 {
                  bandwidth 48;
                  limit 64;
                  burst 2;
                  priority 1;
                     dst {
                        192.168.4.0/24;
                           };
                 };
      };

##### latimea de banda a clasei default ( ce nu face parte din nici una din clasele definite anterior ) #####

class default { bandwidth 8; };

------------- \\ end config file // -------------

 

      5. Fisierul de configurare se poate salva unde doriti si va este mai usor de lucrat cu el. Eu am preferat sa il salvez in acelas director unde se afla binarul q_parser.

      6. Se intra in directorul unde se afla q_parser si se genereaza scriptul cu comanda:
            ./q_parser wlan0 192 256 clienti48-64.cfg > script.sh
            - se schimba atributul scriptului in executabil ( chmod +x script.sh ) si se muta in /etc/rc.d;
            - se editeaza /etc/rc.d/rc.local in care se trece urmatoarea linie:
                      /etc/rc.d/script.sh         # la bootare continutul fisierului stabileste limitarile/garantarile.

      7. In acest moment limitarile sunt stabilite si fiecare client foloseste banda alocata. Cu ajutorul binarului q_show se poate urmari, in timp real, traficul & ocuparea benzii pentru fiecare client. Se lanseaza comanda din directorul unde ati compilat htb-tool:
./q_show -i wlan0 -f clienti48-64.cfg

      - veti obtine pe consola traficul & ocuparea de banda:

class_1     224.80   2   192  256
client_1     62.25   1   48   64
client_2     51.05   1   48   64
client_3     48.25   1   48   64
client_4     63.25   1   48   64
_default_     0      0    0    0

Pentru cei ce nu inteleg descrierea facuta, sau nu inteleg anumite lucruri, ii invit sa citeasca :
Linux Advanced Routing & Traffic Control HOWTO http://www.lartc.org sau http://www.docum.org/;
O prezentare profesionala completa in limba engleza Implementing Real Time Packet Forwading Policies using HTB.


Documentul acesta a fost preluat dupa documentatia realizata de arny