J'ai des doutes sur la structure HTB que j'utilise.
Mon objectif est de limiter la vitesse de téléchargement et de téléchargement des utilisateurs d'un réseau local. Chaque utilisateur du réseau a une liste personnelle de domaines avec une vitesse descendante et ascendante pour le domaine qu'il ne peut pas dépasser.
Cela signifie que l'utilisateur1 peut avoir son accès sur slashdot.org limité à 8 Ko en téléchargement et 3 Ko en téléchargement, et utilisateur2 peut avoir sur slashdot.org un accès restreint de 4 Ko vers le bas et de 1 Ko vers le haut.
Pour l'instant, j'ai configuré un couple iptables / tc qui fonctionne très bien, mais à très petite échelle, en utilisant 2 ou 3 hôtes virtuels en même temps (malheureusement, je ne peux pas effectuer de test de taille réelle).
Voici ma structure actuelle (je ne montrerai que celle sur la sortie du LAN, celle pour le téléchargement étant simplement une "copie" de celle-ci)
Un qdisc HTB (handle 2 :) attaché à l'interface, la classe de trafic par défaut est la classe FFFF.
La classe racine 2: 1 directement sous le qdisc HTB ayant pour taux et plafond la capacité DOWNLINK.
La classe par défaut 2: FFFF en tant qu'enfant de 2: 1, avec un taux de 1kbsp et un plafond de capacité DOWNLINK.
Ensuite, il y a d'autres classes ajoutées dynamiquement quand il y a une nouvelle restriction pour un utilisateur d'un certain domaine, une nouvelle classe tc est ajoutée pour contrôler la vitesse de téléchargement depuis son domaine.
Pour l'instant, voici ce que j'ai fait:
Créez une nouvelle classe tc avec un identifiant unique (tiré d'une base de données, pas le point ici), en tant que parent de la classe 2: 1, la valeur du débit est de 1 bps, la valeur de plafond est définie sur la vitesse de téléchargement limitée.
Voici les commandes tc:
-------------- BEGIN SCRIPT --------------
DOWNLINK=800
## Setting up the static tc qdisc and class
$tc qdisc add dev $LAN_IFACE root handle 2: htb default 0xFFFF
# Main class so the default class can borrow bandwith from the others
$tc class replace dev $LAN_IFACE parent 0x2: classid 0x2:0x1 htb rate $DOWNLINK ceil $DOWNLINKkbps
# add the default class of class id 2:a under the main class of classid 2:1
$tc class replace dev $LAN_IFACE parent 0x2:0x1 classid 0x2:0xFFFF htb rate 1kbps ceil $DOWNLINKkbps prio 0
# add to the leaf class 2:10 for default traffic a sfq qdisc
$tc qdisc add dev $LAN_IFACE parent 0x2:0xFFFF handle 0xFFFF: sfq perturb 10
## The dynamic part called each time a new restriction for a couple domain/user is added
$tc class replace dev $LAN_IFACE parent 0x2:0x1 classid 0x2:0x$idHex htb rate 1bps ceil $speedDownkbps prio 1
# Add the sfq at the leaf class 2:1$id
$tc qdisc add dev $LAN_IFACE parent 0x2:0x$idHex handle 0x$idHex: sfq perturb 10
# $id is the mark added by iptables for this couple domain/user
$tc filter replace dev $LAN_IFACE parent 0x2:0 protocol ip prio 3 handle 0x$id fw flowid 0x2:0x$idHex
-------------- END SCRIPT --------------
Tout le trafic normal (sans restriction de vitesse) doit aller dans la classe par défaut, et celui restreint doit être envoyé à sa classe tc correspondante.
Le point dont je doute sérieusement est l'utilisation du taux de vitesse minimal de 1bps pour la classe par défaut et la classe restreinte. Je ne peux pas contrôler le nombre de classes restreintes qui seront créées et je ne veux pas que le taux total de la classe restreinte soit supérieur à celui de la classe racine.
Un autre point, j'ai ajouté la valeur par défaut le prio 0, et la classe restreinte le prio 1, donc au cas où la classe par défaut devrait emprunter (presque toujours selon son taux très lent), cette classe sera servie avant l'autre domaine restreint. Mais ces domaines ne mourront-ils pas de faim si je garde le plafond de la classe par défaut comme celui de la classe racine?
Comment puis-je réussir à permettre aux utilisateurs de conserver une interactivité et une bande passante décentes pour une utilisation non restreinte, tout en limitant la vitesse pour plusieurs couples domaines / utilisateur?
Je me demande également si la classe par défaut est utile ici, car si je ne spécifie pas de classe par défaut pour le qdisc htb, les paquets ne correspondant pas aux filtres seront retirés de la file d'attente à la vitesse matérielle. (mais là encore avec la famine restreinte?)
Je suis vraiment nouveau sur le tc et le réseau QoS, donc tous les conseils, critiques (constructifs;)) seront les bienvenus.
Vincent.
la source