Outils pour utilisateurs

Outils du site


reseaux_qos

QoS

QoS dans les grandes lignes

Une obscure approche direct: man tc

Gestionnaire de file d'attente: HTB. On definie la bande passante, on la divise et on defini des priorités. A partir d'IPTABLES, on defini la priorité en marquant les paquets.

Le QoS ne peut s'appliquer qu'au trafic sortant ! le trafic entrant ne passe pas par la file d'attente.

Le filtre mangle + PREROUTING est destiné a ce qui sort et qui n'est pas généré par l'hote… je ne sais pas encore ce que c'est :)

Le filtre mangle + OUTPUT est destiné a ce qui sort et est généré par l'hote. là, je comprend l'idée.

Exemple de scripte

Pour mon ADSL, j'ai estimé ma bande passante en emission a 778 kilo bit par seconde: 778kbs

En partant de l'exemple qui trouvé la:

 #!/bin/sh -x
 # ici, je vire tout ce que j'ai pu prealablement creer 
 tc qdisc del dev eth0 root
 #exit 0
 CEIL_HI=778
 #CEIL_LO=389 
 CEIL_LO=778
 tc qdisc add dev eth0 root handle 1: htb default 15
 tc class add dev eth0 parent 1: classid 1:1 htb rate ${CEIL_HI}kbit ceil ${CEIL_HI}kbit
 tc class add dev eth0 parent 1:1 classid 1:10 htb rate 254kbit ceil ${CEIL_LO}kbit prio 0
 tc class add dev eth0 parent 1:1 classid 1:11 htb rate 254kbit ceil ${CEIL_HI}kbit prio 1
 tc class add dev eth0 parent 1:1 classid 1:12 htb rate 67kbit ceil ${CEIL_HI}kbit prio 2
 tc class add dev eth0 parent 1:1 classid 1:13 htb rate 67kbit ceil ${CEIL_HI}kbit prio 2
 tc class add dev eth0 parent 1:1 classid 1:14 htb rate 33kbit ceil ${CEIL_LO}kbit prio 3
 tc class add dev eth0 parent 1:1 classid 1:15 htb rate 100kbit ceil ${CEIL_LO}kbit prio 3

Donc, la bande passante est divisé en 6 bandes: de 1:10 à 1:15 254+254+67+67+33+100 = 775

Note que default 15 signifie que par defaut, c'est la priorité la plus faible qui est choisit.

L'algo du filtre va utiliser toutes la bande passante CEIL_HI (ou CEIL_LO) si les priorités superieures sont inutilisé.

La désignation de chaque bande:

1:10 ⇒ faible latence: ssh, telnet, dns, irc, ftp (non data) 1:11 ⇒ trafic de masse (processus locaux et exterieur): www 1:12 ⇒ debit maximum (processus locaux) ftp-data 1:13 ⇒ service naté (???) 1:14 ⇒ smtp, pop3 1:15 ⇒ kazaa, edonkey et autres inconnu…

Tout cela, c'est toujours d'aprés l'exemple qui m'a inspiré. On peut modifier le nombre de division et modifier la priorité des services…

L'idée de 'CEIL_HI' et 'CEIL_LO', etait de ne pas trop de donner de bande passante, même si elle est disponible… mais est-ce vraiment necessaire.

Suite du scripte: Quelques trucs en plus, que je fais sans trop comprendre:

 tc qdisc add dev eth0 parent 1:12 handle 120: sfq perturb 10
 tc qdisc add dev eth0 parent 1:13 handle 130: sfq perturb 10
 tc qdisc add dev eth0 parent 1:14 handle 140: sfq perturb 10
 tc qdisc add dev eth0 parent 1:15 handle 150: sfq perturb 10

Et finalement, on associe une mark a chaque bande.

 # classification des paquets
 # FWMARK de 0x21 a 0x26
 tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 0x21 fw classid 1:10
 tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 0x22 fw classid 1:11
 tc filter add dev eth0 parent 1:0 protocol ip prio 3 handle 0x23 fw classid 1:12
 tc filter add dev eth0 parent 1:0 protocol ip prio 4 handle 0x24 fw classid 1:13
 tc filter add dev eth0 parent 1:0 protocol ip prio 5 handle 0x25 fw classid 1:14
 tc filter add dev eth0 parent 1:0 protocol ip prio 6 handle 0x26 fw classid 1:15

QoS et r2q

J'avais des warnings comme ça dans /var/log/syslog :

 kernel: HTB: quantum of class 10001 is big. Consider r2q change.

Aprés recherche, il semble que le resultat du calcul ci-dessous doit occiller entre 1500 et 60000.

 rate_bytes / r2q =  entre 1500 et 60000

rate_bytes = rate * 8
et r2q est 10 par defaut (faut le savoir!)

Exemple:

 tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
 ...
 tc class add dev eth0 parent 1:1 classid 1:17 htb rate 5mbit ceil 100mbit prio 3

La vitesse max est 100mbit, soit:

 rate_bytes = (100*1024*1024)/8
 rate_bytes / r2q (10) => 1310720 soit 1.25 mbyte

Et c'est beaucoup trop grand. Pour ne pas depasser 60000 il faudrait:

  rate_bytes / 60000 => r2q=218 (environ)

La vitesse min est 5mbit, soit:

 rate_bytes = (5*1024*1024)/8
 rate_bytes / r2q (10) => 65536, soit un peu plus grand que 60000 !

Si on fixe a r2q a 220, ca fonctionne mieux, aussi bien pour le minimum que le maximum:

 soit r2q = 220 , alors
 100 mbit  => 59578 
 5 mbit => 2978

Parfait!
Si on a encore des warnings malgré le changement de r2q, on peut ajouter quantum ce qui elimine le calcul r2q et le warning associé. Exemple:

 tc class add dev eth0 parent 1:1 classid 1:17 htb rate 5mbit ceil 100mbit prio 3 quantum 60000

QoS et IPTABLES

Maintenant que le gestionnaire de file d'attente est en place:

 # -------------------
 # QoS
 # -------------------
 MKPRIO1="0x21"
 MKPRIO2="0x22"
 MKPRIO3="0x23"
 MKPRIO4="0x24"
 MKPRIO5="0x25"
 MKPRIO6="0x26"
 # ssh
 $IPTABLES -t mangle -A OUTPUT -o eth0 -p tcp --sport ssh -m mark --mark 0 -j MARK --set-mark $MKPRIO1
 $IPTABLES -t mangle -A OUTPUT -o eth0 -p tcp --sport ssh -j RETURN
 $IPTABLES -t mangle -A OUTPUT -o eth0 -p tcp --dport ssh -m mark --mark 0 -j MARK --set-mark $MKPRIO1
 $IPTABLES -t mangle -A OUTPUT -o eth0 -p tcp --dport ssh -j RETURN
 # www
 $IPTABLES -t mangle -A OUTPUT -o eth0 -p tcp --dport www -m mark --mark 0 -j MARK --set-mark $MKPRIO2
 $IPTABLES -t mangle -A OUTPUT -o eth0 -p tcp --dport www -j RETURN
 # ... inserer ici les autres marquages souhaités
 # et a la fin...
 $IPTABLES -t mangle -A PREROUTING -m mark --mark 0 -m tos --tos Minimize-Delay -j MARK --set-mark $MKPRIO1
 $IPTABLES -t mangle -A PREROUTING -m mark --mark 0 -m tos --tos Minimize-Delay -j RETURN
 $IPTABLES -t mangle -A PREROUTING -m mark --mark 0 -m tos --tos Minimize-Cost -j MARK --set-mark $MKPRIO5
 $IPTABLES -t mangle -A PREROUTING -m mark --mark 0 -m tos --tos Minimize-Cost -j RETURN
 $IPTABLES -t mangle -A PREROUTING -m mark --mark 0 -m tos --tos Maximize-Throughput -j MARK --set-mark $MKPRIO6
 $IPTABLES -t mangle -A PREROUTING -m mark --mark 0 -m tos --tos Maximize-Throughput -j RETURN
 # --
 $IPTABLES -t mangle -A OUTPUT -o eth0 -m mark --mark 0 -m tos --tos Minimize-Delay -j MARK --set-mark $MKPRIO1
 $IPTABLES -t mangle -A OUTPUT -o eth0 -m mark --mark 0 -m tos --tos Minimize-Delay -j RETURN
 $IPTABLES -t mangle -A OUTPUT -o eth0 -m mark --mark 0 -m tos --tos Minimize-Cost -j MARK --set-mark $MKPRIO5
 $IPTABLES -t mangle -A OUTPUT -o eth0 -m mark --mark 0 -m tos --tos Minimize-Cost -j RETURN
 $IPTABLES -t mangle -A OUTPUT -o eth0 -m mark --mark 0 -m tos --tos Maximize-Throughput -j MARK --set-mark $MKPRIO6
 $IPTABLES -t mangle -A OUTPUT -o eth0 -m mark --mark 0 -m tos --tos Maximize-Throughput -j RETURN
 # $ iptables -m tos -h
 # --tos Normal-Service ?
 # --tos Maximize-Reliability ?

Rappel sur la table MANGLE:

“Cette table permet le marquage des paquets entrants (PREROUTING) et générés localement (OUTPUT). Le marquage de paquets va permettre un traitement spécifique des paquets marqués dans les tables de routage avec IPROUTE 2”

QoS en image

C'est assez pauvre:

 # tc -s class show dev eth0

On y voit plus ou moins des choses…

ipp2p

Le but est de definir une priorite en fonction du contenu des paquets.

Recuperer les sources (car il n'y a pas de package), ici: www.ipp2p.org

 $ wget http://www.ipp2p.org/downloads/ipp2p-0.8.2.tar.gz

Decompresser, etc…

Installer les entetes du kernel:

 # apt-get install linux-headers-`uname -r`

Recuperer les sources de sa version IPTABLES:

 $ wget ftp://ftp.netfilter.org/pub/iptables/iptables-1.3.6.tar.bz2

Decompresser dans /usr/src :

 # cd /usr/src
 # tar xvzf iptables-1.3.6.tar.bz2

On peut aussi recuperer les sources comme ca:

 # apt-get source iptables

Et puis compiler:

 # make

 # cp libipt_ipp2p.so /lib/iptables/.

et

 # cp ipt_ipp2p.ko /lib/modules/2.6.17-2-686/kernel/net/ipv4/netfilter/.

suivit de:

 # depmod -a
 # modprobe ipt_ipp2p

Ce qui pose un problème lorsqu'on mettra a jour le kernel… recompiler ipp2p ?

Mais ca ne fonctionne pas !!!! grrrr

 # iptables -m ipp2p --help
 iptables v1.3.6: Couldn't load match `ipp2p'
reseaux_qos.txt · Dernière modification : 2007/03/31 23:14 de thierry