2 votes

QOS avec iptables et tc avec WAN instable

J'ai un routeur/une passerelle sous Linux, je veux ajouter de la QoS pour réserver de la bande passante pour un flux spécifique. Cela peut être fait avec iptables/netfilter et tc, mais tous les exemples partent du fait que vous connaissez à l'avance la bande passante totale disponible.

Le problème est que mon WAN est une connexion 3G mobile, avec des performances variables. Le premier jour, je peux avoir 5 Mbps, et le deuxième jour de pluie, je n'ai plus que 2 Mbps. Comment puis-je garantir que mon flux 1 aura toujours 100Kbps disponibles avec une faible latence ?

J'ai pensé à une solution complexe, avec un script quotidien ou horaire pour vérifier la bande passante et créer et appliquer dynamiquement des script de QoS, mais ce n'est pas une bonne solution pour moi.

0 votes

Il semble que vous ayez besoin d'un script/programme qui peut déterminer votre bande passante, qui est exempt de votre mise en forme du trafic et qui peut ajuster vos paramètres tc automatiquement, peut-être via cron ou udev.

1voto

setenforce 1 Points 898

Vous devriez être en mesure d'atteindre votre objectif avec le programmateur du hfsc. Vous aurez la possibilité de réserver une partie de la bande passante et de garantir une faible latence avec le "temps réel", les autres classes rempliront proportionnellement le reste de la bande passante avec le "linkshare".

Il est important ici d'utiliser le temps réel et non le partage de liens, car le temps réel, afin d'être sûr de pouvoir envoyer un paquet à la toute dernière miliseconde, est capable d'empêcher l'autre classe d'envoyer un paquet.

Afin d'accomplir ce que vous voulez, vous devez définir une limite supérieure élevée sur la classe racine (10MB peut-être), mais pas sur les classes feuilles. En raison de la façon dont hfsc linkshare partage la bande passante entre toutes les classes "ls", elles partageront la bande passante disponible, au-delà de la valeur m2 s'il y en a plus.

Par exemple, vous pouvez utiliser ce type de configuration :

# dns, ntp, teamspeak
iptables -t mangle -A POSTROUTING -o eth0 -p udp -m multiport --dports 53,123,9987 -j CLASSIFY --set-class 1:100
# Default tcp
iptables -t mangle -A POSTROUTING -o eth0 -p tcp -j CLASSIFY --set-class 1:200
# Default udp
iptables -t mangle -A POSTROUTING -o eth0 -p udp -j CLASSIFY --set-class 1:300

# ROOT QDISC - default goes on class 100 because it's probably arp gratuitous or whois since all ip traffic is already classified
tc qdisc add dev eth0 root handle 1:0 hfsc default 100

# ROOT CLASS - Interface eth0, noeud parent de la branche : 1:0, id de la branche : 1:10
tc class add dev eth0 parent 1:0 classid 1:10 hfsc ls m2 10000kbit ul m2 10000kbit

# CLASS 100 - VOIP, DNS, NTP
tc class add dev eth0 parent 1:10 classid 1:100 hfsc sc m1 400kbit d 10ms m2 100kbit
# QDISC
tc qdisc add dev eth0 parent 1:100 handle 110: fq_codel quantum 300 noecn # fq_codel requires to change the quantum for low bandwitdth

# CLASS 200 - some tcp
tc class add dev eth0 parent 1:10 classid 1:200 hfsc ls m1 80kbit d 10ms m2 80kbit
# QDISC - some tcp
tc qdisc add dev eth0 parent 1:200 handle 210: fq_codel

# CLASS 300 - some udp
tc class add dev eth0 parent 1:10 classid 1:300 hfsc ls m1 20kbit d 10ms m2 20kbit # ratio tcp / udp will then be 4:1
# QDISC - some udp
tc qdisc add dev eth0 parent 1:300 handle 310: fq_codel quantum 300 noecn

Les valeurs peuvent être modifiées en fonction de vos besoins, en particulier dans la classe 100, bien que j'aie essayé d'écrire ces chiffres pour qu'ils correspondent à votre 3G.

Vous devriez lire davantage sur l'homme tc-hfsc, ce poste y cet article pour en savoir plus sur le hfsc et son fonctionnement.

0 votes

Réponse très complète et prometteuse, je vais l'essayer, merci.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X