Traffic Shaping con cbq.init
E' possibile limitare l'uso della banda utilizzando il paccheto "shaper"
ATTENZIONE: E' POSSIBILE LIMITARE SOLO IL TRAFFICO IN USCITA DA UN'INTERFACCIA. SE SI VUOL LIMITARE IL TRAFFICO IN DOWNLOAD, LIMITARE L'INTERFACCIA INTERNA OD USARE ALTRI METODI (ad esempio Limitare la banda in download con squid)
ATTENZIONE: IN DEBIAN LENNY IL PACCHETTO shaper NON È PIÙ PRESENTE. È STATO BACKPORTATO NEL REPOSITORY RVM
ATTENZIONE, VEDERE LO SCRIPT DI ESEMPIO:
Si suppone di operare su un gateway con 2 schede di rete:
+---------+ 192.168.1.1
INTERNET -----eth1-| linux |-eth0------*-[LAN]
+---------+
Installazione del pacchetto
sudo apt-get install shaper
Misurazione della banda effettiva
Prima di tutto bisogna misurare la banda effettiva di downstream/upstream.
Assicurarsi che non ci sia nessun altro tipo di traffico sulla rete. Eventualmente stoppare demoni come postfix o apache.
Monitorare il traffico sull'interfaccia WAN con iftop:
iftop -Nn -i eth1
Creare un file di circa 10 Mega con dd,e provare a copiarlo via scp (attenzione a non aver impostata la compressione esplicitmente nel file .ssh/config):
scp 10mega gabriele.vivinetto@support.rvmgroup.it:/tmp
Verificare la banda di upload in iftop.
Naturalmente la banda in downstream della connessione di destinazione deve essere superiore a quella di upstream della connessione sorgente, in modo da saturarla.
Fare l'inverso (copiare un file da una macchina verso la propria) per misurare il downstream (o scaricare un file da un sito).
Supponiamo che la banda misurata di upload sia di circa 512kb/s ed il downstream sia di 1280Kb/s
Limitazione della banda di upload per un servizio
Se vogliamo limitare, ad esempio, la banda usata per l'invio della posta (porta 25), possiamo procedere come segue:
Creazione del file di configurazione di prova
Lo shaper legge tutti i files in /etc/shaper che si chiamano
cbq-classid.nome
classid è un valore in esadecimale, che per comodità si sceglie uguale alla banda limitata.
Creare il file /etc/shaper/cbq-128.eth1_smtp:
cat | sudo tee /etc/shaper/cbq-128.eth1_smtp > /dev/null <<EOFile DEVICE=eth1,100Mbit,10Mbit # Operiamo sul traffico in uscita dalla eth1. Possiamo modificare solo il traffico IN USCITA da un'interfaccia # La banda fisica è di 100Mbit/s, utiliziamo una soglia di monitoraggio di 10Mbit/s RATE=128Kbit # Limitiamo la banda utilizzata a 128kbit WEIGHT=10Kbit # utilizziamo una soglia di monitoraggio di 10 kbit PRIO=5 # non serve in questo caso RULE=:22 # questi parametri vanno applicati al traffico con destinazione porta 22 (ssh) EOFile
Con queste regola, possiamo testare il tutto con scp.
Avvio dello shaper
Attiviamo le regole:
sudo /etc/init.d/shaper start invalidate
Potrebbe verificarsi l'errore:
Starting CBQ traffic shaping: RTNETLINK answers: No such file or directory shaper.
E' ignorabile.
Verifica della presenza delle regole
Elenchiamo le regole:
sudo /etc/init.d/shaper list ... ### eth1: queueing disciplines qdisc cbq 1: rate 100000Kbit (bounded,isolated) prio no-transmit qdisc tbf 128: rate 128000bit burst 10Kb lat 312.5ms ### eth1: traffic classes class cbq 1: root rate 100000Kbit (bounded,isolated) prio no-transmit class cbq 1:128 parent 1: leaf 128: rate 128000bit (bounded) prio 5 class tbf 128:1 parent 128: ### eth1: filtering rules filter parent 1: protocol ip pref 100 u32 filter parent 1: protocol ip pref 100 u32 fh 800: ht divisor 1 filter parent 1: protocol ip pref 100 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:128 match 00000016/0000ffff at 20 ...
Quello che ci interessa è questo:
class cbq 1:128 parent 1: leaf 128: rate 128000bit (bounded) prio 5
Il rate limit del flusso 1:128 è a 128kbit
e questo:
filter parent 1: protocol ip pref 100 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:128 match 00000016/0000ffff at 20
Il flusso 1:128 è quello relativo alla porta 22 = 16 HEX
Verifica della limitazione
Copiamo ancora il file da 10 Mb, e questa volta iftop dovrebbe mostrare che la velocità di upload massima è di 256kbit/sec.
Se si vuole testare un'altra porta in particolare, si può usare netcat trasferendo un file attraverso una porta (esempio 25).
Sulla macchina che deve ricevere:
sudo nc -l -p 25 | cat > /tmp/10mega
Servono i privilegi di root perchè la porta e < 1024. Naturalmente non ci deve essere nessuna altro programma che usa la porta 25 (postfix stoppato)
Sulla macchina che trasmette:
cat 10mega | nc -w 3 macchina.che.riceve 25
Verificare con iftop la banda usata.
Applicazione della configurazione definitiva
Cambiamo ora la porta 22 in quella 25, per l'smtp:
cat | sudo tee /etc/shaper/cbq-128.eth1_smtp > /dev/null <<EOFile DEVICE=eth1,100Mbit,10Mbit RATE=128Kbit WEIGHT=10Kbit PRIO=5 RULE=:25 EOFile
Stoppiamo e riavviamo lo shaper:
/etc/init.d/shaper stop; /etc/init.d/shaper start
Formato delle Regole
Il formato delle regole è riportato nel file
/etc/init.d/shaper
Per bervità:
- Tutto il traffico in uscita dal server imap locale (notare la virgola):
RULE=:143,
- Tutto il traffico in uscita verso un server smtp remoto
RULE=:25
Riferimenti
- /usr/share/doc/shaper/README.Debian
- /usr/share/doc/shaper/README.shaper.gz