#!/bin/bash # Limiteur de bande passante inspiré du travail de # Dan Singletary lui meme inspiré de # Inspiré de WonderShaper (www.lartc.org) # François Boisson (3 Avril 2003) # # 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/ # # # DEV ---> périphérique de sortie # # RATEUP ---> Bande passante maximale en upload # # DEV=eth1 # prévoir un nombre divisible par N et valant en gros 80% de la bande maximum # donnée lors de la connexion ADSL en upload (chiffre ici pour 160Kbits/s) # le rapport RATEUP/PART doit être entier #P0=1 P0=40 P1=1 P2=1 P3=1 P4=1 P5=1 P6=1 PART=$[$P0+$P1+$P2+$P3+$P4+$P5+$P6] UNITE=8 RATEUP=$[$PART*$UNITE] # 0: Ping # 1: DNS, petits paquets de longueurs < 64, BattleNet, CS, UDP # 2: telnet, ssh, X, VNC # Edonkey reception (port perso 3662) et serveur # 3: Traffic sur les ports bas,messagerie AOL et MSN # 4: FTP-DATA # 5: WWW # 6: Edonkey upload, reste # # proportions des bandes passantes sur les 7 files de priorités # elles valent Pi/PART donc Somme(Pi,i=0..6)=PART # # Fin des options de configuration # affecte() # affecte nom sens port protocole categorie # sens = s ou d, protocole = udp ou tcp categorie = 0->? # { echo [$1 : $5] # shell sécurisé iptables -t mangle -A MONLIMITEUR-OUT -p $4 --$2port $3 -j MARK --set-mark 2$5 } # if [ "$1" = "status" ] then echo "[qdisc]" tc -s qdisc show dev $DEV echo "[class]" tc -s class show dev $DEV echo "[filter]" tc -s filter show dev $DEV echo "[iptables]" iptables -t mangle -L MONLIMITEUR-OUT -v -x 2> /dev/null exit fi # Remise à zéro tc qdisc del dev $DEV 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 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 # que dalle, ne pas trop diminuer les performances, personnellement # je ne le fais pas # ajout de la stratégie HTB # les noms des queues sont de 20 à 26, je les conserve # 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. # poids différents pour les classes # C'est l'intéret des classes filles si j'ai bien compris, les classes mères # ne partage pas leur part de bande passante # # Ping tc class add dev $DEV parent 1:1 classid 1:20 htb \ rate $[($RATEUP*$P0)/$PART]kbit \ ceil ${RATEUP}kbit prio 0 # DNS, petits paquets, BattleNet tc class add dev $DEV parent 1:1 classid 1:21 htb \ rate $[($RATEUP*$P1)/$PART]kbit \ ceil ${RATEUP}kbit prio 1 # telnet, ssh,X tc class add dev $DEV parent 1:1 classid 1:22 htb \ rate $[($RATEUP*$P2)/$PART]kbit \ ceil ${RATEUP}kbit prio 2 # ports bas, messagerie AOL, MSN tc class add dev $DEV parent 1:1 classid 1:23 htb \ rate $[($RATEUP*$P3)/$PART]kbit \ ceil ${RATEUP}kbit prio 3 # WWW tc class add dev $DEV parent 1:1 classid 1:24 htb \ rate $[($RATEUP*$P4)/$PART]kbit \ ceil ${RATEUP}kbit prio 4 # Edonkey (à l'origine) tc class add dev $DEV parent 1:1 classid 1:25 htb \ rate $[($RATEUP*$P5)/$PART]kbit \ ceil ${RATEUP}kbit prio 5 # ftp-data (à l'origine), reste tc class add dev $DEV parent 1:1 classid 1:26 htb \ rate $[($RATEUP*$P6)/$PART]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. # # Ici mettre les règles personnelles ici, cela dépend de la configuration # personnelle # Trafic sur les ports bas affecte "port bas" s 0:1024 tcp 3 affecte "port bas" d 0:1024 tcp 3 # Petits paquets (des ACK probablement) echo [petits paquets: 1] iptables -t mangle -A MONLIMITEUR-OUT -p tcp -m length --length :64 -j MARK \ --set-mark 21 iptables -t mangle -A MONLIMITEUR-OUT -p tcp -m length --length 65:128 \ -j MARK --set-mark 22 # Port ftp-data, faible priorité affecte "FTP data" s 20 tcp 4 affecte "FTP data" d 20 tcp 4 affecte "FTP" s 21 tcp 3 affecte "FTP" d 21 tcp 3 # Messagerie Immédiate AOL affecte AOL d 5190 tcp 23 # Messagerie Immédiate MSN affecte "MSN" d 1863 tcp 3 affecte "MSN" d 6891 udp 4 affecte "MSN" d 6891 tcp 4 affecte "MSN" s 1863 tcp 3 affecte "MSN" s 6891 udp 4 affecte "MSN" s 6891 tcp 4 # ICMP (ping) - forte priorité (impressionnez vos amis) echo "[ping : 0]" iptables -t mangle -A MONLIMITEUR-OUT -p icmp -j MARK \ --set-mark 20 # DNS (petits paquets) affecte "DNS" d 53 udp 1 # shell sécurisé affecte "SSH" d ssh tcp 2 affecte "SSH" s ssh tcp 2 # telnet affecte "telnet" d telnet tcp 2 affecte "telnet" s telnet tcp 2 # Serveur WWW local affecte "Apache" s http tcp 5 affecte "Apache" s 8080 tcp 5 affecte "Apache-candidat" s 5555 tcp 5 # Serveur WWW local affecte "Apache jury agreg" s 443 tcp 3 # # X affecte "X11" d 6000 tcp 2 affecte "X11" d 6000 udp 2 # VNC affecte "VNC" s 5901:5905 tcp 2 affecte "VNC" s 5901:5905 udp 2 # BattleNet affecte "BattleNet" d 6112:6119 tcp 1 affecte "BattleNet" d 6112:6119 udp 1 affecte "BattleNet" s 6112:6119 tcp 1 affecte "BattleNet" s 6112:6119 udp 1 affecte "BattleNet" s 4000 tcp 1 affecte "BattleNet" d 4000 tcp 1 affecte "BattleNet" d 4000 udp 1 affecte "BattleNet" s 4000 udp 1 # CS affecte "CounterStrike" d 27000:27045 udp 0 affecte "CounterStrike" s 27000:27030 udp 0 # quake3 affecte "Quake3" d 27960 udp 1 affecte "Quake3" s 27960 udp 1 # a priori pas de TCP # Xmule affecte "Xmule" s 3662 tcp 6 affecte "Xmule" s 3672 udp 6 affecte "Xmule" d 5259 udp 2 # # Répétition - 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 trafic sortant activé sur $DEV. Débit: ${RATEUP}kbit/sec."