Avanti Indietro Indice

12. Esempi

Seguono una serie di esempi, alcuni si possono trovare su internet agli indirizzi presenti nel capitolo "Risorse".

12.1 Esempio 1 - CBQ e filtro route

Questo esempio basato sull'example 1 reperibile all'indirizzo http://qos.ittc.ukans.edu/howto/node47.html crea due classi (1:2 e 1:3) derivate dalla classe root (1:1) aventi rispettivamente una bandwidth di 3Mbit, 7Mbit. I pacchetti sono smistati dal filtro route in base alle rotte specificate.

#!/bin/bash

#
#                            ____ 
#                           /1:1 \
#                           \____/
#              3Mbit prio 3 /    \ 7Mbit prio 7
#                        __/_   __\_  
#                       /1:2 \ /1:3 \
#                       \____/ \____/



# -------------------------------------------------------------------------
# Creazione di una qdisc cbq basata su classi.
# La bandwidth a disposizione dell'interfaccia è di 10 Mbit (128k)
# Dimensione media dei pacchetti (avpkt) è di 1000 byte (caso ethernet)  
# -------------------------------------------------------------------------

tc qdisc add dev eth0 root handle 1: cbq bandwidth 10Mbit cell 8 avpkt 1000 \
mpu 64

# -------------------------------------------------------------------------
# Creazione della prima classe ROOT.  
# bandwidth assegnata 10Mbit, priorità della classe 8. 
# allot nel caso ethernet è da impostare a 1514 (allot=MTU+MAC) 
# weight è da scegliere proporzionale a rate, in genere 1/10 di rate.
# -------------------------------------------------------------------------

tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 10Mbit rate 10Mbit \
allot 1514 cell 8 weight 1Mbit prio 8 maxburst 20 avpkt 1000

# -------------------------------------------------------------------------
# Creazione della prima classe discendente di ROOT. 
# bandwidth assegnata 3Mbit, priorità della classe 3. 
# id che permette di identificare la classe: 1:2.
# ------------------------------------------------------------------------- 
tc class add dev eth0 parent 1:1 classid 1:2 cbq bandwidth 10Mbit rate 3Mbit \
allot 1514 cell 8 weight 100Kbit prio 3 maxburst 20 avpkt 1000 

# -------------------------------------------------------------------------
# Creazione della seconda classe discendente di ROOT. 
# bandwidth assegnata 8Mbit, priorità della classe 7. 
# id che permette di identificare la classe: 1:3.
# ------------------------------------------------------------------------- 
tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 10Mbit rate 7Mbit \
allot 1514 cell 8 weight 800Kbit prio 7 maxburst 20 avpkt 1000 split 1:0

# ------------------------------------------------------------------------- 
# Associamo al nodo root il classificatore route 
# ------------------------------------------------------------------------- 
tc filter add dev eth0 parent 1:0 protocol ip prio 100 route

# ------------------------------------------------------------------------- 
# Impostiamo una rotta che invii i pacchetti destinati all'indirizzo
# 129.237.125.146 attraverso 129.237.125.149 utilizzando la classe 
# 1:2 a cui abbiamo assegnato una bandwidth di 3Mbit. 
# ------------------------------------------------------------------------- 
ip route add 129.237.125.146 via 129.237.125.149 dev eth0 realm 10

# ------------------------------------------------------------------------- 
# Impostiamo una rotta che invii i pacchetti destinati all'indirizzo
# 129.237.125.148 attraverso 129.237.125.149 utilizzando la classe 
# 1:3 a cui abbiamo assegnato una bandwidth di 7Mbit. 
# ------------------------------------------------------------------------- 
ip route add 129.237.125.148 via 129.237.125.149 dev eth0 realm 20 

# -------------------------------------------------------------------------
# Creiamo i filtri che in base ai valori realm assegnati (10 e 20) 
# smistino i pacchetti alle classi desiderate
# -------------------------------------------------------------------------
tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 10 classid 1:2
tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 20 classid 1:3 

12.2 Esempio 2 - CBQ e filtro u32

In questo caso si suppone di avere un firewall/router che riceve i pacchetti e li smista in base all'indirizzo di destinazione verso l'ufficio (OFFICE) a cui viene messa a disposizione una banda di 2Mbit, oppure verso gli altri computer server (SERVERS) presenti a cui viene messa a disposizione una banda totale di 8Mbit. La banda totale a disposizione è di 10Mbit.


#!/bin/bash

# -------------------------------------------------------------------------
# Definizione delle variabili
# -------------------------------------------------------------------------
ETH=eth0
ROOT=10:1

# ------------------------------------------------------------------------- 
# Rete di server
# ------------------------------------------------------------------------- 
SERVERS=10:2
SERVERS_RATE=8Mbit
SERVERS_LAN=150.150.10.0/16

# ------------------------------------------------------------------------- 
# Computer presente nell'ufficio
# ------------------------------------------------------------------------- 
OFFICE=10:3
OFFICE_RATE=2Mbit
OFFICE_PC=150.150.10.2

# -------------------------------------------------------------------------
# Creazione di una qdisc cbq basata su classi.
# La bandwidth a disposizione dell'interfaccia è di 10 Mbit (128k)
# Dimensione media dei pacchetti (avpkt) è di 1000 byte (caso ethernet)  
# -------------------------------------------------------------------------
tc qdisc add dev $ETH root handle 10: cbq bandwidth 10Mbit avpkt 1000

# -------------------------------------------------------------------------
# Creazione della prima classe ROOT.  
# bandwidth assegnata 10Mbit, priorità della classe 8. 
# allot nel caso ethernet è da impostare a 1514 (allot=MTU+MAC) 
# weight è da scegliere proporzionale a rate, in genere 1/10 di rate.
# -------------------------------------------------------------------------
tc class add dev $ETH parent 10: classid $ROOT cbq bandwidth 10Mbit \
   rate 10Mbit allot 1514 weight 1Mbit prio 8 maxburst 20 avpkt 1000

# -------------------------------------------------------------------------
# Creazione della prima classe discendente di ROOT, denominata SERVERS.  
# bandwidth assegnata 8Mbit, priorità della classe 5. 
# La classe è "bounded" ossia non può eccedere il rate assegnato.
# -------------------------------------------------------------------------
tc class add dev $ETH parent $ROOT classid $SERVERS cbq bandwidth 10Mbit \
   rate $SERVERS_RATE allot 1514 weight 400kbit prio 5 maxburst 20 avpkt 1000 bounded

# -------------------------------------------------------------------------
# Creazione della seconda classe discendente di ROOT, denominata OFFICE.  
# bandwidth assegnata 8Mbit, priorità della classe 5. 
# La classe è "bounded" ossia non può eccedere il rate assegnato.
# -------------------------------------------------------------------------
tc class add dev $ETH parent $ROOT classid $OFFICE cbq bandwidth 10Mbit \
   rate $OFFICE_RATE allot 1514 weight 100kbit prio 5 maxburst 20 avpkt 1000 bounded

# -------------------------------------------------------------------------
# Associamo alla classe SERVERS una qdisc sfq utilizzando i parametri standard
# Se non si associa nessuna qdisc, per default è assegnata la qdisc FIFO.
# -------------------------------------------------------------------------
tc qdisc add dev $ETH parent $SERVERS  sfq quantum 1514b perturb 15

# -------------------------------------------------------------------------
# Associamo anche alla classe OFFICE una qdisc sfq
# -------------------------------------------------------------------------
tc qdisc add dev $ETH parent $OFFICE   sfq quantum 1514b perturb 15

# -------------------------------------------------------------------------
# Creazione dei filtri che smisteranno i pacchetti nelle classi create
# -------------------------------------------------------------------------

# -------------------------------------------------------------------------
# I pacchetti aventi protocollo ip (protocol ip) e destinati all'indirizzo 
# corrispondente al PC dell'ufficio (match ip dst OFFICE_PC) saranno 
# indirizzati nella classe OFFICE (quella con 2Mbit di bandwidth).
# -------------------------------------------------------------------------
tc filter add dev $ETH parent 10:0 protocol ip prio 100 u32 match ip dst $OFFICE_PC flowid $OFFICE

# -------------------------------------------------------------------------
# I pacchetti aventi protocollo ip (protocol ip) e destinati alla rete dei 
# server (match ip dst SERVERS_LAN) saranno indirizzati nella classe SERVERS 
# (quella con 8Mbit di bandwidth).
# -------------------------------------------------------------------------

tc filter add dev $ETH parent 10:0 protocol ip prio 25  u32 match ip dst $SERVERS_LAN flowid $SERVERS

12.3 Esempio 3 - CBQ e filtro fw

In questo caso il firewall/router utilizza Netfilter/iptables per marcare i pacchetti interessati, i filtri provvederanno in base a questi valori a indirizzare i pacchetti nelle classi prescelte.


#!/bin/bash

# -------------------------------------------------------------------------
# Definizione delle variabili
# -------------------------------------------------------------------------
ETH=eth0
ROOT=10:1

# ------------------------------------------------------------------------- 
# Rete di server
# ------------------------------------------------------------------------- 
SERVERS=10:2
SERVERS_RATE=8Mbit
SERVERS_LAN=150.150.10.0/16
SERVERS_MARK=2

# ------------------------------------------------------------------------- 
# Computer presente nell'ufficio
# ------------------------------------------------------------------------- 
OFFICE=10:3
OFFICE_RATE=2Mbit
OFFICE_PC=150.150.10.2
OFFICE_MARK=1

# -------------------------------------------------------------------------
# Creazione di una qdisc cbq basata su classi.
# La bandwidth a disposizione dell'interfaccia è di 10 Mbit (128k)
# Dimensione media dei pacchetti (avpkt) è di 1000 byte (caso ethernet)  
# -------------------------------------------------------------------------
tc qdisc add dev $ETH root handle 10: cbq bandwidth 10Mbit avpkt 1000

# -------------------------------------------------------------------------
# Creazione della prima classe ROOT.  
# bandwidth assegnata 10Mbit, priorità della classe 8. 
# allot nel caso ethernet è da impostare a 1514 (allot=MTU+MAC) 
# weight è da scegliere proporzionale a rate, in genere 1/10 di rate.
# -------------------------------------------------------------------------
tc class add dev $ETH parent 10: classid $ROOT cbq bandwidth 10Mbit \
   rate 10Mbit allot 1514 weight 1Mbit prio 8 maxburst 20 avpkt 1000

# -------------------------------------------------------------------------
# Creazione della prima classe discendente di ROOT, denominata SERVERS.  
# bandwidth assegnata 8Mbit, priorità della classe 5. 
# La classe è "bounded" ossia non può eccedere il rate assegnato.
# -------------------------------------------------------------------------
tc class add dev $ETH parent $ROOT classid $SERVERS cbq bandwidth 10Mbit \
   rate $SERVERS_RATE allot 1514 weight 400kbit prio 5 maxburst 20 avpkt 1000 bounded

# -------------------------------------------------------------------------
# Creazione della seconda classe discendente di ROOT, denominata OFFICE.  
# bandwidth assegnata 8Mbit, priorità della classe 5. 
# La classe è "bounded" ossia non può eccedere il rate assegnato.
# -------------------------------------------------------------------------
tc class add dev $ETH parent $ROOT classid $OFFICE cbq bandwidth 10Mbit \
   rate $OFFICE_RATE allot 1514 weight 100kbit prio 5 maxburst 20 avpkt 1000 bounded

# -------------------------------------------------------------------------
# Associamo alla classe SERVERS una qdisc sfq utilizzando i parametri standard
# Se non si associa nessuna qdisc, per default è assegnata la qdisc FIFO.
# -------------------------------------------------------------------------
tc qdisc add dev $ETH parent $SERVERS  sfq quantum 1514b perturb 15

# -------------------------------------------------------------------------
# Associamo anche alla classe OFFICE una qdisc sfq
# -------------------------------------------------------------------------
tc qdisc add dev $ETH parent $OFFICE  sfq quantum 1514b perturb 15

# -------------------------------------------------------------------------
# Rispetto all'esempio 1 invece di utilizzare il filtro u32, utilizziamo 
# il firewall, che nei kernel 2.3/2.4 è costituito dall'infrastruttura 
# Netfilter e dal programma iptables.
# Con iptables marchiamo con un valore (mark) i pacchetti in base al 
# loro indirizzo IP di destinazione.
# -------------------------------------------------------------------------

# ------------------------------------------------------------------------- 
# I pacchetti destinati all' OFFICE_PC devono essere marcati con il valore
# OFFICE_MARK ossia 1.
# ------------------------------------------------------------------------- 
iptables -A PREROUTING -i $ETH -t mangle -p tcp --destination $OFFICE_PC \ 
         -j MARK --set-mark $OFFICE_MARK

# ------------------------------------------------------------------------- 
# I pacchetti destinati alla LAN dei SERVERS (SERVERS_LAN) devono essere 
# marcati con il valore SERVERS_MARK ossia 2.
# ------------------------------------------------------------------------- 
iptables -A PREROUTING -i $ETH -t mangle -p tcp --destination $SERVERS_LAN \ 
         -j MARK --set-mark $SERVERS_MARK

# -------------------------------------------------------------------------
# Creazione dei filtri che smisteranno i pacchetti nelle classi create
# -------------------------------------------------------------------------

# -------------------------------------------------------------------------
# I pacchetti aventi protocollo ip (protocol ip) e marcati con il valore
# OFFICE_MARK sono da indirizzare nella classe OFFICE
# (quella con 2Mbit di bandwidth).
# -------------------------------------------------------------------------
tc filter add dev $ETH parent 10:0 protocol ip prio 5 handle $OFFICE_MARK fw flowid $OFFICE

# -------------------------------------------------------------------------
# I pacchetti aventi protocollo ip (protocol ip) e marcati con il valore
# SERVERS_MARK sono da indirizzare nella classe SERVERS
# (quella con 8Mbit di bandwidth).
# -------------------------------------------------------------------------
tc filter add dev $ETH parent 10:0 protocol ip prio 5 handle $SERVERS_MARK fw flowid $SERVERS

12.4 Esempio 4 - CBQ e filtro fw

In questo caso si utilizza ancora il firewall e in particolare si distinguono i pacchetti in base alla porta di destinazione (www, smtp).


#!/bin/bash

# -------------------------------------------------------------------------
# Definizione delle variabili
# -------------------------------------------------------------------------
ETH=eth0
ROOT=10:1

# -------------------------------------------------------------------------
# Rete di server
# -------------------------------------------------------------------------
SERVERS=10:2
SERVERS_RATE=8Mbit
SERVERS_LAN=150.150.10.0/16
SERVERS_MARK=2

# -------------------------------------------------------------------------
# Computer presente nell'ufficio
# -------------------------------------------------------------------------
OFFICE=10:3
OFFICE_RATE=2Mbit
OFFICE_PC=150.150.10.2
OFFICE_MARK=1

# -------------------------------------------------------------------------
# Creazione di una qdisc cbq basata su classi.
# La bandwidth a disposizione dell'interfaccia è di 10 Mbit (128k)
# Dimensione media dei pacchetti (avpkt) è di 1000 byte (caso ethernet)  
# -------------------------------------------------------------------------
tc qdisc add dev $ETH root handle 10: cbq bandwidth 10Mbit avpkt 1000

# -------------------------------------------------------------------------
# Creazione della prima classe ROOT.  
# bandwidth assegnata 10Mbit, priorità della classe 8. 
# allot nel caso ethernet è da impostare a 1514 (allot=MTU+MAC) 
# weight è da scegliere proporzionale a rate, in genere 1/10 di rate.
# -------------------------------------------------------------------------
tc class add dev $ETH parent 10: classid $ROOT cbq bandwidth 10Mbit \
   rate 10Mbit allot 1514 weight 1Mbit prio 8 maxburst 20 avpkt 1000

# -------------------------------------------------------------------------
# Creazione della prima classe discendente di ROOT, denominata SERVERS.  
# bandwidth assegnata 8Mbit, priorità della classe 5. 
# La classe è "bounded" ossia non può eccedere il rate assegnato.
# -------------------------------------------------------------------------
tc class add dev $ETH parent $ROOT classid $SERVERS cbq bandwidth 10Mbit \
   rate $SERVERS_RATE allot 1514 weight 400kbit prio 5 maxburst 20 avpkt 1000 bounded

# -------------------------------------------------------------------------
# Creazione della seconda classe discendente di ROOT, denominata OFFICE.  
# bandwidth assegnata 8Mbit, priorità della classe 5. 
# La classe è "bounded" ossia non può eccedere il rate assegnato.
# -------------------------------------------------------------------------
tc class add dev $ETH parent $ROOT classid $OFFICE cbq bandwidth 10Mbit \
   rate $OFFICE_RATE allot 1514 weight 100kbit prio 5 maxburst 20 avpkt 1000 bounded

# -------------------------------------------------------------------------
# Associamo alla classe SERVERS una qdisc sfq utilizzando i parametri standard
# Se non si associa nessuna qdisc, per default è assegnata la qdisc FIFO.
# -------------------------------------------------------------------------

tc qdisc add dev $ETH parent $SERVERS  sfq quantum 1514b perturb 15

# -------------------------------------------------------------------------
# Associamo anche alla classe OFFICE una qdisc sfq 
# -------------------------------------------------------------------------
tc qdisc add dev $ETH parent $OFFICE   sfq quantum 1514b perturb 15

# -------------------------------------------------------------------------
# Rispetto all'esempio 1 invece di utilizzare il filtro u32, utilizziamo 
# il firewall, che nei kernel 2.3/2.4 è costituito dall'infrastruttura 
# Netfilter e dal programma iptables.
# Con iptables marchiamo con un valore (mark) i pacchetti in base al 
# loro indirizzo IP di destinazione.
# -------------------------------------------------------------------------


# Tutti i pacchetti pacchetti sono marcati con il valore 0
# I pacchetti www e smtp subiscono però un'ulteriore modifica
iptables -A PREROUTING -i $ETH -t mangle -j MARK --set-mark 0

# I pacchetti destinati al server WWW devono essere marcati con il valore
# WWW ossia 1.
iptables -A PREROUTING -i $ETH -t mangle -p tcp --dport www   \
         -j MARK --set-mark $WWW

# I pacchetti destinati alla LAN dei SERVERS (SERVERS_LAN) devono essere 
# marcati con il valore MAIL ossia 2.
iptables -A PREROUTING -i $ETH -t mangle -p tcp --dport smtp   \
         -j MARK --set-mark $MAIL



# -------------------------------------------------------------------------
# Creazione dei filtri che smisteranno i pacchetti nelle classi create
# -------------------------------------------------------------------------

# -------------------------------------------------------------------------
# I pacchetti aventi protocollo ip (protocol ip) e marcati con il valore
# WWW sono da indirizzare nella classe WWW_SERVER
# (quella con 8Mbit di bandwidth).
# -------------------------------------------------------------------------
tc filter add dev $ETH parent 10:0 protocol ip prio 10 handle $WWW fw flowid $WWW_SERVER


# -------------------------------------------------------------------------
# I pacchetti aventi protocollo ip (protocol ip) e marcati con il valore
# MAIL sono da indirizzare nella classe MAIL_SERVER
# (quella con 2Mbit di bandwidth).
# -------------------------------------------------------------------------
tc filter add dev $ETH parent 10:0 protocol ip prio  5 handle $MAIL fw flowid $MAIL_SERVER

12.5 Esempio 5 - ingress

Esempio di utilizzo della qdisc ingress presente all'indirizzo www.davin.ottawa.on.ca/ols/img33.htm, qui modificato in modo da utilizzare iptables.

#!/bin/bash


iptables -A PREROUTING -t mangle -i eth0 -s 10.2.0.24/32 -j MARK --set-mark 1
iptables -A PREROUTING -t mangle -i eth0 -p tcp --syn    -j MARK --set-mark 2

# -------------------------------------------------------------------------
# associa una qdisc ingress all'interfaccia eth0
# -------------------------------------------------------------------------
tc qdisc add dev eth0 handle ffff: ingress

# -------------------------------------------------------------------------
# per i pacchetti marcati con il valore 1 accetta almeno 60 pacchetti come 
# burst (si assume una dimensione dei pacchetti di circa 1.5KB, 90/1.5=60) 
# nel "lungo" intervallo e fino a 6 pacchetti nel "breve" intervallo.
# -------------------------------------------------------------------------
tc filter add dev eth0 parent ffff: protocol ip prio 50 handle 1 fw \
   police rate 1500kbit burst 90k mtu 9k drop flowid :1

# -------------------------------------------------------------------------
# I pacchetti con flag SYN impostato hanno dimensione pari a 40 byte (320 bit)
# quindi 10 pacchetti SYN sono 3Kbps; accettiamo solo 10 pacchetti SYN/sec
# -------------------------------------------------------------------------
tc filter add dev eth0 parent ffff: protocol ip prio 50 handle 2 fw \
   police rate 3kbit burst 40 mtu 9k drop flowid :1

12.6 Esempio 6 - ingress e dsmark

Questo esempio è stato preso tra quelli disponibili con il pacchetti iproute2. Sono state aggiunte delle modifiche e i commenti.


#!/bin/bash

# -------------------------------------------------------------------------
# Definizione delle variabili
# -------------------------------------------------------------------------
ETH=eth0
ROOT=10:0

INDEV=eth2         # ingress device
EGDEV="dev eth1"   # egress  device

PC1=1
PC2=2
RETE=3

iptables -A PREROUTING -t mangle -s 10.2.0.0/24 -j MARK --set-mark $RETE 
iptables -A PREROUTING -t mangle -i $INDEV -s 10.2.0.24 -j MARK --set-mark $PC1
iptables -A PREROUTING -t mangle -i $INDEV -s 10.2.0.3  -j MARK --set-mark $PC2

# ------------------------------------------------------------------------
# INGRESS - interfaccia di ingresso
# ------------------------------------------------------------------------

# ------------------------------------------------------------------------- 
# Creazione di una qdisc ingress che viene associata all'interfaccia 
# INDEV (eth2) di ingresso.
# ------------------------------------------------------------------------- 
tc qdisc add dev $INDEV handle ffff: ingress

# ------------------------------------------------------------------------- 
# Alla qdisc ingress viene associato un filtro che limita il traffico dei 
# pacchetti marcati con iptables con il valore RETE (3) ad un massimo di 
# 1.5Mbps (police rate 1500kbit). Il burst è impostato a 90K.
# mtu (maximum transfer unit) è di 9k. I pacchetti in eccedenza al limite 
# fissato sono scartati (drop). 
# ------------------------------------------------------------------------- 
tc filter add dev $INDEV parent ffff: protocol ip prio 50 handle $RETE fw \
   police rate 1500kbit burst 90k mtu 9k drop flowid :1


# ------------------------------------------------------------------------
# EGRESS - interfaccia di uscita
# ------------------------------------------------------------------------

# ------------------------------------------------------------------------- 
# Associamo all'interfaccia EGDEV (eth1) la qdisc dsmark
# ------------------------------------------------------------------------- 
tc qdisc add $EGDEV handle 1:0 root dsmark indices 64

# ------------------------------------------------------------------------- 
# Definiamo tre classi e associamo un valore DSCP (Differentiated Service 
# Code Point) 
# ------------------------------------------------------------------------- 
tc class change $EGDEV classid 1:1 dsmark 0x3 value 0xb8
tc class change $EGDEV classid 1:2 dsmark 0x3 value 0x28
tc class change $EGDEV classid 1:3 dsmark 0x3 value 0x48

# ------------------------------------------------------------------------- 
# Impostiamo dei filtri che smistino i pacchetti marcati nelle classi 
# corrispondenti 
# ------------------------------------------------------------------------- 
tc filter add $EGDEV parent 1:0 protocol ip prio 4 handle $PC1  fw classid 1:1
tc filter add $EGDEV parent 1:0 protocol ip prio 4 handle $PC2  fw classid 1:2
tc filter add $EGDEV parent 1:0 protocol ip prio 4 handle $RETE fw classid 1:3

Avanti Indietro Indice