Outils pour utilisateurs

Outils du site


reseaux_qos
no way to compare when less than two revisions

Différences

Ci-dessous, les différences entre deux révisions de la page.


reseaux_qos [2007/03/31 23:14] (Version actuelle) – créée thierry
Ligne 1: Ligne 1:
 +====== QoS ======
 +
 +Liens:
 +
 +http://www.linux-france.org/prj/inetdoc/guides/lartc/lartc.cookbook.fullnat.intro.htmlhttp://lartc.org/howto/lartc.qdisc.classless.html
 +
 +===== 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é [[http://www.linux-france.org/prj/inetdoc/guides/lartc/lartc.cookbook.fullnat.intro.html|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
 +
 +Où **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: [[http://www.ipp2p.org|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