Shorewall Traffic Shaping

Riassunto

  1. identificare l'interfaccia su quale si vuole fare shaping assegnarli banda in ingresso e in uscita , tcdevices
  2. taggare secondo delle regole il traffico attenzione che non è statefull, tcrules
  3. definire delle policy di shaping vero e proprio su ognuna delle classi definite nel punto precedente tcclasses

Ci sono due pagine per il traffic shaping su shorewall semplice e complesso

Complex traffic shaping/Control

Linux traffic shaping and control

Si possono usare tre algoritmi
HTB (Hierarchical Token Bucket), HFSC (Hierarchical Fair Service Curves) and SFQ (Stochastic Fairness Queuing)

  • SQF prova a tracciare i flussi tcp o udp e bilanciarne il carico.
  • HTB and HFSC definiscono un set di classi dove mettere il traffico. Si possono definire un minimo e un massimo per queste classi e definirne una priorità. HFCS permette d'impostare il massimo tempo in cui un pacchetto può stare in coda.

Per il traffico in ingresso si può usare Intermediate Functional Block (IFB), attenzione perchè può risoltare nelle code del provider.

Per il traffico in uscita bisogna assegnare il traffico a una classe. Ogni classe è associata esattamente con una interfaccia e ha un numero di attributi.

  1. PRIORITY usata per dare una preferenza da una classe a un'altra, è un numero che inizia da 1 in poi, 2 ha priorità più bassa di 1.
  2. RATE la banda minima che questa classe può avere quando il carico del traffio sale. Classi con valori di altra priorità, numeri più bassi, sono serviti perfino se ce ne sono altri che hanno banda garantita ma valori di priorità bassi. Quindi la priorità prevale sul rate.
  3. CEIL la massima larghezza di banda permessa da usare quando il link è libero.
  4. MARK il valore con cui vengono marcati i pacchetti, i valori vanno a 1 a 255 in shorewall oppure 1-16383 se è settato WIDE_TC_MARKS=Yes in shorewall.conf. Per assegnare i mark a differenti tipi di traffico si usano le entrie in /etc/shorewall/tcrules

Una classe per ogni interfaccia deve essere designata come default, in questa ci devono finire tutti i pacchetti che non sono stati marcati in tcrules.
NetFilter supporta il valore di mark per ogni connessione maggiori dettagli qui http://www.shorewall.net/PacketMarking.html

kernel

Serve almeno il kernel 2.4.8 nell'articolo ci sono le schermate per la configurazione dei kernel 2.6

Enable TC support in Shorewall

Set TC_ENABLED to "Internal" in /etc/shorewall/shorewall.conf. Setting TC_ENABLED=Yes dice a shorewall di consultare un file di configurazione esterno.
Setting CLEAR_TC parameter in /etc/shorewall/shorewall.conf to Yes e verificare che non ci siano errori al momento di fare lo shorewall restart.

Using builtin traffic shaping/control

Shorewall fornisce una serie di facility per la manipolazione del traffico e delle code.

  • si possono definire le classi usando lo stile shorewall orientato alle colonne nei file di configurazione.
  • per applicare le configurazioni bisogna fare il restart di shorewall.
  • assegnare il traffico a HTB o HFSC usando valori di TOS
  • assegnare i pacchetti di outgoing TCP ACK alle classi HTB o HFSC
  • assegnare traffico HTB e/o HFSC basandosi sul mark

Per definire la larghezza di banda, per devices o per le classi, si può usare

  • kbit : per kilobit
  • kbps : per kilobytes
  • mbit : per megabit
  • mbbps : per megabytes

i numeri senza indicazioni indicano i bytes. Non ci deve essere spazio tra il numero e l'unità di misura. I numeri possono essere solo interi non sono ammessi 0.5.

Per configurare correttamente il tuo devices bisogna trovare la media reale di upstream e downstream che si ha. Specialmente se si usa una connessione adsl, non fidarsi del provider ma eseguire dei test di velocità tramite siti apposta. speedtest.net

Passi di configurazione

Bisogna raggruppare il traffico in classi e marcarlo questo si fa tramite il file tcrules

/etc/shorewall/tcdevices

In questo file va il dispositivo su cui bisogna definire il traffic shaping definendogli banda di ingresso e di uscita.

  • INTERFACE va definita il nome dell'interfaccia in modo, non si possono usare wildcards oppure definire interfaccie alias, se l'interfaccia non è presente oppure è down shoreawall darà il seguente messaggio
WARNING: Device <device name> is not in the UP state -- traffic-shaping configuration skipped

Shorewall metterà un numero sequenziale per ogni interfaccia possiamo specificare manualmente il numero con questa sintassi
1:eth0.

i numeri sono espressi in esadecimale per questo dopo il 9 viene la A non il 10.
  • IN BANDWITH: banda in ingresso massima che può supportare l'intefaccia, così non si sta facendo shaping ma fissando solo un estremo superiore se dovesse arrivare più banda (dal provider per esempio di una adsl) quello che supera il valore massimo viene droppato. Se non si vuole impostare un limite basta mettere 0. Il vantaggio d'impostare questo valore sta nel fatto che si ha una adsl o una Cable Connectrion (che in America sa cosa vuol dire), si vuole evitare di generare code lato provider. Se non si vuole che il traffico venga droppato settare questo valore a 0 oppure a un valore maggiore di quello della propria banda. . Per trovare il valore ottimale si può eseguire un dowload e mentre si sta occupando la banda settando un valore ,del 20% o più, inferiore rispetto a quello dichiarato e provare i ping finchè funzionano bene e pian piano aumentare la banda. La Note non mi è chiara.
  • OUT-BANDWIDTH: come quella in ingresso anche questo è un limite superiore, se viene superata la larghezza il traffico viene droppato.
  • OPTIONS: lista separata da vircole. classify classificazione del traffico fatta da /etc/shorewall/tcrules o da /etc/shorewall/tcfilters, nessun valore di MARK viene associato con la classe di questa interfaccia (ma che vuol dire). hfc se specificato cambia il valore di default del tipo di code da Hierarchical Token Bucket (HTB) a Hierarchical Fair Service Curves (HFSC). ANDREBBERO APPROFONDITE QUANDO C'È MAGGIORE SENSIBILITÀ
  • REDIRECTED INTERFACES non ho capito che serve

Ecco un esempio

#INTERFACE    IN-BANDWITH      OUT-BANDWIDTH
ppp0           6000kbit         500kbit

Se facciamo un esempio con una normale adsl out le banda che viene mandata in uscita quindi ha valori molto bassi, mentre in e quella che arriva in ingresso quindi quando si scarica e ha valori alti.

Se si setta un valore che è inferiore a quello impostato nel file tcclasses il sistema allo shorewall restart segnalerà l'errore

Compiling /etc/shorewall/tcdevices...
Compiling /etc/shorewall/tcclasses...
   ERROR: CEIL (10000kbit) exceeds OUT-BANDWIDTH (8000kbit) : /etc/shorewall/tcclasses (line 2)

/etc/shorewall/tcclasses

Questo file permette di definire le classi che sono usate per splittare il traffico in uscita.

  • INTERFACE: le interfacce definite nel file /etc/shorewall/tcdevices si può specificare o il nome o il numero. Dopo segue un numero univoco che identifica classe.
eth0:1 
4:9

Si possono definire classi e sottoclassi , le sottoclassi possono borrow la banda del genitore.
interface:parent-class:class

I numero delle classi sono espressi sempre in forma esadecimale. Non è proprio chiaro questo concetto delle classi.
  • MARK il mark che viene applicato ai pacchetti il range è 1-255 (1-16383 if you set WIDE_TC_MARKS=Yes in shorewall.conf ) . I mark vanno definiti in tcrules , si può usare lo stesso mark per più interfacce. Bisogna specificare il simbolo "-" se il device ha la classify option in /etc/shorewall/tcdevices.
  • RATE la banda minima che una classe dovrebbe sempre avere quando il traffico è maggiore. Ricordarsi che le classi che hanno uguale o maggiore priorità sono servite perfino se questo danneggia la banda garantita di una classe inferiore. Se la somma delle RATE per tutte le classsi assegnati a una interfaccia eccede l'interfaccia OUT-BANDWIDTH quest'ultimo limite non viene rispettato. Quindi suppongo che è il minimo della banda in uscita. Quando si usa HFSC questa colonna può contenere 1, 2 o 3 pezzi di informazione separati da ":" . In aggiunta alla banda minima, leaf classes possono specificare criteri realtime. DMAX massimo delay in millisecondi oppure UMAX il pacchetto più largo aspettato nella classe. Maggiori dettagli sotto.
  • CEIL la banda massima che alla classe è permesso usare quando il link è libero. Sembra sempre la banda in uscita dall'interfaccia.
  • PRIORITY la priorità della classe, pacchetti con altra priorità (sono quelli con valori minore) vengono gestisti prima che pacchetti di bassa priorità.
  • OPTIONS: ce ne sono tante

/etc/shorewall/tcrules

Al contrario del file rules questo continua fino alla fine quindi match sempre l'ultima regola della lista, non è stateful quindi ogni pacchetto fa lo stesso percorso.
C'è tutta una spiegazione su come funzionano i socket molto interessante per chi non lo sa. Anche se chi non questo non penso possa fare operazioni di configurazioni di traffic shaping.

ACTION:

il valore che deve essere assegnato in caso che la regola matchi. Questo valore può essere opzionalmente seguito da un ":" e una “F”, “P” or "T" per designare la catena se è rispettivamente di FORWARD, PREROUTING or POSTROUTING. Se l'indicazione manca allora la catena usata per markare i pacchetti viene determinata come segue.
Se il SOURCE è $FW[:indirizzo] la regola è inserita nella catena di OUTPUT.
altrimenti la catena è determinata dal setting dell'opzione MARK_IN_FORWARD_CHAIN in shorewall.conf.
Se si usa l'opzione T la regola è applicata sia al traffico che viene routato attraverso il firewall che quello originato dal firewall stesso.

Normalmente il mark è applicato al pacchetto. Se si fa seguire il ":" con una "C" allora il mark è applicato alla connessione , che può essere combinato con "F", "P" or "T" per designare che la connessione dovrebbe essere marcata in una catena particolare "CF", "CP", "CT"

da qui in poi diventa abbastanza complicato e molto specifico.

SOURCE

può essere:

  • un'interfaccia , c'è anche un'altra possibilità che non mi è chiara
  • una lista di ip o di mac address , il firewall stesso non può essere incluso in questa lista esempi 192.168.1.0/24, 172.20.4.0/24
  • un'interfaccia seguita da un ":" seguita da una lista con virgole di ip o di mac address
  • $FW seguita ":" lista di ip mac address separati da virgole che appartengono al firewall

gli indirizzi mac sono preceduti da ~ e usano come separatore - Example: ~00-A0-C9-15-39-78

se il kernel lo permette si possono usare gli ip range

DEST

Interfacce o indirizzi ip

PROTO

- Protocol - Must be "tcp", "udp", "icmp", "ipp2p", "ipp2p:udp", "ipp2p:all" a number, or "all". "ipp2p"

+++

Salvo diversa indicazione, il contenuto di questa pagina è sotto licenza Creative Commons Attribution-ShareAlike 3.0 License