Je l'ai fait en utilisant une combinaison de TC et iptables hashlimit. J'ai créé un limiteur de bande passante TC en sortie sur l'interface LAN (pour cibler le trafic de téléchargement) réglé sur 5 Mbits/seconde. J'utilise ensuite le module hashlimit d'iptables dans la chaîne de contrôle de sortie de l'interface de sorte que si le débit de paquets dépasse un certain seuil, entre deux adresses IP source et destination distinctes, il commence à classer ces paquets dans la classe de mise en forme du trafic TC 5 Mbits/s.
Vous devez définir le seuil de paquets correctement, cependant, et j'ai basé le mien sur le fait que mon MTU est de 1500 octets, donc utilisé ceci pour calculer combien de paquets par seconde cela serait pour créer un seuil de 1,5 Mbits par seconde (1000 paquets/seconde). Si l'on ajoute à cela la définition de la valeur de rafale la plus élevée possible sur le module iptables hashlimit (qui, sur ma configuration, semble être de 10 000), le résultat de tout cela est que les téléchargements courts se déroulent à pleine vitesse, mais que les téléchargements plus longs commencent à ralentir car certains paquets passent dans la classe de limitation de la bande passante TC, ce qui diminue évidemment le taux de paquets, etc. etc. C'est un peu une pirouette, mais étonnamment cela fonctionne, et cela fonctionne bien. Et parce que le TC est utilisé, aucun paquet n'est jamais abandonné - simplement retardé et ralenti en raison du passage dans la classe TC une fois que le taux de paquets est atteint.
Ceci est sur une boîte CentOS 6. Je pense que les versions plus modernes permettent au module hashlimit de prendre en charge les octets par seconde, et pas seulement les paquets par seconde, ce qui est encore mieux, mais j'ai essayé de le faire sur ma configuration et cela revient à l'utilisation des paquets par seconde.
Je suis sur un téléphone portable et je ne peux pas coller de configuration, mais si vous voulez des exemples, dites-le moi et je modifierai cette réponse. J'aime vraiment cette solution car la limitation que j'ai choisie est basée sur l'IP source et destination. Ainsi, le système voit chaque combinaison distincte src+dst IP comme son propre flux de paquets à limiter. Le module hashlimit prend également en charge les ports source et destination (en fait, toute combinaison d'IP source, port source, IP destination, port destination), de sorte que vous pourriez même effectuer la limitation sur une base par session entre IP source+port et IP destination+port.
UPDATE
Voici donc en gros comment procéder ; il faudra faire des essais.
tc :
/sbin/tc qdisc add dev eth0 root handle 1: htb
/sbin/tc class add dev eth0 parent 1: classid 1:1 htb rate 5Mbit
iptables :
#!/bin/bash
[[ "$1" =~ ^[ADI]$ ]] || exit 1
for IPT in /sbin/ip{,6}tables
do
$IPT -t mangle -$1 POSTROUTING -o eth0 -m hashlimit --hashlimit-above 1000/second --hashlimit-burst 10000 --hashlimit-mode srcip,dstip --hashlimit-name limiter -j CLASSIFY --set-class 1:1
done