Utilisation de tc pour retarder les paquets vers une seule adresse IP

20

Je suis nouveau dans l'utilisation de tc et de netem . Je souhaite retarder l'envoi de paquets à une adresse IP spécifique. Cependant, les commandes ci-dessous entraînent le retard de tous les paquets sur le système, au lieu de simplement l'adresse IP 1.2.3.4:

tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:1 handle 2: netem delay 500ms
tc filter add dev eth0 parent 1:0 protocol ip pref 55 handle ::55 u32 match ip dst 1.2.3.4 flowid 2:1

Je suppose que j'ai besoin d'une sorte de filtre fourre-tout à la fin pour spécifier que tout le trafic restant ne doit pas passer par Netem. Mais je ne peux rien faire travailler. Comment pourrais-je faire fonctionner cela?

Blanc mat
la source

Réponses:

14

Ok, j'ai résolu mon propre problème. Il s'avère que si vous exécutez les 3 premières lignes ci-dessus (celles "tc qdisc"), cela retardera tous les paquets car il n'y a pas encore de filtres. La 4ème ligne le change pour ne retarder que les paquets de cette seule adresse IP. Des lignes de filtre supplémentaires peuvent être ajoutées pour ajouter des adresses IP supplémentaires à la liste "retardée". Donc: ne créez pas de ligne "délai netem" sans qu'un filtre ne pointe dessus.

Blanc mat
la source
Merci d'être revenu et d'avoir posté la réponse. Curieusement, j'ai trouvé que cela fonctionnait très bien dans les deux sens, mais de toute façon. J'ai écrit un script d'encapsulation autour de ces trois commandes pour aider avec les tests, pensais juste que je donnerais un peu :)
Arran Cudbard-Bell
13

La réponse choisie est incorrecte / incomplète. J'ai rencontré un problème similaire, la réponse choisie a donné de l'aide, mais pas assez.

Tout d'abord, la commande suivante n'est pas vraiment nécessaire.

tc qdisc del dev eth0 racine

Il «supprimera» le qdisc racine, mais sera immédiatement remplacé par un pfifo_fast (afin de ne pas perdre la connectivité).

La deuxième commande:

tc qdisc add dev eth0 root handle 1: prio

Remplacera le qdisc pfifo_fast par le prio one. Par défaut, la file d'attente prio a 3 bandes (0, 1, 2) chacune gérée par une classe (1: 1, 1: 2 et 1: 3).

Les paquets seront envoyés à l'une de ces bandes en utilisant le champ TOS du paquet IP. Cette configuration s'affiche lorsque vous exécutez:

tc qdisc ls

en regardant les valeurs «priomap».

Ensuite, vous ajoutez un qdisc netem:

tc qdisc add dev eth0 parent 1: 1 handle 2: délai netem 500ms

Avec cette commande, vous retardez tout le trafic vers la bande 1: 1 (jusqu'à ce que le filtre soit en place).

Mais il y a deux mises en garde:

  • Votre trafic peut avoir une valeur TOS différente, puis être envoyé à une autre bande.
  • Le prio qdisc peut être configuré de sorte que le trafic passe vers une autre bande.

Ce qui suit a résolu mon problème de ne pas être affecté par le netem alors que le filtre n'est pas appliqué. Au lieu des étapes ci-dessus, j'ai fait:

tc qdisc add dev eth0 root handle 1: prio priomap 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Cela enverra tout le trafic par défaut à la bande 1: 3.

Ensuite, j'ai ajouté la règle pour retarder le trafic:

tc qdisc add dev eth0 parent 1: 1 handle 10: délai netem 100ms 10ms

Cela crée le qdisc dans la bande 0, mais comme tout le trafic va à la bande 3, cela ne m'a pas affecté.

Ensuite, j'ai ajouté le filtre:

filtre tc ajouter dev eth0 protocole ip parent 1: 0 prio 1 u32 match ip dst 10.0.0.1/32 match ip dport 80 0xffff flowid 1: 1

Maintenant avec le filtre, seul l'IP / port choisi sera affecté, puisque nous redirigeons le trafic choisi vers la bande 0.

Tous les autres trafics ne sont pas affectés, car ils continuent de circuler vers la bande 3.

Télégraphe
la source
qu'est-ce que "ip dst 10.0.0.1/32"? Est-ce l'IP de destination? cela signifie-t-il qu'il existe un "ip src xxx.yyy.zz.www / aa"?
Zach Folwick
Oui, c'est l'adresse IP de destination dans mon exemple. Et oui, il y a une option 'ip src'.
Telegraphe
La raison de la première commande (tc qdisc del) est d'effacer tout état précédent - comme vous pourriez en avoir si vous essayez de faire fonctionner cela. FWIW la réponse acceptée a fonctionné pour moi.
Dan Pritts
Merci, cette réponse a été vraiment utile.
PepeHands
1

Exemple simple de https://wiki.linuxfoundation.org/networking/netem qui vous permet de retarder les paquets vers une IP donnée sans affecter tout autre trafic, même pendant la configuration:

tc qdisc del dev eth0 root # Ensure you start from a clean slate
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:3 handle 30: netem delay 500ms
tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 \
   match ip dst 192.168.1.2 flowid 1:3
NeilenMarais
la source
Je dois ajouter une mise en garde, il a semblé plus tard que le retard s'appliquait plus largement que ce à quoi je m'attendais et je n'ai pas pu aller au fond des choses. Cependant, tout le trafic ne semblait pas retardé.
NeilenMarais
0

Je n'ai pas réussi à retarder le trafic vers une IP tout en gardant le trafic normal aux autres IP normal avec la méthode décrite dans ce fil.

Cependant, j'arrive à le faire en utilisant les commandes suivantes.

tc qdisc add dev eth0 root handle 1: prio priomap 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
tc qdisc add dev eth0 parent 1:2 handle 20: netem delay 0ms
tc filter add dev eth0 parent 1:0 protocol ip u32 match ip src `hostname -I` flowid 1:2
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 15001ms
tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 1.2.3.4 flowid 1:1

Pour retarder le 15001mstrafic vers IP 1.2.3.4depuis l'hôte sur lequel la commande est exécutée. La commande hostname -Iest utilisée pour obtenir l'IP principale de l'hôte mais la valeur peut être remplacée directement à l'intérieur de la commande.

J'ai dû ajouter un autre filtre avec 0msdélai pour correspondre au trafic provenant de l'hôte. C'est sûr que ce n'est pas élégant mais je n'ai pas réussi à faire quelque chose de plus agréable.

La dernière commande peut être remplacée pour correspondre à un seul port.

tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dport 18583 0xffff flowid 1:1

Pour retarder le trafic vers le port 18583au lieu de l'IP 1.2.3.4.


J'ai également trouvé une deuxième méthode sur cette réponse pour retarder le trafic 1.2.3.4:18583sans impact sur les autres trafics.

tc qdisc add dev eth0 root handle 1: prio
tc filter add dev eth0 protocol ip  parent 1: prio 1 u32 match ip dst 1.2.3.4 match ip dport 18583 0xffff flowid 1:1
tc filter add dev eth0 protocol all parent 1: prio 2 u32 match ip dst 0.0.0.0/0 flowid 1:2
tc filter add dev eth0 protocol all parent 1: prio 2 u32 match ip protocol 1 0xff flowid 1:2
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 10ms
tc qdisc add dev eth0 parent 1:2 handle 20: sfq
Nicolas Henneaux
la source