Traffic Shaping con cbq.init

From RVM Wiki
Jump to navigation Jump to search

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