Vous êtes sur la page 1sur 22

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

La-Linux & amis : LinuxFR GCU-Squad Zarb.Org GNU

Leapro-pro reseau-qos Page Discussion Voir le texte source Historique

Sommaire
[masquer]

[modier] QoS/Gestion de la bande passante sous Linux


par Julien Lecubin

[modier] Introduction
Dans cet article, je vais vous expliquer les direntes tapes pour mettre en place la QoS et grer votre bande passante sous Linux. Pourquoi faire de la QoS ? Retenez que sans la QoS, vous ne pouvez pas grer correctement les ux qui transitent sur votre rseau. Vous aurez par exemple des problmes couter un ux audio en streaming sachant qu'en mme temps, vous tes en train de faire du ftp. Dans la premire partie de cet article, je vais vous montrer comment prioriser les divers ux de votre rseau. Pourquoi grer la BP de mon rseau ? Une personne qui fait du ftp sur une ligne ADSL de bureau peut monopoliser elle seule toute la bande passante en sortie de votre rseau. Ce cas ne se limite pas aux rseaux ADSL et peut tre aussi constat sur des rseaux trs haut dbit (lignes de type T1/T2). Linux peut apporter une solution ecace face ce genre de problme en vous orant la possibilit de grer intelligemment votre bande passante. Ce sera le sujet de la deuxime partie de ce prsent document. Actuellement, sachez que vous pouvez faire de la QoS et de la gestion de bande passante sous les noyaux 2.2 et 2.4. Namoins, pour une question de facilit, je vous recommande un noyau 2.4 pour eectuer ce qui suit.

1 of 22

25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

[modier] QoS via iptables


Pour faire de la QoS, nous allons modier la valeur du champs TOS se situant dans l'en tte IP grce iptables. Le champ TOS est sur 4 bits : HEXA BINAIRE DECIMAL SIGNIFICATION 0x10 0x08 0x04 0x02 0x00 1000 0100 0010 0001 0000 8 4 2 1 Minimize Delay Maximize throughput Maximize reliability Minimize monetary cost Normal

Minimize-Delay : Amliore la ractivit des connexions en rduisant le dlai (ssh, telnet, ftp contrle, tftp, ux DNS UDP) Maximize-Throughput : Amliore le dbit au prix d'une possible dtrioration de l'interactivit de la session. Les temps de latence ne sont pas importants (ftp-data,www, transfert de zone DNS) Maximum-Reliability : Certitude que les donnes arrivent sans perte - Amliore la abilit (snmp, smtp) Minimize monetary cost : minimise le dlai, meilleure rentabilit (nntp, icmp) L'intrt de la QoS sous Linux est trs souvent associ la priorisation de ux interactifs via iptables. Par exemple, vous ne souhaitez pas que votre session ssh soit interrompue cause d'un utilisateur qui est en train de monopoliser la bande passante de votre rseau en downloadant une bande annonce sur internet (Il s'agit d'un cas de gure bien plus rpandu qu'on ne le pense !). Nous allons ici titre d'exemple optimiser les tracs courants avec iptables, savoir le ftp et ssh : # Priorisation des connexions ftp et ssh iptables -A PREROUTING -t mangle -p tcp --sport ssh -j TOS --set-tos Minimize-Delay iptables -A PREROUTING -t mangle -p tcp --sport ftp -j TOS --set-tos Minimize-Delay # On donne un maximum de dbit aux transferts ftp, peu importe la latence iptables -A PREROUTING -t mangle -p tcp --sport ftp-data -j TOS --set-tos MaximizeThroughput A vous d'adapter ce script suivant les services de votre rseau que vous souhaitez prioriser.

[modier] Gestion de la bande passante sous Linux


Nous abordons la deuxime partie du document. Linux utilise deux units du contrle de trac pour la gestion de la bande passante : Les ltres qui placent le trac dans les les d'attentes (fwmark, u32)

2 of 22

25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

Les les d'attentes qui dcident des ux prioritaires (CBQ, HTB, RED, TBF, SFQ...) Gardez en vue que le protocole TCP/IP n'a pas d'aptitude connatre les performances d'un rseau. Il commence envoyer des paquets, de plus en plus rapidement et quand des paquets commencent se perdre, il ralentit. La plupart des les d'attentes fonctionnent selon le modle suivant : elles recoivent des paquets, les positionnent en le d'attente jusqu' un certain point, et ensuite, liminent tout paquet qui arrive dans le cas o la le d'attente est pleine. Si on travaille en UDP , les paquets ne sont plus retransmis, si c'est du TCP , l'metteur renverra les paquets perdus. Le dbit s'en trouve alors ralenti.

[modier] Compilation du noyau


Nous allons compiler le noyau an que celui-ci sache grer notre BP ( = Bande Passante). Si vous avez une distribution rcente, il se peut que vous n'ayez pas besoin de le compiler. Lancez un "make xcong" sous le X dans le rpertoire /usr/src/linux. Si cela ne marche pas, installez les sources du noyau (le rpm est du type kernelsrc-*.rpm) [modier] Les options Dans la partie "Networking Options" -> "QoS and fair queuing" : Option Noyau Slection la Dnition Compilation module module Network Packet Filtering (Classed Based Queue) - le d'attente base sur des classes. C'est ce type de le d'attente qui sera implmente dans la suite du prsent document (Hierarchical Token buckets) implment dans la suite du prsent document - Si vous ne l'avez pas, j'explique plus bas comment avoir cette le d'attente en patchant votre noyau (Clark-Shenker-Zhang) - Les ux ne sont pas limits leur bande passante. Fournit un service garanti

QoS & fair queuing oui Netlter CBQ packet scheduler

HTB packet scheduler

module

CSZ packet scheduler

module

The simplest PRIO module pseudoscheduler RED queue module (Random Early Detect) - Anticipe les problmes de congestion. RED limine les paquets pour indiquer TCP/IP de

3 of 22

25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

ralentir - Pour de gros dbits (Stochastic Fair Queuing) - Limitation base sur le taux de transfert utilis Consomme peu de CPU/Mem. Rapide, peu prcis. Ecace sur de gros dbits Ore un traitement sensiblement quitable de chaque classe Consomme peu de CPU. Limitation base sur le taux de transfert utiliser Non bas sur les classes (Queuing discipline) - Indispensable lorsque l'on souhaite utiliser les les d'attente

SFQ queue

module

TBF queue

module

Ingress QDisc QoS support Rate estimator Packet classier API Routing table based classier Firewall based classier U32 classier Special RSVP classier Special RSVP classier for IPv6

module oui oui oui

TC Index classier module module module module module module

Les les d'attentes les plus importantes sont CBQ et HTB (la suite du document se base sur ces deux les d'attente). Vous n'tes pas obligs de mettre en module les autres les d'attentes (CSZ, RED, SFQ, TBF, TEQL), cependant, cela reste toujours intressant de les laisser en tant que module au cas o vous en auriez besoin plus tard. [modier] Terminer la compilation Compilez le noyau par : make dep make clean make bzImage make modules make modules_install

4 of 22

25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

Ensuite : Allez prendre un caf Toujours pas ni ? Retournez prendre un caf... :) cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz cp /usr/src/linux/arch/i386/boot/System.map /boot Modiez /etc/lilo.conf pour prendre en compte le nouveau noyau et lancez la commande "lilo". Assurez-vous enn que votre station Linux comporte la commande "tc" (un "which tc" vous permettra de voir si "tc" est install). Si vous ne l'avez pas, elle fait partie du package iproute2 (les sources sont ici et le rpm peut tre tlcharg l) Dsormais, votre noyau linux implmente la gestion de bande passante. Il ne reste plus qu' crire un script propre votre cong, ce qui est dcrit dans la suite du document.

[modier] Scripts de gestion de bande passante CBQ.init, HTB.init et wshaper.htb


Si vous souhaitez partager votre bande passante sans trop vous compliquer la vie, sachez que des scripts ont t crs an d'optimiser votre bande passante. Dans la suite du document, je vais vous expliquer comment les mettre en place. Lisez bien la dnition de chacun de ces scripts, de manire dnir celui qui vous convient le mieux. CBQ.init : le d'attente CBQ convient de petits dbits ncessite de connatre la taille moyenne des paquets et la vitesse maximale de la connexion utilise le temps d'inactivit de la connexion pour calculer une approximation du dbit utilis. HTB.init : le d'attente HTB convient des gros dbits consomme peu de ressources ne fait pas d'approximation en ce qui concerne le calcul du dbit ncessite de connaitre le dbit maximal de votre connexion. Wondershaper : le d'attente HTB maintient une bonne ractivit pour le trac interactif (ssh, telnet...) surfer sans souci lors de gros downloads s'assure que l'upload ne dfavorise pas le download et inversement. Remarque : Sachez que souvent, on prconise l'utilisation de les d'attentes de type HTB plutot que CBQ. Cependant, si votre distribution n'est pas trs rcente, il y aura
5 of 22 25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

pas mal de choses raliser pour implmenter les les d'attentes HTB sur votre station (j'explique neanmoins la dmarche suivre si vous tes dans ce cas). [modier] CBQ.init Rcuprez le script l'adresse suivante : https://sourceforge.net/projects/cbqinit Faites un "chmod u+x CBQ.init*" an de le rendre executable. Copiez le script dans le rpertoire /usr/bin : "cp CBQ.init-[VERSION] /usr/bin" Crez le rpertoire /etc/syscong/cbq qui contiendra les options de gestion de BP sur lequelles se basera le script : "mkdir /etc/syscong/cbq" - Si vous souhaitez placer vos chiers de congurations CBQ ailleurs, modiez la variable $CBQ_PATH dans le script CBQ.init an de renseigner le nouveau chemin. Exemples de chiers de congurations pour le script CBQ.init : Les chiers de conguration doivent respecter une syntaxe prcise de type cbq-CLASS_ID.name o CLASS_ID est compris en hexa entre 0002 et FFFF (pour en savoir plus, ditez le script, c'est expliqu en dtail). Exemple 1 : $CBQ_PATH/cbq-1280.My_rst_shaper - vous avez 2 interfaces (eth0=LAN et eth1=INTERNET) sur votre machine et souhaitez limiter le trac INTERNET -> LAN 16 Ko/s DEVICE=eth0,10Mbit,1Mbit # 10 Mbits -> debit max de votre interface eth0 RATE=128Kbit # Exprimez les valeurs en Kbit ou Mbit selon les dbits spcis WEIGHT=10Kbit # WEIGHT = RATE / 10 PRIO=5 # Va de 1 8 , 1 etant le + prioritaire (la valeur 5 est recommande et susante pour prioriser un trac spcique) RULE=192.168.1.0/24 Exemple 2 : $CBQ_PATH/cbq-1280.My_second_shaper - vous avez 1 interface sur votre machine (eth0-192.168.1.5) et souhaitez limiter le trac MACHINE -> INTERNET 16 Ko/s DEVICE=eth0,10Mbit,1Mbit # La limite du trac s'eectue sur l'interface 10 Mbits/s eth0 RATE=128Kbit WEIGHT=10Kbit PRIO=5 RULE=192.168.1.5, # Attention la ',' cela permet de specier qu'il s'agit d'une d'adresse source ! Ici, la limitation de BP s'applique uniquement la machine 192.168.1.5 Exemple 3 : $CBQ_PATH/cbq-1280.My_third_shaper - vous souhaitez limiter le trac de votre serveur web (192.168.1.50) 8 Ko/s DEVICE=eth0,10Mbit,1Mbit # 10 Mbits -> dbit max de l'interface de votre serveur
6 of 22 25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

web RATE=64Kbit # Exprimez les valeurs en Kbit ou Mbit selon les dbits spcis WEIGHT=6Kbit # WEIGHT = RATE / 10 PRIO=5 # Va de 1 8 , 1 tant le + prioritaire (la valeur 5 est recommande et susante pour prioriser un trac spcique) RULE=192.128.1.50:80, Exemple 4 : $CBQ_PATH/cbq-1280.My_fourth_shaper - vous souhaitez limiter le trac des gens qui download sur votre serveur ftp (192.168.1.50) 10 Ko/s DEVICE=eth0,10Mbit,1Mbit # 10 Mbits -> dbit max de l'interface de votre serveur ftp RATE=80Kbit # Exprimez les valeurs en Kbit ou Mbit selon les dbits spcis WEIGHT=8Kbit # WEIGHT = RATE / 10 PRIO=5 # Va de 1 8 , 1 tant le + prioritaire (la valeur 5 est recommande et susante pour prioriser un trac spcique) RULE=192.128.1.50:20/0xfe # limitation de BP applique sur port 20/21 Exemple 5 : $CBQ_PATH/cbq-1280.My_fth_shaper - vous souhaitez que le trac LAN -> INTERNET soit limit 50 Ko/s (400 Kbits/s), et que le trac INTERNET -> LAN soit limit 10Ko/s (80 Kbits/s), remplissez CBQ.init de la manire suivante :

LAN ----- eth0 [LINUX] eth1 ----- INTERNET ######################## {{ LAN -> INTERNET }} #################################### DEVICE=eth1,10Mbit,1Mbit RATE=400Kbit WEIGHT=40Kbit # WEIGHT = RATE / 10 PRIO=5 BOUNDED=yes # Pour ne pas aller prendre de la BP aux classes parents ISOLATED=NO # Permet de lguer de la BP aux classes lles si il en reste RULE=192.168.0.0/24 # Le partage de BP concerne le trac destination du reseau 192.168.0.0 ########################################################## ############ ######################## {{ INTERNET -> LAN }} #################################### DEVICE=eth0,100Mbit,10Mbit # RATE=80Kbit # On souhaite limiter le trac entrant 10 Ko/s (adaptez selon le dbit de votre ligne) WEIGHT=8Kbit # WEIGHT = RATE / 10 PRIO=5 BOUNDED=yes ISOLATED=NO RULE=80,192.168.1.10 # Tout le trac HTTP INTERNET -> 192.168.1.10 limit 10 Ko/s #################################### ####################################

7 of 22

25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

Il ne reste plus qu' lancer le script CBQ.init chaque dmarrage ; pour cela ditez le /etc/rc.d/rc.local et ajoutez la ligne "CBQ.init-[version] start" o [version] dsigne la version de votre script CBQ. Si vous souhaitez obtenir des statistiques CBQ, lancez la commande "CBQ.init-[VERSION] stats". Le script vous sortira des informations qui peuvent s'avrer utile. Voil, vous tes dsormais un gourou des les d'attentes CBQ :). Passons maintenant la gestion de la BP avec le d'attentes HTB. [modier] HTB.init Rcuprez le script HTB.init l'adresse suivante :http://sourceforge.net/projects /htbinit Notes pour noyau < 2.4.18-3 : pour utiliser des les d'attentes HTB, sachez que vous devez patcher votre noyau si il est infrieur la version 2.4.18-3 (tapez "uname -a" pour vrier la version de votre distribution) : http://luxik.cdi.cz/~devik/qos/htb/v2/htb2_2.4.17.di pour les noyaux 2.4 http://luxik.cdi.cz/~devik/qos/htb/v2/htb2_2.2.17.di pour les noyaux 2.2 Pour appliquer le patch lancez la commande suivante dans le rpertoire /usr/src/linux : "patch -pl -i htb2_2.4.17.di" Dans /usr/src/linux tapez : "make xcong" Dans la partie "Networking Options" -> "QoS and fair Queuing", slectionnez HTB packet scheduler en module Recompilez le noyau : "make dep && make clean && make bzImage && make modules && make modules_install" Mettez en place le nouveau noyau qui prend en charge HTB : cp /usr/src/linux/arch/i386/bzImage /boot/vmlinuz cp /usr/src/linux/arch/i386/boot/System.map /boot Vous devez aussi mettre jour la commande "tc" : http://luxik.cdi.cz/~devik/qos/htb /v2/tc.gz Faites un "chmod u+x HTB.init-[VERSION]" an de le rendre excutable. Copiez le script dans le rpertoire /usr/bin : "cp HTB.init-[VERSION] /usr/bin" Crez le rpertoire /etc/syscong/htb qui contiendra les chiers de gestion de BP sur lequelles se basera le script : "mkdir /etc/syscong/htb" - Si vous souhaitez placer vos chiers de congurations HTB ailleurs, modiez la variable $HTB_PATH dans le script HTB.init an de renseigner le nouveau chemin. Exemples de chiers de congurations HTB.init : Il n'existe pas un mais plusieurs chiers de congurations pour HTB.init. Les chiers doivent obligatoirement avoir une syntaxe prcise. Par exemple : eth0-2 -> classe root ID 2, device eth0 eth0-2:3 -> classe lle ID 3, ayant comme parent 2, device eth0
8 of 22 25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

eth0-2:3:4 -> classe lle ID 4, ayant comme parent 3, device eth0 eth1-2.root -> classe root ID 2, device eth1 Remarque : Une autre notation en cas d'erreur lors de la creation de ce type de chiers : eth0-2\:3 -> Vous placez un "\" avant le ":" Cela peut paratre un peu confu comme syntaxe, cependant, je vais vous donner des exemples. Editez le script si vous souhaitez nanmoins en savoir plus ce sujet. Avec ce type de les d'attentes, vous ne pouvez realiser un contrle de ux qu'en sortie de vos interfaces rseaux. Dans le cas d'une station qui fait du routage, congurez les dbits sur les sorties des deux interfaces (voir exemple 2). Exemple 1 : Imaginons que vous ayez une bande passante sur votre station de 5 Mbits/s (~600Ko/s). Vous souhaitez : 5Mbits/s pour le HTTP , 3Mbits/s pour le SMTP 1Kbit/s pour le trac divers (qui vous importent peu) Dans le cas o il y a de la bande passante de libre, vous souhaitez la partager entre le SMTP et tracs divers. SMTP pourra utiliser tout le temps au moins 3Mbits/s et pourra monter jusqu' 5 Mbits/s si il y a de la BP de libre. Le trac divers pourra utiliser tout le temps au moins 1Kbit/s et pourra monter jusqu' 5Mbits/s si il y a de la BP de libre. Allez dans le rpertoire /etc/syscong/htb ($HTB_PATH) et placez-y les lignes suivantes pour chaque chier : chier eth0 DEFAULT=30 # ID class default - Le trac non rpertori utilisera la class ID 30 chier eth0-2.root RATE=5Mbit # Bande passante alloue a la classe root (ici 5Mbits) BURST=15k chier eth0-2:10.www RATE=5Mbit BURST=15k LEAF=sfq # Type de le d'attente utilise par cette classe (ici sfq) RULE=*:80, # Voir les exemples du script CBQ.init - La syntaxe "RULE" est identique chier eth0-2:20.smtp RATE=3Mbit CEIL=5Mbit # La bande passante max de cette classe peut aller jusqu'a 5 Mbits/s uniquement si il y a de la BP de libre. BURST=15k LEAF=sfq
9 of 22 25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

RULE=*:25 chier eth0-2:30.d RATE=1Kbit CEIL=5Mbit BURST=15k LEAF=sfq Exemple 2 : On traite ici le cas d'une personne ayant une connexion ADSL de type 512/128. Sa connexion se fait via une machine-routeur possdant deux interfaces (eth0 et eth1). Elle souhaite limiter l'upload 90 Kbits/s (11,3 Ko/s) et donner la priorit aux services HTTP , SSH, TELNET, POP3, SMTP et DNS. Une priorit plus petite sera attribue tout autre trac. Ct, download on garde la mme ide, cependant, la limite sera xe 450 Kbits/s (57 Ko/s). Allez dans le rpertoire /etc/syscong/htb ($HTB_PATH) et placez-y les lignes suivantes pour chaque chier : chier eth1 (Tous chier de type eth1* -> trac sortant de l'interface eth1) DEFAULT=30 R2Q=1 chier eth1-2.root #Classe root pour trac sortant RATE=90Kbit chier eth1-2\:10.high # Classe pour trac sortant de haute priorit RATE=30Kbit CEIL=prate LEAF=sfq #HTTP RULE=*:80 #SSH RULE=*:22 #TELNET RULE=*:23 #SMTP RULE=*:25 #DNS RULE=*:53 #POP3 RULE=*:110 chier eth1-2\:20.normal # Classe pour trac sortant normal RATE=30kbit

10 of 22

25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

CEIL=prate LEAF=sfq #IRC RULE=*:6667 chier eth1-2\:30.low # Classe pour trac sortant peu important RATE=20Kbit CEIL=prate LEAF=sfq #EMULE RULE=*:3000 RULE=*:3000, RULE=*:3010 RULE=*:3010, RULE=*:4662 RULE=*:4662, chier eth0 (Tous chier de type eth0* -> trac sortant de l'interface eth0) DEFAULT=30 R2Q=10 chier eth0-2\:10.high # Classe pour trac sortant de haute priorit RATE=150 Kbit CEIL=prate LEAF=sfq #HTTP RULE=*:80, #SSH RULE=*:22, #TELNET RULE=*:23, #SMTP RULE=*:25, #DNS RULE=*:53, #POP3 RULE=*:110, chier eth0-2\:20.normal # Classe pour trac sortant normal RATE=30kbit CEIL=prate LEAF=sfq #IRC RULE=*:6667, chier eth0-2\:30.low # Classe pour trac sortant peu important
11 of 22 25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

RATE=150Kbit CEIL=prate LEAF=sfq #EMULE RULE=*:3000, RULE=*:3010, RULE=*:4662, RULE=*:3000 RULE=*:3010 RULE=*:4662 RULE=*:4662 RULE=*:4662, Il ne reste plus qu' lancer le script HTB.init chaque dmarrage ; pour cela ditez le /etc/rc.d/rc.local et ajoutez la ligne "HTB.init-[version] start" o [VERSION] dsigne la version de votre script HTB. Si vous souhaitez obtenir des statistiques HTB, lancez la commande "HTB.init-[VERSION] stats". Le script vous sortira des informations qui peuvent s'avrer utile. [modier] wondershaper Rcuprez wondershaper l'adresse suivante : http://lartc.org/wondershaper Editez le script wshaper et indiquez les dbits ; par exemple pour une ligne ADSL 512/128 : DOWNLINK= 500 UPLINK= 100 DEV=ppp0 Dsormais, votre machine avec ce script : maintient une bonne ractivit pour le trac interactif (ssh, telnet...) vous pouvez surfer sans soucis lors de gros downloads l'upload ne dfavorise pas le download et inversement. J'ai trouv sur internet un script driv de Wondershaper, il peut s'avrer intressant de le mettre en oeuvre si vous avez une connexion de type ADSL. En revanche, ce script fait appel de nombreuses les d'attentes : CBQ, RED, IMQ, HTB et SFQ (Assurez-vous au pralable que votre noyau les prend toutes en compte). #!/bin/bash # # mon_limiteur - Limiteur et classicateur de trac pour modem Cable ou ADSL. # Inspir de WonderShaper (www.lartc.org) #

12 of 22

25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

# crit par Dan Singletary (7/8/02) # # Remarque - ce script suppose que le noyau a t patch avec les les # HTB et IMQ disponibles ici (les noyaux venir ne demanderont # pas forcment l'application d'un correctif): # http://luxik.cdi.cz/~devik/qos/htb/ # http://luxik.cdi.cz/~patrick/imq/ # # Options de conguration pour mon_limiteur: # DEV - correspond au priphrique ethX connect au modem # RATEUP - positionner une valeur infrieure la bande # passante montante de la ligne. # Pour ma ligne ADSL en 1500/128, RATEUP=90 convient au rythme # montant de 128 kbps. vous d'ajuster. # RATEDN - positionner en dessous de la bande passante descendante de # la ligne. # # # Principe d'utilisation d'imq pour limiter le trac entrant: # # Il est impossible de limiter directement le rythme auquel les # donnes vous sont envoyes depuis l'Internet. An de limiter le # trac entrant, on s'appuie sur les mcanismes anti-congestion de # TCP . Ceci signie que SEUL LE TRAFIC TCP PEUT SE LIMITER. Le # trac hors TCP est plac dans une queue prioritaire car le jeter # ne conduit vraisemblablement qu' une retransmission ultrieure # qui accrot la bande passante consomme. # On limite le trac TCP en jetant les paquets lorsqu'ils dbordent # de la le HTB qui les limitera un certain rythme (RATEDN) # lgrement infrieur la capacit relle de la ligne. Jeter ces # paquets revient en singer la perte par la le d'mission du # ct du FAI. Ceci a l'avantage d'viter la congestion de la le # d'mission chez le FAI puisque TCP ralentira avant qu'elle ne # se remplisse. L'usage d'une stratgie de mise en attente base sur # la classication des paquets par priorit permet de ne PAS jeter # certains types de paquets (ssh, telnet, etc). Les paquets ne sont # retirs des les d'attente de faible priorit qu'une fois que # chaque classe a atteint un seuil minimum (1/7 de la bande passante # dans ce script). # # Rsum: # * La perte d'un paquet TCP diminue le rythme de rception de la # connexion associe via les mcanismes de contrle de congestion. # * Jeter des paquets TCP n'apporte rien. S'ils sont importants, ils # seront retransmis. # * Limiter le rythme des connexions TCP entrantes en dessous de la # capacit de la ligne DEVRAIT viter la mise en attente des paquets # du ct du FAI (DSLAM, concentrateur de cables, etc). L'exprience
13 of 22 25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

# indique que ces les contiennent 4 secondes de trac 1500 kbps, # soit 6 Mb de donnes. ce niveau, l'absence de mise en attente # diminue la latence. # # Avertissements: # * Est-ce que la limitation de bande passante diminue l'ecacit de # transferts TCP massifs ? # - Apparemment non. L'augmentation de priorit des paquets # d'acquittement maximise le dbit en vitant de perdre de la bande # passante retransmettre des paquets dj reus. # # NOTE: La conguration ci-dessous fonctionne avec ma connexion ADSL # 1.5M/128K via Pacic Bell Internet (SBC Global Services) DEV=eth0 RATEUP=90 RATEDN=700 # Nettement infrieur la capacit de la ligne de 1500. # On n'a donc pas limiter le trac entrant jusqu' ce # qu'une meilleure ralisation telle que la modication # de fentre TCP soit disponible. # # Fin des options de conguration # if [ "$1" = "status" ] then echo "[qdisc]" tc -s qdisc show dev $DEV tc -s qdisc show dev imq0 echo "[class]" tc -s class show dev $DEV tc -s class show dev imq0 echo "[lter]" tc -s lter show dev $DEV tc -s lter show dev imq0 echo "[iptables]" iptables -t mangle -L MONLIMITEUR-OUT -v -x 2> /dev/null iptables -t mangle -L MONLIMITEUR-IN -v -x 2> /dev/null exit # Remise zro tc qdisc del dev $DEV root 2> /dev/null > /dev/null tc qdisc del dev imq0 root 2> /dev/null > /dev/null iptables -t mangle -D POSTROUTING -o $DEV -j MONLIMITEUR-OUT 2> /dev/null > /dev/null
14 of 22 25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

iptables -t mangle -F MONLIMITEUR-OUT 2> /dev/null > /dev/null iptables -t mangle -X MONLIMITEUR-OUT 2> /dev/null > /dev/null iptables -t mangle -D PREROUTING -i $DEV -j MONLIMITEUR-IN 2> /dev/null > /dev/null iptables -t mangle -F MONLIMITEUR-IN 2> /dev/null > /dev/null iptables -t mangle -X MONLIMITEUR-IN 2> /dev/null > /dev/null ip link set imq0 down 2> /dev/null > /dev/null rmmod imq 2> /dev/null > /dev/null if [ "$1" = "stop" ] then echo "Limitation de dbit dsactive sur $DEV." exit

########################################################## # # Limitation de trac sortant (limite suprieure RATEUP) # positionnement de la taille de la le d'mission pour obtenir # une latence d'environ 2 secondes pour les paquets de la le # de faible priorit. ip link set dev $DEV qlen 30 # modication de MTU du priphrique sortant. # - Diminuer la MTU abaisse la latence mais dgrade le dbit en raison de # la surcharge IP et TCP . ip link set dev $DEV mtu 1000 # ajout de la stratgie HTB tc qdisc add dev $DEV root handle 1: htb default 26 # ajout de la classe de limitation principale tc class add dev $DEV parent 1: classid 1:1 htb rate ${RATEUP}kbit # ajout des classes lles: # - chaque classe dispose AU MOINS de son quota de bande passante. Aucune # classe n'est donc toue par les autres. Chaque classe peut galement # consommer toute la bande passante si aucune autre classe ne l'emploie. tc class add dev $DEV parent 1:1 classid 1:20 htb rate $[$RATEUP/7]kbit \ ceil ${RATEUP}kbit prio 0 tc class add dev $DEV parent 1:1 classid 1:21 htb rate $[$RATEUP/7]kbit \ ceil ${RATEUP}kbit prio 1 tc class add dev $DEV parent 1:1 classid 1:22 htb rate $[$RATEUP/7]kbit \ ceil ${RATEUP}kbit prio 2 tc class add dev $DEV parent 1:1 classid 1:23 htb rate $[$RATEUP/7]kbit \ ceil ${RATEUP}kbit prio 3 tc class add dev $DEV parent 1:1 classid 1:24 htb rate $[$RATEUP/7]kbit \
15 of 22 25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

ceil ${RATEUP}kbit prio 4 tc class add dev $DEV parent 1:1 classid 1:25 htb rate $[$RATEUP/7]kbit \ ceil ${RATEUP}kbit prio 5 tc class add dev $DEV parent 1:1 classid 1:26 htb rate $[$RATEUP/7]kbit \ ceil ${RATEUP}kbit prio 6 # ajout de la stratgie aux classes lles # - SFQ ore un traitement sensiblement quitable de chaque classe. tc qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10 tc qdisc add dev $DEV parent 1:21 handle 21: sfq perturb 10 tc qdisc add dev $DEV parent 1:22 handle 22: sfq perturb 10 tc qdisc add dev $DEV parent 1:23 handle 23: sfq perturb 10 tc qdisc add dev $DEV parent 1:24 handle 24: sfq perturb 10 tc qdisc add dev $DEV parent 1:25 handle 25: sfq perturb 10 tc qdisc add dev $DEV parent 1:26 handle 26: sfq perturb 10 # rpartition du trac en classe via fwmark # - le trac est rparti en classes de priorit suivant l'indicateur # fwmark des paquets (ceux-ci sont positionns avec iptables un peu plus # loin). La classe de priorit par dfaut a t mise 1:26 de telle sorte # que les paquets qui ne sont pas marqus se retrouvent dans la classe de # priorit la plus faible. tc lter add dev $DEV parent 1:0 prio 0 protocol ip handle 20 fw owid 1:20 tc lter add dev $DEV parent 1:0 prio 0 protocol ip handle 21 fw owid 1:21 tc lter add dev $DEV parent 1:0 prio 0 protocol ip handle 22 fw owid 1:22 tc lter add dev $DEV parent 1:0 prio 0 protocol ip handle 23 fw owid 1:23 tc lter add dev $DEV parent 1:0 prio 0 protocol ip handle 24 fw owid 1:24 tc lter add dev $DEV parent 1:0 prio 0 protocol ip handle 25 fw owid 1:25 tc lter add dev $DEV parent 1:0 prio 0 protocol ip handle 26 fw owid 1:26 # ajout de MONLIMITEUR-OUT la table de modication des paquets d'iptables # - ceci dclare la table employe pour ltrer et classer les paquets iptables -t mangle -N MONLIMITEUR-OUT iptables -t mangle -I POSTROUTING -o $DEV -j MONLIMITEUR-OUT # ajout de fwmark pour classer les dirents types de trac # - fwmark est positionn de 20 26 suivant la classe. 20 correspond la # priorit la plus forte. # Trac sur les ports bas iptables -t mangle -A MONLIMITEUR-OUT -p tcp --sport 0:1024 -j MARK --set-mark 23 # Trac sur les ports bas iptables -t mangle -A MONLIMITEUR-OUT -p tcp --dport 0:1024 -j MARK --set-mark 23 # Port ftp-data, faible priorit iptables -t mangle -A MONLIMITEUR-OUT -p tcp --dport 20 -j MARK --set-mark 26

16 of 22

25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

# Messagerie Immdiate AOL iptables -t mangle -A MONLIMITEUR-OUT -p tcp --dport 5190 -j MARK --set-mark 23 # ICMP (ping) - forte priorit (impressionnez vos amis) iptables -t mangle -A MONLIMITEUR-OUT -p icmp -j MARK --set-mark 20 # DNS (petits paquets) iptables -t mangle -A MONLIMITEUR-OUT -p udp -j MARK --set-mark 21 # shell scuris iptables -t mangle -A MONLIMITEUR-OUT -p tcp --dport ssh -j MARK --set-mark 22 # shell scuris iptables -t mangle -A MONLIMITEUR-OUT -p tcp --sport ssh -j MARK --set-mark 22 # telnet (hum ...) iptables -t mangle -A MONLIMITEUR-OUT -p tcp --dport telnet -j MARK --set-mark 22 # telnet (hum ...) iptables -t mangle -A MONLIMITEUR-OUT -p tcp --sport telnet -j MARK --set-mark 22 # IPSec - la surcharge n'est pas connue ... iptables -t mangle -A MONLIMITEUR-OUT -p ipv6-crypt -j MARK --set-mark 24 # Serveur WWW local iptables -t mangle -A MONLIMITEUR-OUT -p tcp --sport http -j MARK --set-mark 25 # Petits paquets (des ACK probablement) iptables -t mangle -A MONLIMITEUR-OUT -p tcp -m length --length :64 -j MARK --set-mark 21 # Rptition - on marque les paquets restants 26 (faible priorit) iptables -t mangle -A MONLIMITEUR-OUT -m mark --mark 0 -j MARK --set-mark 26 # Fin de la limitation sortante # #################################################### echo "Limitation de trac sortant activ sur $DEV. Dbit: ${RATEUP}kbit/sec." # Dcommenter la ligne suivante pour n'avoir que la limitation de trac montant. # exit

#################################################### # # Limitation du trac entrant (dbit maximal de RATEDN)

17 of 22

25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

# on force le chargement du module imq modprobe imq numdevs=1 ip link set imq0 up # ajout de la stratgie de mise en le d'attente # - par dfaut une classe 1:21 faible priorit tc qdisc add dev imq0 handle 1: root htb default 21 # ajout de la classe de limitation principale tc class add dev imq0 parent 1: classid 1:1 htb rate ${RATEDN}kbit # ajout des classes lles # - trac TCP en 21, le reste en 20 # tc class add dev imq0 parent 1:1 classid 1:20 htb rate $[$RATEDN/2]kbit \ ceil ${RATEDN}kbit prio 0 tc class add dev imq0 parent 1:1 classid 1:21 htb rate $[$RATEDN/2]kbit \ ceil ${RATEDN}kbit prio 1 # ajout de la stratgie de limitation aux classes lles # - voir les remarques ci-dessus sur SFQ. tc qdisc add dev imq0 parent 1:20 handle 20: sfq perturb 10 tc qdisc add dev imq0 parent 1:21 handle 21: red limit 1000000 \ min 5000 max 100000 avpkt 1000 burst 50 # rpartition du trac en classe via fwmark # - le trac est rparti en classes de priorit suivant l'indicateur # fwmark des paquets (ceux-ci sont positionns avec iptables un peu plus # loin). La classe de priorit par dfaut t mise 1:26 de telle sorte # que les paquets qui ne sont pas marqus se retrouvent dans la classe de # priorit la plus faible. tc lter add dev imq0 parent 1:0 prio 0 protocol ip handle 20 fw owid 1:20 tc lter add dev imq0 parent 1:0 prio 0 protocol ip handle 21 fw owid 1:21 # ajout de MONLIMITEUR-IN la table de modication des paquets d'iptables iptables -t mangle -N MONLIMITEUR-IN iptables -t mangle -I PREROUTING -i $DEV -j MONLIMITEUR-IN # ajout de fwmark pour classer les dirents types de trac # - fwmark est positionn de 20 21 suivant la classe. 20 correspond la # priorit la plus forte. # Forte priorit pour les paquets non TCP iptables -t mangle -A MONLIMITEUR-IN -p ! tcp -j MARK --set-mark 20

18 of 22

25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

# Les petits paquets TCP sont probablement des ACK iptables -t mangle -A MONLIMITEUR-IN -p tcp -m length --length :64 -j MARK --set-mark 20 # shell scuris iptables -t mangle -A MONLIMITEUR-IN -p tcp --dport ssh -j MARK --set-mark 20 # shell scuris iptables -t mangle -A MONLIMITEUR-IN -p tcp --sport ssh -j MARK --set-mark 20 # telnet (hum ...) iptables -t mangle -A MONLIMITEUR-IN -p tcp --dport telnet -j MARK --set-mark 20 # telnet (hum ...) iptables -t mangle -A MONLIMITEUR-IN -p tcp --sport telnet -j MARK --set-mark 20 # Rptition - les paquets sans marque sont positionns 21 (faible priorit) iptables -t mangle -A MONLIMITEUR-IN -m mark --mark 0 -j MARK --set-mark 21 # on envoie les paquets prcdents l'interface imq0. iptables -t mangle -A MONLIMITEUR-IN -j IMQ # Fin de la limitation de trac entrant. # #################################################### echo "Limitation de trac entrant active sur $DEV. Dbit: ${RATEDN}kbit/sec."

[modier] Script de visualisation des les d'attentes


Le script suivant visualise les les d'attentes : #!/bin/bash echo 'Qdisc' tc -s qdisc show dev eth0 echo 'Classes' tc -s class show dev eth0 echo 'Filter' tc -s lter show dev eth0

[modier] Conclusion
J'ai essay travers cet article de vous ammener un maximum de renseignements, cependant, je n'ai pas la prtention d'en faire un document rfrence (il y a l'excellent HOWTO QoS pour cela). Toutes les remarques sont les bienvenues, il serait intressant de faire voluer ce prsent document avec les commentaires que vous y apporterez. Si vous avez des scripts HTB.init, ou CBQ.init perso, n'hesitez pas me les

19 of 22

25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

envoyer, je les rajouterai dans cet article. Pour me contacter : guitarparts@fr.st

@ Retour la rubrique Rseau et scurit

Cette page est issue de la documentation 'pr-wiki' de La a t convertie avec HTML::WikiConverter. Elle fut cre par Julien Lecubin le 25/05/2003.

[modier] Copyright
Copyright 25/05/2003, Julien Lecubin Ce document est publi sous licence Creative Commons Attribution, Partage l'identique, Contexte non commercial 2.0 : http://creativecommons.org/licenses/by-nc-sa/2.0/fr/ Rcupre de http://www.lea-linux.org/docs/index.php?title=Leapro-pro_reseauqos&oldid=19468 Catgories : Rseau local La pour les pros CC-BY-NC-SA

Achages Aller : Navigation, rechercher Outils personnels Crer un compte Connexion Navigation Accueil Communaut Actualits Modications rcentes Page au hasard Aide

20 of 22

25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

Rechercher

Lire
Pages spciales

Rechercher

Pages lies Suivi des pages lies Pages spciales Version imprimable Adresse de cette version Imprimer au format PDF La-Linux Contacts Condentialits Faire un don Fortunes Documentations Dcouvrir Linux Fiches pratiques Trucs & Astuces Lannuaire Logithque Drivothque Rubriques Installation Environnement graphique Matriel Logiciel Rseau Administration Noyau et modules Dveloppement La-Avanc La communaut Forums Mailing-List IRC Cette page a t consulte 10 929 fois. Sous licence Attribution-Share Alike 3.0 Unported Politique de condentialit propos de Lea Linux Avertissements Serveur hberg par ST-Hebergement et Lost-Oasis / IRC hberg par FreeNode / NS secondaire hberg par XName Sauf mention contraire, les documentations publies sont sous licence Creative-

21 of 22

25/04/2013 13:26

Leapro-pro reseau-qos - Lea Linux

http://lea-linux.org/documentations/Leapro-pro_reseau-qos

Commons CC-BY-SA Dernire modication de cette page le 27 avril 2011 21:51.

22 of 22

25/04/2013 13:26