Version : 1.3.fr.1.0
16 juillet 2004
Historique des versions | ||
---|---|---|
Version 1.3.fr.1.0 | 2004-07-16 | GL |
Mise à jour de la traduction française. | ||
Version 1.3 | 2003-04-07 | DS |
Ajout d'une section de liens (Added links section). | ||
Version 1.2.fr.1.0 | 2003-03-01 | FR, GL, JPG |
Première traduction française. | ||
Version 1.2 | 2002-09-26 | DS |
Ajout d'un lien vers la nouvelle liste de diffusion. Ajout d'une petite information dans la section d'avertissement concernant la nouvelle QoS améliorée pour Linux, créée spécifiquement pour l'ADSL et bientôt disponible (Added link to new Email Discussion List. Added small teaser to caveat section regarding new and improved QoS for Linux designed specifically for ADSL to be released soon). | ||
Version 1.1 | 26-08-2002 | DS |
Quelques corrections (merci au nombreuses personnes m'ayant montré les problèmes!). Ajout d'une information dans la section d'implémentation. (A few corrections (Thanks to the many that pointed them out!). Added informational caveat to implementation section.) | ||
Version 1.0 | 21-08-2002 | DS |
Meilleur contrôle au niveau de la bande passante, plus de théorie, mise à jour pour les noyaux 2.4. (Better control over bandwidth, more theory, updated for 2.4 kernels) | ||
Version 0.1 | 06-08-2002 | DS |
Première publication (Initial publication) |
Résumé
Ce document décrit la configuration d'un routeur Linux pour gérer efficacement le trafic sortant à destination d'un modem ADSL ou de tout autre équipement de bande passante similaire (modem câble, RNIS, etc). Un accent particulier est apporté à la diminution de latence pour le trafic de type interactif et ce même durant les périodes de congestion.
Table des matières
La dernière version de ce document se trouve sur l'Internet à l'adresse: http://www.tldp.org.
Les mises à jours seront reproduites dans divers sites web et ftp Linux tels que le LDP: http://www.tldp.org.
Inscrivez-vous à la liste de diffusion de gestion de la bande passante pour l'ADSL http://jared.sonicspike.net/mailman/listinfo/adsl-qos afin de poser des questions ou de recevoir des informations de mise à jour.
![]() | Important |
---|---|
Le texte ci-dessous est la licence de ce document. Ce texte fait foi. Il est composé de la licence (en anglais) du document original, suivi de la licence (en français) de sa traduction. |
Il vous est autorisé de copier, distribuer et/ou modifier ce document sous les termes de la licence GNU Free Documentation License, Version 1.1 ou toute version ultérieure publiée par la Free Software Foundation avec les sections inaltérables suivantes: texte de première page de couverture, texte de dernière page de couverture. Une copie de la licence est disponible sur http://www.gnu.org/copyleft/fdl.html.
Copyright © 2003, 2004 François Romieu, Guillaume Lelarge et Jean-Philippe Guérard pour la version française
La version française de ce document a été réalisée par François Romieu, Guillaume Lelarge et Jean-Philippe Guérard. Elle est publiée en accord avec les termes de la licence de documentation libre GNU (GFDL), version 1.1 ou ultérieure, telle que publiée par la Free Software Foundation ; sans section invariante, sans texte de première de couverture ni texte de quatrième de couverture.
Merci de faire parvenir à l'auteur vos questions et commentaires relatifs à ce document, en anglais, via l'adresse : dvsing@sonicspike.net.
N'hésitez pas à faire parvenir tout commentaire relatif à la version
française de ce document à <commentaires CHEZ traduc POINT org>
en précisant son titre, sa date et sa version.
file d'attente HTB - http://luxik.cdi.cz/~devik/qos/htb/
Remarque : on signale que les noyaux Mandrake au delà de la version 2.4.18-3 (versions 8.1 et 8.2 de la distribution Mandrake) incluent le correctif HTB.
périphérique IMQ - http://luxik.cdi.cz/~patrick/imq/
iptables v1.2.6a ou suivantes. Le module length est absent de la version d'iptables distribuée avec la Red Hat 7.3
![]() | Note |
---|---|
Les versions antérieures de ce document impliquaient une méthode de contrôle de la bande passante qui passait par l'application d'un correctif à la queue sch_prio existante. Il s'est avéré que ce correctif était inutile. De surcroît, l'approche retenue dans ce texte donne de meilleurs résultats (quoiqu'à la date de rédaction de ce document, l'application de 2 correctifs au noyau soit nécessaire :o) ). |
Ce document a été repris pour faire usage d'une nouvelle file d'attente dans Linux, dite de type HTB (Hierarchical Token Bucket). La file HTB ressemble à la file à n voies décrite précédemment mais elle rend possible la limitation de trafic dans chaque classe. En outre, elle autorise la création d'une hiérarchie de classes de trafic. Une description complète d'HTB dépasse le cadre de ce document. Davantage d'informations sont disponibles sur le site http://www.lartc.org
![]() | Note |
---|---|
Les files HTB permettent à la fois la limitation de trafic et l'envoi prioritaire tout en assurant qu'aucune classe de priorité n'étouffe les autres. Ce dernier point n'était pas possible avec la méthode préconisée par la version 0.1 de ce document. |
![]() | Note |
---|---|
Remarque: les affirmations antérieures de cette section (concernant la mise en file d'attente à N voies) se sont avérées erronées. En l'occurrence, il était possible de classer les paquets dans les éléments de la file de priorité juste au moyen du champ fwmark. Cette fonctionnalité n'était toutefois guère documentée lors de la rédaction de la version 0.1 du guide pratique. |
![]() | Note |
---|---|
Remarque: cette documentation reposait à l'origine sur ipchains pour trier les paquets. iptables est à présent utilisé. |
Tout ce qui précède est bien sûr personnalisable en fonction des besoins.
Après toutes ces explications, il est temps de passer à la mise en oeuvre sous Linux.
![]() | Note |
---|---|
Ce script s'inspire du WonderShaper ADSL disponible sur le site du LARTC. |
#!/bin/bash # # mon_limiteur - Limiteur et classificateur de trafic pour modem Cable ou ADSL. # Inspiré de WonderShaper (www.lartc.org) # # Écrit par Dan Singletary (7/8/02) # # Remarque - ce script suppose que le noyau a été patché avec les files # HTB et IMQ disponibles ici (les noyaux à venir ne demanderont # pas forcément l'application d'un correctif): # http://luxik.cdi.cz/~devik/qos/htb/ # http://luxik.cdi.cz/~patrick/imq/ # # Options de configuration pour mon_limiteur: # DEV - correspond au périphérique ethX connecté au modem # RATEUP - à positionner à une valeur inférieure à la bande # passante montante de la ligne. # Pour ma ligne ADSL en 1500/128, RATEUP=90 convient au rythme # montant de 128kbps. A vous d'ajuster. # RATEDN - à positionner en dessous de la bande passante descendante de # la ligne. # # # Principe d'utilisation d'imq pour limiter le trafic entrant: # # Il est impossible de limiter directement le rythme auquel les # données vous sont envoyées depuis l'Internet. Afin de limiter le # trafic entrant, on s'appuie sur les mécanismes anti-congestion de # TCP. Ceci signifie que SEUL LE TRAFIC TCP PEUT SE LIMITER. Le # trafic hors TCP est placé dans une queue prioritaire car le jeter # ne conduit vraisemblablement qu'à une retransmission ultérieure # qui accroît la bande passante consommée. # On limite le trafic TCP en jetant les paquets lorsqu'ils débordent # de la file HTB qui les limitera à un certain rythme (RATEDN) # légèrement inférieur à la capacité réelle de la ligne. Jeter ces # paquets revient à en singer la perte par la file d'émission du # côté du FAI. Ceci a l'avantage d'éviter la congestion de la file # d'émission chez le FAI puisque TCP ralentira avant qu'elle ne # se remplisse. L'usage d'une stratégie de mise en attente basée sur # la classification des paquets par priorité permet de ne PAS jeter # certains types de paquets (ssh, telnet, etc). Les paquets ne sont # retirés des files 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). # # Résumé: # * La perte d'un paquet TCP diminue le rythme de réception de la # connexion associée via les mécanismes de contrôle 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 côté du FAI (DSLAM, concentrateur de cables, etc). L'expérience # indique que ces files contiennent 4 secondes de trafic à 1500kbps, # soit 6Mb de données. A ce niveau, l'absence de mise en attente # diminue la latence. # # Avertissements: # * Est-ce que la limitation de bande passante diminue l'efficacité de # transferts TCP massifs ? # - Apparemment non. L'augmentation de priorité des paquets # d'acquittement maximise le débit en évitant de perdre de la bande # passante à retransmettre des paquets déjà reçus. # # NOTE: La configuration ci-dessous fonctionne avec ma connexion ADSL # 1.5M/128K via Pacific Bell Internet (SBC Global Services) DEV=eth0 RATEUP=90 RATEDN=700 # Nettement inférieur à la capacité de la ligne de 1500. # On n'a donc pas à limiter le trafic entrant jusqu'à ce # qu'une meilleure réalisation telle que la modification # de fenêtre TCP soit disponible. # # Fin des options de configuration # 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 "[filter]" tc -s filter show dev $DEV tc -s filter 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 fi # Remise à zéro 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 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 débit désactivée sur $DEV." exit fi ########################################################### # # Limitation de trafic sortant (limite supérieure à RATEUP) # positionnement de la taille de la file d'émission pour obtenir # une latence d'environ 2 secondes pour les paquets de la file # de faible priorité. ip link set dev $DEV qlen 30 # modification de MTU du périphérique sortant. # - Diminuer la MTU abaisse la latence mais dégrade le débit en raison de # la surcharge IP et TCP. ip link set dev $DEV mtu 1000 # ajout de la stratégie 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 filles: # - chaque classe dispose AU MOINS de son quota de bande passante. Aucune # classe n'est donc étouffée 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 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 stratégie aux classes filles # - SFQ offre 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 # répartition du trafic en classe via fwmark # - le trafic est réparti en classes de priorité suivant l'indicateur # fwmark des paquets (ceux-ci sont positionnés avec iptables un peu plus # loin). La classe de priorité par défaut a été mise à 1:26 de telle sorte # que les paquets qui ne sont pas marqués se retrouvent dans la classe de # priorité la plus faible. tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20 tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 21 fw flowid 1:21 tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 22 fw flowid 1:22 tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 23 fw flowid 1:23 tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 24 fw flowid 1:24 tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 25 fw flowid 1:25 tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 26 fw flowid 1:26 # ajout de MONLIMITEUR-OUT à la table de modification des paquets d'iptables # - ceci déclare la table employée pour filtrer 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 différents types de trafic # - fwmark est positionné de 20 à 26 suivant la classe. 20 correspond à la # priorité la plus forte. iptables -t mangle -A MONLIMITEUR-OUT -p tcp --sport 0:1024 -j MARK --set-mark 23 # Trafic sur les ports bas iptables -t mangle -A MONLIMITEUR-OUT -p tcp --dport 0:1024 -j MARK --set-mark 23 # "" iptables -t mangle -A MONLIMITEUR-OUT -p tcp --dport 20 -j MARK --set-mark 26 # Port ftp-data, faible priorité iptables -t mangle -A MONLIMITEUR-OUT -p tcp --dport 5190 -j MARK --set-mark 23 # Messagerie Immédiate AOL iptables -t mangle -A MONLIMITEUR-OUT -p icmp -j MARK --set-mark 20 # ICMP (ping) - forte priorité (impressionnez vos amis) iptables -t mangle -A MONLIMITEUR-OUT -p udp -j MARK --set-mark 21 # DNS (petits paquets) iptables -t mangle -A MONLIMITEUR-OUT -p tcp --dport ssh -j MARK --set-mark 22 # shell sécurisé iptables -t mangle -A MONLIMITEUR-OUT -p tcp --sport ssh -j MARK --set-mark 22 # shell sécurisé 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 # telnet (hum...) iptables -t mangle -A MONLIMITEUR-OUT -p ipv6-crypt -j MARK --set-mark 24 # IPSec - la surcharge n'est pas connue... iptables -t mangle -A MONLIMITEUR-OUT -p tcp --sport http -j MARK --set-mark 25 # Serveur WWW local iptables -t mangle -A MONLIMITEUR-OUT -p tcp -m length --length :64 -j MARK --set-mark 21 # Petits paquets (des ACK probablement) iptables -t mangle -A MONLIMITEUR-OUT -m mark --mark 0 -j MARK --set-mark 26 # Répétition - on marque les paquets restants à 26 (faible priorité) # Fin de la limitation sortante # #################################################### echo "Limitation de trafic sortant activé sur $DEV. Débit: ${RATEUP}kbit/sec." # Décommenter la ligne suivante pour n'avoir que la limitation de trafic montant. # exit #################################################### # # Limitation du trafic entrant (débit maximal de RATEDN) # on force le chargement du module imq modprobe imq numdevs=1 ip link set imq0 up # ajout de la stratégie de mise en file d'attente # - par défaut 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 filles # - trafic 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 stratégie de limitation aux classes filles # - 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 # répartition du trafic en classe via fwmark # - le trafic est réparti en classes de priorité suivant l'indicateur # fwmark des paquets (ceux-ci sont positionnés avec iptables un peu plus # loin). La classe de priorité par défaut à été mise à 1:26 de telle sorte # que les paquets qui ne sont pas marqués se retrouvent dans la classe de # priorité la plus faible. tc filter add dev imq0 parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20 tc filter add dev imq0 parent 1:0 prio 0 protocol ip handle 21 fw flowid 1:21 # ajout de MONLIMITEUR-IN à la table de modification 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 différents types de trafic # - fwmark est positionné de 20 à 21 suivant la classe. 20 correspond à la # priorité la plus forte. iptables -t mangle -A MONLIMITEUR-IN -p ! tcp -j MARK --set-mark 20 # Forte priorité pour les paquets non TCP iptables -t mangle -A MONLIMITEUR-IN -p tcp -m length --length :64 -j MARK --set-mark 20 # Les petits paquets TCP sont probablement des ACK iptables -t mangle -A MONLIMITEUR-IN -p tcp --dport ssh -j MARK --set-mark 20 # shell sécurisé iptables -t mangle -A MONLIMITEUR-IN -p tcp --sport ssh -j MARK --set-mark 20 # shell sécurisé 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 # telnet (hum...) iptables -t mangle -A MONLIMITEUR-IN -m mark --mark 0 -j MARK --set-mark 21 # Répétition - les paquets sans marque sont positionnés à 21 (faible priorité) # on envoie les paquets précédents à l'interface imq0. iptables -t mangle -A MONLIMITEUR-IN -j IMQ # Fin de la limitation de trafic entrant. # #################################################### echo "Limitation de trafic entrant activée sur $DEV. Débit: ${RATEDN}kbit/sec."
Contrôleur de bande passante pour Windows (Bandwidth Controller for Windows) — http://www.bandwidthcontroller.com
dsl_qos_queue - (bêta) pour Linux. Pas de correctifs pour le noyau et de meilleurs performances