1 votes

Le filtrage de paquets avec le sélecteur u32 ne fonctionne pas

J'essaie de savoir si la solution de QoS que j'ai intégrée à mon RaspberryPI fonctionne ou non.

J'ai découvert que la classification du trafic par port ne fonctionne pas, j'ai donc essayé de vérifier les filtres utilisés dans la solution de QoS mentionnée sur ma machine Ubuntu.

Voici mon installation factice : (eno1 est une interface Ethernet connectée au Raspberry)

# Root qdisc is prio with 3 bands
sudo tc qdisc add dev eno1 root handle 1: prio bands 3
# Band 1 - port 2323 with low rate, high packet loss probability and big delay
sudo tc qdisc add dev eno1 parent 1:1 netem rate 8kbit delay 500ms loss 0.3% 25%
sudo tc filter add dev eno1 parent 1:0 protocol ip u32 match ip dport 2323 0xffff classid 1:1
sudo tc filter add dev eno1 parent 1:0 protocol ip u32 match ip sport 2323 0xffff classid 1:1
# Band 2 qdisc is tbf and filter is outbound SMTP
sudo tc qdisc add dev eno1 parent 1:2 tbf rate 1mbit buffer 100000 latency 100s
sudo tc filter add dev eno1 parent 1:0 protocol ip u32 match ip dport 25 0xffff classid 1:2
sudo tc filter add dev eno1 parent 1:0 protocol ip u32 match ip sport 25 0xffff classid 1:2
# Band 3 qdisc is sfq and filter is anything unfiltered
sudo tc qdisc add dev eno1 parent 1:3 sfq perturb 16
sudo tc filter add dev eno1 parent 1:0 protocol ip prio 9 u32 match u8 0 0 classid 1:3

J'ai limité le débit et ajouté un retard massif pour tout le trafic entrant et sortant du port 2323. Malheureusement, tous les paquets passent par la bande 3 :

hping3 192.168.2.10 -p 25 -c 5
HPING 192.168.2.10 (eno1 192.168.2.10): NO FLAGS are set, 40 headers + 0 data bytes
len=46 ip=192.168.2.10 ttl=64 DF id=0 sport=25 flags=RA seq=0 win=0 rtt=3.8 ms
len=46 ip=192.168.2.10 ttl=64 DF id=0 sport=25 flags=RA seq=1 win=0 rtt=3.7 ms
len=46 ip=192.168.2.10 ttl=64 DF id=0 sport=25 flags=RA seq=2 win=0 rtt=3.5 ms
len=46 ip=192.168.2.10 ttl=64 DF id=0 sport=25 flags=RA seq=3 win=0 rtt=3.2 ms
len=46 ip=192.168.2.10 ttl=64 DF id=0 sport=25 flags=RA seq=4 win=0 rtt=3.1 ms

--- 192.168.2.10 hping statistic ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 3.1/3.5/3.8 ms

tc -s -d qdisc show dev eno1       
qdisc prio 1: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
 Sent 2612 bytes 26 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
qdisc tbf 800d: parent 1:2 rate 1Mbit burst 100000b/1 mpu 0b lat 100.0s linklayer ethernet 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
qdisc netem 800c: parent 1:1 limit 1000 delay 500.0ms loss 0.3% 25% rate 8Kbit
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
qdisc sfq 800e: parent 1:3 limit 127p quantum 1514b depth 127 flows 128/1024 divisor 1024 perturb 16sec 
 Sent 2612 bytes 26 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0

Mais si j'ajoute la règle suivante à iptables, les paquets sont correctement classés :

iptables -t mangle -A POSTROUTING -o eno1 -p tcp --dport 2323 -j CLASSIFY --set-class 1:1

Je ne veux pas ajouter plus de résultats tc/hping ici, car cela rendrait ma question trop longue, mais je vois le délai de 500 ms dans les statistiques hping, et les paquets que j'envoie au port 2323 sont affichés dans les statistiques tc.

Quelqu'un pourrait-il m'indiquer où rechercher un problème ? Pourquoi le sélecteur u32 ne fonctionne-t-il pas ?

Merci d'avance.

0voto

A.B Points 3913

Note pour ci-dessous : en tc filter ... la syntaxe, pref y prio sont des synonymes, je vais donc utiliser pref /préférence plutôt que prio /priorité afin d'éviter toute confusion avec l'élément non lié prio dans la classe prio qdisc utilisé dans tc qdisc ... .

Les deux premiers groupes de tc filter Les règles pour 1:2 et 1:3 ci-dessus ne spécifient aucune préférence, donc chacune hérite d'une préférence par défaut : à partir de 49152 et en diminuant : les règles les plus récentes ont la priorité sur les règles précédentes par défaut. La dernière commande avec la préférence 9 sera toujours évaluée en premier.

Voici les règles de filtrage affichées en retour. Elles sont affichées par ordre de préférence :

# tc -s filter show dev eno1
filter parent 1: protocol ip pref 9 u32 chain 0 
filter parent 1: protocol ip pref 9 u32 chain 0 fh 804: ht divisor 1 
filter parent 1: protocol ip pref 9 u32 chain 0 fh 804::800 order 2048 key ht 804 bkt 0 flowid 1:3 not_in_hw  (rule hit 5 success 5)
  match 00000000/00000000 at 0 (success 5 ) 
filter parent 1: protocol ip pref 49149 u32 chain 0 
filter parent 1: protocol ip pref 49149 u32 chain 0 fh 803: ht divisor 1 
filter parent 1: protocol ip pref 49149 u32 chain 0 fh 803::800 order 2048 key ht 803 bkt 0 flowid 1:2 not_in_hw  (rule hit 0 success 0)
  match 00190000/ffff0000 at 20 (success 0 ) 
filter parent 1: protocol ip pref 49150 u32 chain 0 
filter parent 1: protocol ip pref 49150 u32 chain 0 fh 802: ht divisor 1 
filter parent 1: protocol ip pref 49150 u32 chain 0 fh 802::800 order 2048 key ht 802 bkt 0 flowid 1:2 not_in_hw  (rule hit 0 success 0)
  match 00000019/0000ffff at 20 (success 0 ) 
filter parent 1: protocol ip pref 49151 u32 chain 0 
filter parent 1: protocol ip pref 49151 u32 chain 0 fh 801: ht divisor 1 
filter parent 1: protocol ip pref 49151 u32 chain 0 fh 801::800 order 2048 key ht 801 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0)
  match 09130000/ffff0000 at 20 (success 0 ) 
filter parent 1: protocol ip pref 49152 u32 chain 0 
filter parent 1: protocol ip pref 49152 u32 chain 0 fh 800: ht divisor 1 
filter parent 1: protocol ip pref 49152 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:1 not_in_hw  (rule hit 0 success 0)
  match 00000913/0000ffff at 20 (success 0 ) 

Il faut donc toujours spécifier une préférence pour chaque règle de filtrage, avec des valeurs faibles pour les règles devant correspondre en premier et utiliser la valeur la plus élevée pour une règle jouant le rôle de règle par défaut. À moins que ces préférences ne concernent des filtres très similaires (par exemple, sport/dport vers le même classid), chaque valeur doit être différente.

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