Seguono una serie di esempi, alcuni si possono trovare su internet agli indirizzi presenti nel capitolo "Risorse".
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
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
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
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
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
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