Traffic Shaping: come ti limito la banda con tc e iptables


Questa sera ho avuto l’esigenza di fare un po’ di traffic shaping casalingo per un piccolo progetto.

Dovevo limitare la banda globale (quella globale non quella del singolo file scaricato), del server ftp.

Soluzione al problema due comandi linux: tc e iptables.

Lo script che ci permetterà di fare tutto è questo:

# Change this to your link bandwidth
# (for cable modem, DSL links, etc. put the maximal bandwidth you can
# get, not the speed of a local Ethernet link)
REAL_BW='20Mbit'

# Change this to the bandwidth you want to allocate to FTP.
# We're talking about megabits, not megabytes, so 80Kbit is
# 10 Kilobytes/s
FTP_BW='600Kbit'

# Change this to your physical network device (or 'ppp0')
NIC='eth0'

# Change this to the ports you assigned for passive FTP
FTP_PORT_LOW="10000"
FTP_PORT_HIGH="20000"

tc qdisc add dev "$NIC" root handle 1: cbq \
bandwidth "$REAL_BW" avpkt 1000

tc class add dev "$NIC" parent 1: classid 1:1 cbq bandwidth "$REAL_BW" \
rate "$REAL_BW" maxburst 5 avpkt 1000

tc class add dev "$NIC" parent 1:1 classid 1:10 cbq \
bandwidth "$REAL_BW" rate "$FTP_BW" maxburst 5 avpkt 1000 bounded

tc qdisc add dev "$NIC" parent 1:10 sfq quantum 1514b

tc filter add dev "$NIC" parent 1: protocol ip handle 1 fw flowid 1:10

iptables -t mangle -A OUTPUT -p tcp --sport 20:21 -j MARK --set-mark 1

iptables -t mangle -A OUTPUT -p tcp \
--sport "$FTP_PORT_LOW":"$FTP_PORT_HIGH" -j MARK --set-mark 1

Nel mio caso specifico, ho forzato il mio server ftp (pureftpd) ad utilizzare come porte in uscita un range che va dalla porta 10000 alla 20000 (questo lo si fa lanciando pureftpd con il parametro -p 10000:20000 oppure modificando direttamente il file di configurazione),  e su questo range ho effettuato lo shaping di banda, bloccandola di fatto a 600Kbit/s, circa 80KByte/s.

Evito di commentare lo script in quanto è già stato fatto in inglese.

Tratto da: http://download.pureftpd.org/pub/pure-ftpd/doc/FAQ

Saluti

Matteo


2 risposte a “Traffic Shaping: come ti limito la banda con tc e iptables”

  1. Ciao Matteo
    Si, ottimo avere una traccia di ciò che si implementa di tanto in tanto.. ma..
    Vedo che comunque il traffico è stabilito sulla nic eth0.
    Avrei 2 domande, avendo un pool di indirizzi IP definiti come “alias”, vorrei limitare il traffico sia in inbound che outbound di un determinato IP, hai diea di come fare?
    Ipotizziamo di avere una nic con 100mb di linea con diversi IP configurati come alias e di stabilire una certa banda per ogni IP / cliente…
    Un idea?

  2. Linux, tramite tc, applica uno shaping per il traffico in uscita (Egress)
    e funziona bene.
    Per il traffico in ingresso (Ingress) puoi usare l’IMQ.

    http://www.linuximq.net/

    Devi scaricare e applicare la pach imq al kernel, ricompilare il tutto.

    Assicuro che funziona.
    IMQ usa il tc per shepare l’ingresso.

    Ciao

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Per postare il commento, risolvi il quesito sottostante * Time limit is exhausted. Please reload CAPTCHA.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.