26 votes

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

Je suis novice dans l'utilisation de tc y netem . Je souhaite retarder l'envoi de paquets à une adresse IP spécifique. Cependant, les commandes ci-dessous retardent tous les paquets sur le système, au lieu de les retarder uniquement vers 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 pense 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 n'arrive pas à faire fonctionner quoi que ce soit. Comment faire pour que cela fonctionne ?

24voto

hugo der hungrige Points 201

La réponse choisie est incorrecte/incomplète. J'ai été confronté à un problème similaire, la réponse choisie m'a apporté une certaine aide, mais pas suffisante.

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

tc qdisc del dev eth0 root

Il "supprime" le qdisc racine, mais il est immédiatement remplacé par un qdisc pfifo_fast (afin de ne pas perdre la connectivité).

Le deuxième commandement :

tc qdisc add dev eth0 root handle 1 : prio

Remplacera le qdisc pfifo_fast par le qdisc prio. 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 est affichée lorsque vous exécutez :

tc qdisc ls

en examinant les valeurs "priomap".

Ensuite, vous ajoutez un netem qdisc :

tc qdisc add dev eth0 parent 1:1 handle 2 : netem delay 500ms

Cette commande permet de retarder 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 et être envoyé à un autre groupe.
  • Le prio qdisc peut être configuré de manière à ce que le trafic soit dirigé vers une autre bande.

Ce qui suit a résolu mon problème de ne pas être affecté par le netem lorsque le filtre n'est pas appliqué. Au lieu de suivre les étapes ci-dessus, j'ai procédé comme suit

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 2

Par défaut, tout le trafic est envoyé à 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 : netem delay 100ms 10ms

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

J'ai ensuite ajouté le filtre :

tc filter add dev eth0 protocol 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 restent inchangés puisqu'ils continuent à être acheminés vers la bande 3.

15voto

Matt White Points 687

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 (les "tc qdisc"), cela retardera tous les paquets parce qu'il n'y a pas encore de filtres. La 4ème ligne permet de ne retarder que les paquets provenant de cette seule adresse IP. Des lignes de filtre supplémentaires peuvent être ajoutées pour ajouter d'autres adresses IP à la liste "retardée". Donc : ne créez pas une ligne "netem delay" sans qu'un filtre ne pointe vers elle.

2voto

Gaz Points 41

Exemple simple de https://wiki.linuxfoundation.org/networking/netem qui vous permet de retarder les paquets vers une IP donnée sans affecter le reste du 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

2voto

Nicolas Henneaux Points 121

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

Cependant, j'ai réussi à 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 15001ms vers l'IP 1.2.3.4 de l'hôte où la commande est exécutée. La commande hostname -I est utilisé pour obtenir l'adresse IP principale de l'hôte, mais la valeur peut être remplacée directement dans la commande.

J'ai dû ajouter un autre filtre avec 0ms pour correspondre au trafic provenant de l'hôte. Ce n'est certainement pas très élégant, mais je n'ai pas réussi à faire fonctionner 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 18583 au lieu de l'IP 1.2.3.4 .


J'ai également trouvé un deuxième méthode sur ce répondre pour retarder le trafic jusqu'à 1.2.3.4:18583 sans impact sur le reste du trafic.

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

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