Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

QoS

4 réponses
Avatar
JKB
Bonjour à tous,

Considérons un serveur connecté à deux interfaces WAN (eth1 et eth2,
le LAN est sur eth0).

Les adresses IP sont les suivantes :
eth1 : 192.168.254.1
eth1:1 : 192.168.254.81
...
eth1:6 : 192.168.254.86

eth2 : 192.168.253.1

Tourne sur cette machine un proxy qui tire au hasard une adresse
entre eth1:1 et eth1:6 pour se connecter sur les serveurs distants.
Ça fonctionne.

Je veux rajouter une QoS sur cette machine. Pour cela, j'ai tagué
les différents paquets comme suit :

[0:0] -A POSTROUTING -p icmp -o eth1 -j MARK --set-mark 10
[0:0] -A POSTROUTING -p icmp -o eth2 -j MARK --set-mark 10
[0:0] -A POSTROUTING -p udp --dport domain -o eth1 -j MARK --set-mark 20
[0:0] -A POSTROUTING -p udp --sport domain -o eth1 -j MARK --set-mark 20
[0:0] -A POSTROUTING -p udp --sport domain -o eth2 -j MARK --set-mark 20
[0:0] -A POSTROUTING -p udp --dport ntp -o eth1 -j MARK --set-mark 20
[0:0] -A POSTROUTING -p udp --sport ntp -o eth1 -j MARK --set-mark 20
[0:0] -A POSTROUTING -p udp --sport ntp -o eth2 -j MARK --set-mark 20
[0:0] -A POSTROUTING -p tcp --sport 3128 -o eth2 -j MARK --set-mark 30
[0:0] -A POSTROUTING -p tcp --sport ssh -o eth1 -j MARK --set-mark 40
[0:0] -A POSTROUTING -p tcp --sport ssh -o eth2 -j MARK --set-mark 40

tc qdisc add dev eth1 root handle 1: htb default 100
tc qdisc add dev eth2 root handle 2: htb default 100

tc class add dev eth1 parent 1:0 classid 1:1 htb \
rate 1100kbit mtu 1500
tc class add dev eth2 parent 2:0 classid 2:1 htb \
rate 3mbit mtu 1500

tc class add dev eth1 parent 1:1 classid 1:10 htb \
rate 10kbit ceil 1100kbit prio 1
tc class add dev eth1 parent 1:1 classid 1:20 htb \
rate 200kbit ceil 1100kbit prio 2
tc class add dev eth1 parent 1:1 classid 1:40 htb \
rate 500kbit ceil 1100kbit prio 4
tc class add dev eth2 parent 2:1 classid 2:10 htb \
rate 10kbit ceil 3mbit prio 1
tc class add dev eth2 parent 2:1 classid 2:20 htb \
rate 200kbit ceil 3mbit prio 2
tc class add dev eth2 parent 2:1 classid 2:30 htb \
rate 1mbit ceil 2mbit prio 3
tc class add dev eth2 parent 2:1 classid 2:40 htb rate \
500kbit ceil 3mbit prio 4

tc filter add dev eth1 parent 1: protocol ip prio 1 handle 10 \
fw flowid 1:10
tc filter add dev eth1 parent 1: protocol ip prio 2 handle 20 \
fw flowid 1:20
tc filter add dev eth1 parent 1: protocol ip prio 4 handle 40 \
fw flowid 1:40
tc filter add dev eth2 parent 2: protocol ip prio 1 handle 10 \
fw flowid 2:10
tc filter add dev eth2 parent 2: protocol ip prio 2 handle 20 \
fw flowid 2:20
tc filter add dev eth2 parent 2: protocol ip prio 3 handle 30 \
fw flowid 2:30
tc filter add dev eth2 parent 2: protocol ip prio 4 handle 40 \
fw flowid 2:40

J'aimerais avec cela que les l'ICMP, le ssh et certains autres
protocoles aient un débit minimal réservé et que le reste utilise la
bande passante restante. Visiblement, j'ai raté quelque chose
puisque cela ne fonctionne pas. Une requête sur le serveur apache
est capable de monopoliser toute la bande disponible au détriment
des autres protocoles.

Une idée ?

Cordialement,

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
=> http://loubardes.de-charybde-en-scylla.fr

4 réponses

Avatar
Damien Wyart
Je veux rajouter une QoS sur cette machine. Pour cela, j'ai tagué
les différents paquets comme suit :

[0:0] -A POSTROUTING -p icmp -o eth1 -j MARK --set-mark 10
[0:0] -A POSTROUTING -p icmp -o eth2 -j MARK --set-mark 10
[0:0] -A POSTROUTING -p udp --dport domain -o eth1 -j MARK --set-mark 20
[0:0] -A POSTROUTING -p udp --sport domain -o eth1 -j MARK --set-mark 20
[0:0] -A POSTROUTING -p udp --sport domain -o eth2 -j MARK --set-mark 20
[0:0] -A POSTROUTING -p udp --dport ntp -o eth1 -j MARK --set-mark 20
[0:0] -A POSTROUTING -p udp --sport ntp -o eth1 -j MARK --set-mark 20
[0:0] -A POSTROUTING -p udp --sport ntp -o eth2 -j MARK --set-mark 20
[0:0] -A POSTROUTING -p tcp --sport 3128 -o eth2 -j MARK --set-mark 30
[0:0] -A POSTROUTING -p tcp --sport ssh -o eth1 -j MARK --set-mark 40
[0:0] -A POSTROUTING -p tcp --sport ssh -o eth2 -j MARK --set-mark 40



Je ne sais pas quelle table va être affectée quand elle n'est pas
précisée par -t. De mon côté, sur une configuration qui fonctionne,
j'utilise "-t mangle".

J'aimerais avec cela que les l'ICMP, le ssh et certains autres
protocoles aient un débit minimal réservé et que le reste utilise la
bande passante restante. Visiblement, j'ai raté quelque chose
puisque cela ne fonctionne pas. Une requête sur le serveur apache
est capable de monopoliser toute la bande disponible au détriment
des autres protocoles.



Peux-tu générer du trafic et voir ce que donnent ensuite :

tc -s qdisc show dev eth1
tc -s qdisc show dev eth2
tc -s class show dev eth1
tc -s class show dev eth2
tc -s filter show dev eth1
tc -s filter show dev eth2
iptables -t mangle -L POSTROUTING -v -x

--
DW
Avatar
JKB
Le Fri, 09 Jan 2015 17:36:13 +0100,
Damien Wyart écrivait :
Je veux rajouter une QoS sur cette machine. Pour cela, j'ai tagué
les différents paquets comme suit :



[0:0] -A POSTROUTING -p icmp -o eth1 -j MARK --set-mark 10
[0:0] -A POSTROUTING -p icmp -o eth2 -j MARK --set-mark 10
[0:0] -A POSTROUTING -p udp --dport domain -o eth1 -j MARK --set-mark 20
[0:0] -A POSTROUTING -p udp --sport domain -o eth1 -j MARK --set-mark 20
[0:0] -A POSTROUTING -p udp --sport domain -o eth2 -j MARK --set-mark 20
[0:0] -A POSTROUTING -p udp --dport ntp -o eth1 -j MARK --set-mark 20
[0:0] -A POSTROUTING -p udp --sport ntp -o eth1 -j MARK --set-mark 20
[0:0] -A POSTROUTING -p udp --sport ntp -o eth2 -j MARK --set-mark 20
[0:0] -A POSTROUTING -p tcp --sport 3128 -o eth2 -j MARK --set-mark 30
[0:0] -A POSTROUTING -p tcp --sport ssh -o eth1 -j MARK --set-mark 40
[0:0] -A POSTROUTING -p tcp --sport ssh -o eth2 -j MARK --set-mark 40



Je ne sais pas quelle table va être affectée quand elle n'est pas
précisée par -t. De mon côté, sur une configuration qui fonctionne,
j'utilise "-t mangle".



C'est effectivement mangle (c'était plus haut dans le script).

J'aimerais avec cela que les l'ICMP, le ssh et certains autres
protocoles aient un débit minimal réservé et que le reste utilise la
bande passante restante. Visiblement, j'ai raté quelque chose
puisque cela ne fonctionne pas. Une requête sur le serveur apache
est capable de monopoliser toute la bande disponible au détriment
des autres protocoles.



Peux-tu générer du trafic et voir ce que donnent ensuite :

tc -s qdisc show dev eth1


qdisc htb 1: root refcnt 2 r2q 10 default 100 direct_packets_stat 387056
direct_qlen 1000
Sent 388346855 bytes 477128 pkt (dropped 0, overlimits 8745 requeues 0)
backlog 0b 0p requeues 0

tc -s qdisc show dev eth2


qdisc htb 2: root refcnt 2 r2q 10 default 100 direct_packets_stat 264464
direct_qlen 1000
Sent 405804120 bytes 418855 pkt (dropped 0, overlimits 83161 requeues
0)
backlog 0b 0p requeues 0

tc -s class show dev eth1


class htb 1:1 root rate 1100Kbit ceil 1100Kbit burst 1499b cburst 1499b
Sent 10402832 bytes 90584 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 7122 borrowed: 0 giants: 0
tokens: 150288 ctokens: 150288

class htb 1:10 parent 1:1 prio 1 rate 10Kbit ceil 1100Kbit burst 1600b
cburst 1599b
Sent 2951516 bytes 28793 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 28757 borrowed: 36 giants: 0
tokens: 18725000 ctokens: 170221

class htb 1:20 parent 1:1 prio 2 rate 200Kbit ceil 1100Kbit burst 1600b
cburst 1599b
Sent 4617746 bytes 48672 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 41684 borrowed: 6988 giants: 0
tokens: 884721 ctokens: 161647

class htb 1:40 parent 1:1 prio 4 rate 500Kbit ceil 1100Kbit burst 1600b
cburst 1599b
Sent 2833570 bytes 13119 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 13021 borrowed: 98 giants: 0
tokens: 378500 ctokens: 172039

tc -s class show dev eth2


class htb 2:1 root rate 3Mbit ceil 3Mbit burst 1500b cburst 1500b
Sent 132393479 bytes 154392 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 41408 borrowed: 0 giants: 0
tokens: 59750 ctokens: 59750

class htb 2:10 parent 2:1 prio 1 rate 10Kbit ceil 3Mbit burst 1600b
cburst 1599b
Sent 1280763 bytes 15065 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 11862 borrowed: 3203 giants: 0
tokens: 18725000 ctokens: 62406

class htb 2:20 parent 2:1 prio 2 rate 200Kbit ceil 3Mbit burst 1600b
cburst 1599b
Sent 166363 bytes 871 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 871 borrowed: 0 giants: 0
tokens: 861250 ctokens: 57406

class htb 2:30 parent 2:1 prio 3 rate 1Mbit ceil 2Mbit burst 1600b
cburst 1600b
Sent 18725615 bytes 33535 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 27123 borrowed: 6412 giants: 0
tokens: -78235 ctokens: -58235

class htb 2:40 parent 2:1 prio 4 rate 500Kbit ceil 3Mbit burst 1600b
cburst 1599b
Sent 112220738 bytes 104921 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 73128 borrowed: 31793 giants: 0
tokens: 374958 ctokens: 63906

tc -s filter show dev eth1


filter parent 1: protocol ip pref 1 fw
filter parent 1: protocol ip pref 1 fw handle 0xa classid 1:10
filter parent 1: protocol ip pref 2 fw
filter parent 1: protocol ip pref 2 fw handle 0x14 classid 1:20
filter parent 1: protocol ip pref 4 fw
filter parent 1: protocol ip pref 4 fw handle 0x28 classid 1:40

tc -s filter show dev eth2


filter parent 2: protocol ip pref 1 fw
filter parent 2: protocol ip pref 1 fw handle 0xa classid 2:10
filter parent 2: protocol ip pref 2 fw
filter parent 2: protocol ip pref 2 fw handle 0x14 classid 2:20
filter parent 2: protocol ip pref 3 fw
filter parent 2: protocol ip pref 3 fw handle 0x1e classid 2:30
filter parent 2: protocol ip pref 4 fw
filter parent 2: protocol ip pref 4 fw handle 0x28 classid 2:40

iptables -t mangle -L POSTROUTING -v -x


Chain POSTROUTING (policy ACCEPT 1419759 packets, 1012241269 bytes)
pkts bytes target prot opt in out source
destination
28348 2509401 MARK icmp -- any eth1 anywhere
anywhere MARK set 0xa
14964 1059021 MARK icmp -- any eth2 anywhere
anywhere MARK set 0xa
48553 3842389 MARK udp -- any eth1 anywhere
anywhere udp dpt:domain MARK set 0x14
734 139323 MARK udp -- any eth1 anywhere
anywhere udp spt:domain MARK set 0x14
768 146198 MARK udp -- any eth2 anywhere
anywhere udp spt:domain MARK set 0x14
74 5624 MARK udp -- any eth1 anywhere
anywhere udp dpt:ntp MARK set 0x14
129 9804 MARK udp -- any eth1 anywhere
anywhere udp spt:ntp MARK set 0x14
102 7752 MARK udp -- any eth2 anywhere
anywhere udp spt:ntp MARK set 0x14
33499 18244881 MARK tcp -- any eth2 anywhere
anywhere tcp spt:3128 MARK set 0x1e
13206 2666792 MARK tcp -- any eth1 anywhere
anywhere tcp spt:ssh MARK set 0x28
104921 110751844 MARK tcp -- any eth2 anywhere
anywhere tcp spt:ssh MARK set 0x28

J'avais déjà vérifié cela. En revanche, je pensais que les règles tc
réservaient un débit minimal pour certains protocoles et que la
dègle défault (100) passait après les règles explicites.

Pourtant, lorsque apache se met à servir du web, il est capable de
monopoliser toute les lignes...

Cordialement,

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
=> http://loubardes.de-charybde-en-scylla.fr
Avatar
Damien Wyart
* JKB in fr.comp.os.linux.configuration:
> tc -s qdisc show dev eth1
qdisc htb 1: root refcnt 2 r2q 10 default 100 direct_packets_stat 387056
direct_qlen 1000
Sent 388346855 bytes 477128 pkt (dropped 0, overlimits 8745 requeues 0)
backlog 0b 0p requeues 0

> tc -s qdisc show dev eth2
qdisc htb 2: root refcnt 2 r2q 10 default 100 direct_packets_stat 264464
direct_qlen 1000
Sent 405804120 bytes 418855 pkt (dropped 0, overlimits 83161 requeues
0)
backlog 0b 0p requeues 0



Je pense qu'il te manque des qdisc pour chacune des sous-classes, sinon
c'est le qdisc racine qui va mettre en attente l'ensemble des paquets.

Bon, c'est un sujet vraiment pas évident (pourtant les aspects
théoriques sont intéressants), peu et mal documenté (oui, c'est facile
de critiquer et de ne pas contribuer), j'avais passé un temps énorme
à obtenir quelque chose qui fonctionne il y a déjà pas mal d'années et
je n'y ai pas trop touché depuis... Donc je n'ai plus en tête toutes les
subtilités.

Voici à titre d'info une partie de ma config, mais je ne pourrai pas
trop t'aider sur l'ensemble des détails (et je ne garantis pas qu'il n'y
a pas une typo qui traîne)...

--------------------------------------------------------------------------------------
DEV=eth0
RATEUP00
RATEUP_NOTALL%0
RATEUPCLP

if [ "$1" = "status" -o "$1" = "show" -o "$1" = "stats" ];
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 LIMITEUR-OUT -v -x 2> /dev/null
ip6tables -t mangle -L LIMITEUR-OUT -v -x 2> /dev/null
exit
fi

tc qdisc del dev $DEV root 2> /dev/null > /dev/null
iptables -t mangle -D POSTROUTING -o $DEV -j LIMITEUR-OUT 2> /dev/null > /dev/null
iptables -t mangle -F LIMITEUR-OUT 2> /dev/null > /dev/null
iptables -t mangle -X LIMITEUR-OUT 2> /dev/null > /dev/null
ip6tables -t mangle -D POSTROUTING -o $DEV -j LIMITEUR-OUT 2> /dev/null > /dev/null
ip6tables -t mangle -F LIMITEUR-OUT 2> /dev/null > /dev/null
ip6tables -t mangle -X LIMITEUR-OUT 2> /dev/null > /dev/null

modprobe ip_conntrack_ftp
modprobe ipt_length
modprobe ipt_helper

if [ "$1" = "stop" ];
then
echo "Limitation de débit désactivée sur $DEV."
exit
fi

tc qdisc add dev $DEV root handle 1: htb default 50 r2q 8

tc class add dev $DEV parent 1: classid 1:1 htb rate ${RATEUP}kbit ceil ${RATEUP}kbit

tc class add dev $DEV parent 1:1 classid 1:10 htb rate ${RATEUPCL}kbit
ceil ${RATEUP}kbit prio 1 linklayer atm
tc class add dev $DEV parent 1:1 classid 1:20 htb rate ${RATEUPCL}kbit
ceil ${RATEUP}kbit burst 5k prio 2 linklayer atm
tc class add dev $DEV parent 1:1 classid 1:30 htb rate ${RATEUPCL}kbit
ceil ${RATEUP}kbit burst 2k prio 3 linklayer atm
tc class add dev $DEV parent 1:1 classid 1:40 htb rate ${RATEUPCL}kbit
ceil ${RATEUP_NOTALL}kbit burst 300 prio 4 linklayer atm
tc class add dev $DEV parent 1:1 classid 1:50 htb rate ${RATEUPCL}kbit
ceil ${RATEUP_NOTALL}kbit prio 5 linklayer atm
tc class add dev $DEV parent 1:1 classid 1:60 htb rate ${RATEUPCL}kbit
ceil ${RATEUP_NOTALL}kbit burst 300 prio 6 linklayer atm

tc qdisc add dev $DEV parent 1:10 handle 10: pfifo limit 1000
tc qdisc add dev $DEV parent 1:20 handle 20: pfifo limit 1000
tc qdisc add dev $DEV parent 1:30 handle 30: pfifo limit 1000
tc qdisc add dev $DEV parent 1:40 handle 40: pfifo limit 1000
tc qdisc add dev $DEV parent 1:50 handle 50: pfifo limit 1000
tc qdisc add dev $DEV parent 1:60 handle 60: sfq perturb 10 divisor 8

tc filter add dev $DEV parent 1:0 prio 1 protocol ip handle 10 fw flowid 1:10
tc filter add dev $DEV parent 1:0 prio 2 protocol ip handle 20 fw flowid 1:20
tc filter add dev $DEV parent 1:0 prio 3 protocol ip handle 30 fw flowid 1:30
tc filter add dev $DEV parent 1:0 prio 4 protocol ip handle 40 fw flowid 1:40
tc filter add dev $DEV parent 1:0 prio 5 protocol ip handle 50 fw flowid 1:50
tc filter add dev $DEV parent 60: prio 6 protocol ip handle 6 flow hash keys dst divisor 8
tc filter add dev $DEV parent 1:0 prio 6 protocol ip handle 60 fw flowid 1:60

iptables -t mangle -N LIMITEUR-OUT
iptables -t mangle -I POSTROUTING -o $DEV -j LIMITEUR-OUT

iptables -t mangle -A LIMITEUR-OUT -p icmp -j MARK --set-mark 10
iptables -t mangle -A LIMITEUR-OUT -p icmp -j RETURN

iptables -t mangle -A LIMITEUR-OUT -p udp -j MARK --set-mark 20
iptables -t mangle -A LIMITEUR-OUT -p udp -j RETURN

iptables -t mangle -A LIMITEUR-OUT -p tcp -m tos --tos Minimize-Delay -j MARK --set-mark 30
iptables -t mangle -A LIMITEUR-OUT -p tcp -m tos --tos Minimize-Delay -j RETURN

iptables -t mangle -A LIMITEUR-OUT -p tcp -m length --length :64 -j MARK --set-mark 40
iptables -t mangle -A LIMITEUR-OUT -p tcp -m length --length :64 -j RETURN

iptables -t mangle -A LIMITEUR-OUT -p tcp -m helper --helper ftp-data -j MARK --set-mark 60
iptables -t mangle -A LIMITEUR-OUT -p tcp -m helper --helper ftp-data -j RETURN

ip6tables -t mangle -N LIMITEUR-OUT
ip6tables -t mangle -I POSTROUTING -o $DEV -j LIMITEUR-OUT

ip6tables -t mangle -A LIMITEUR-OUT -p icmpv6 -j MARK --set-mark 10
ip6tables -t mangle -A LIMITEUR-OUT -p icmpv6 -j RETURN

ip6tables -t mangle -A LIMITEUR-OUT -p udp -j MARK --set-mark 20
ip6tables -t mangle -A LIMITEUR-OUT -p udp -j RETURN

ip6tables -t mangle -A LIMITEUR-OUT -p tcp -m tos --tos Minimize-Delay -j MARK --set-mark 30
ip6tables -t mangle -A LIMITEUR-OUT -p tcp -m tos --tos Minimize-Delay -j RETURN

ip6tables -t mangle -A LIMITEUR-OUT -p tcp -m length --length :96 -j MARK --set-mark 40
ip6tables -t mangle -A LIMITEUR-OUT -p tcp -m length --length :96 -j RETURN

ip6tables -t mangle -A LIMITEUR-OUT -p tcp -m helper --helper ftp-data -j MARK --set-mark 60
ip6tables -t mangle -A LIMITEUR-OUT -p tcp -m helper --helper ftp-data -j RETURN

echo "Limitation de trafic sortant activé sur $DEV. Débit: ${RATEUP} kbits/sec."
----------------------------------------------------------------------------------------------

Pour atténuer le phénomène de « buffer bloat », j'ai aussi ceci dans sysctl.conf :

net.ipv4.tcp_rmem = 4096 16384 40960
net.ipv4.tcp_ecn = 2
net.ipv4.xfrm4_gc_thresh = 32768

mais là encore c'est de l'ancien et plus de la bidouille que du
scientifique (issu de discussions sur la liste netdev)...

--
DW
Avatar
JKB
Merci pour ces indications. Je vais regarder cela de près.

Cordialement,

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
=> http://loubardes.de-charybde-en-scylla.fr