3/11/2008
La gestion des files d’attentePrincipe :Le principe général est le suivant :
• Sélectionner le type de paquet à traiter dans la couche netfilter, par exemple, les paquets « interactifs » d’une session ssh (port 22), les paquets correspondant à la réception du mail (port 25), etc.
• Marquer ces paquets avec la directive --set-mark de netfilter
• Modifier et hiérarchiser la file d’attente des paquets concernés à l’aide d’un gestionnaire ad hoc (le meilleur gestionnaire sous Linux est htb, Hierarchical Token Bucket).
CBQNotre gestion de la bande passante se fera via des files d'attente basées sur du Class Based Queueing (CBQ) sur notre GW.
Nous ferons usage d'iptables pour sélectionner et marquer les paquets et donc leur attribuer une classe.
Définition : CBQ est une file d'attente permettant de stocker d'autres files en fonction des classes pré-déterminées.
Dans un premier temps, nous devons définir une file d'attente racine pour le périphérique eth1 dans notre cas.
- Code:
tc qdisc add dev eth1 vénérable grand maitre handle 100: cbq bandwidth 100Mbit avpkt 1000 mpu 64
L'utilitaire tc (Traffic Control) est utilisé ici pour créer (add) une queuing discipline (qdisc) pour eth1, le nom est 100:, la bande passante de l'interface 100Mbit, une taille moyenne de paquets fixée à 1000 octets et une taille minimum fixée à 64 octets.
Nous définissons ensuite deux classes (branches), une par type de connexion :
- Code:
# tc class add dev eth1 parent 100:0 classid 100:1 cbq bandwidth 10Mbit rate 40Kbit allot 1514 prio 1 maxburst 10 avpkt 100 isolated
Cette première classe nommée 100:1 possède le moins de bande passante (rate 40Kbit), mais une priorité supérieure (prio 1). En effet, une connexion intéractive n'a, habituellement, pas besoin d'une bande passante très grande, mais pour éviter le lag, ce type de connexion doit avoir priorité sur toutes les autres. Le paramètre isolated indique que la bande passante de 40Kbit ne doit pas être empruntée par les autres classes. Nous nous assurons un débit minimum. En revanche, cette classe possède la faculté de prendre de la bande passante aux autres dans la mesure du possible.
Voici la définition pour la seconde classe :
- Code:
# tc class add dev eth10 parent 100:0 classid 100:2 cbq bandwidth 10Mbit rate 450Kbit allot 1514 prio 8 maxburst 2 avpkt 1500 bounded
Cette classe limite sa bande passante à 450Kbit et ne doit jamais dépasser cette limite (bounded). Elle possède également une priorité bien inférieure à la précédente.
Nous utilisons ensuite iptables pour marquer les paquets. Nous distinguons deux types de connexion ici :
• les paquets d'une taille inférieure à 500 sont considérés comme étant des connexions intéractives (ssh, telnet, http, etc.)
• les paquets d'une taille > 500 font partis des autres connexions
Nous utilisons donc la table mangle pour marquer les paquets des sessions intéractives avec une valeur 3 et les autres avec une valeur 4 :
- Code:
# iptables -t mangle -A OUTPUT -m length --length 0:500 -j MARK --set-mark 3
- Code:
#iptables -t mangle -A OUTPUT -m length --length 500:0xffff-j MARK --set-mark 4
Nos classes sont maintenant définies, il ne nous reste plus qu'à indiquer quelle classe utiliser pour chaque type de connexion. Cette fois, ce sera le paramètre filter de tc qui sera utilisé :
- Code:
# tc filter add dev eth1 parent 100:0 protocol ip handle 3 fw flowid 100:1
- Code:
# tc filter add dev eth1 parent 100:0 protocol ip handle 4 fw flowid 100:2
On retrouve notre marque (handle 3 et handle 4), le CBQ parent (100:0) et respectivement les classes à utiliser pour chaque type de connexion (flowid 100:1 et flowid 100:2).