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:// | ||
+ | |||
+ | ===== QoS dans les grandes lignes ===== | ||
+ | |||
+ | Une obscure approche direct: man tc | ||
+ | |||
+ | Gestionnaire de file d' | ||
+ | |||
+ | Le QoS ne peut s' | ||
+ | |||
+ | Le filtre **mangle + PREROUTING** est destiné a ce qui sort et qui n'est pas généré par l' | ||
+ | |||
+ | Le filtre **mangle + OUTPUT** est destiné a ce qui sort et est généré par l' | ||
+ | |||
+ | ===== 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' | ||
+ | |||
+ | # | ||
+ | |||
+ | # ici, je vire tout ce que j'ai pu prealablement creer | ||
+ | tc qdisc del dev eth0 root | ||
+ | |||
+ | #exit 0 | ||
+ | |||
+ | | ||
+ | # | ||
+ | | ||
+ | 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' | ||
+ | |||
+ | L' | ||
+ | |||
+ | 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' | ||
+ | |||
+ | | ||
+ | |||
+ | Aprés recherche, il semble que le resultat du calcul ci-dessous doit occiller 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**, | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | 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: | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | 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' | ||
+ | |||
+ | # ------------------- | ||
+ | # QoS | ||
+ | # ------------------- | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | # ssh | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | # www | ||
+ | | ||
+ | | ||
+ | |||
+ | # ... inserer ici les autres marquages souhaités | ||
+ | |||
+ | # et a la fin... | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | # -- | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | # $ 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:// | ||
+ | |||
+ | $ wget http:// | ||
+ | |||
+ | Decompresser, | ||
+ | |||
+ | Installer les entetes du kernel: | ||
+ | |||
+ | # apt-get install linux-headers-`uname -r` | ||
+ | |||
+ | Recuperer les sources de sa version IPTABLES: | ||
+ | |||
+ | $ wget ftp:// | ||
+ | |||
+ | 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 / | ||
+ | |||
+ | et | ||
+ | |||
+ | # cp ipt_ipp2p.ko / | ||
+ | |||
+ | suivit de: | ||
+ | |||
+ | # depmod -a | ||
+ | # modprobe ipt_ipp2p | ||
+ | |||
+ | Ce qui pose un problème lorsqu' | ||
+ | |||
+ | Mais ca ne fonctionne pas !!!! grrrr | ||
+ | |||
+ | # iptables -m ipp2p --help | ||
+ | | ||
+ | |||
reseaux_qos.txt · Dernière modification : 2007/03/31 23:14 de thierry