Usando tc para retrasar paquetes a una sola dirección IP

20

Soy nuevo en el uso de tc y netem . Quiero retrasar el envío de paquetes a una dirección IP específica. Sin embargo, los siguientes comandos hacen que todos los paquetes del sistema se retrasen, en lugar de solo a la dirección 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

Supongo que necesito algún tipo de filtro general al final para especificar que todo el tráfico restante no debe pasar por netem. Pero no puedo hacer que nada funcione. ¿Cómo haría que esto funcione?

Blanco mate
fuente

Respuestas:

14

Ok, resolví mi propio problema. Resulta que si ejecuta las primeras 3 líneas anteriores (las "tc qdisc"), retrasará todos los paquetes porque todavía no hay filtros. La cuarta línea lo cambia para retrasar solo los paquetes de esa única dirección IP. Se pueden agregar líneas de filtro adicionales para agregar direcciones IP adicionales a la lista "demorada". Por lo tanto: no cree una línea de "retraso de netem" sin un filtro apuntando a ella.

Blanco mate
fuente
Gracias por regresar y publicar la respuesta. Curiosamente descubrí que funcionaba bien en ambos sentidos, pero de todos modos. Escribí un script de envoltorio alrededor de esos tres comandos para ayudar con las pruebas, solo pensé que devolvería un poco :)
Arran Cudbard-Bell
13

La respuesta elegida es incorrecta / incompleta. Me enfrenté a un problema similar, la respuesta elegida me ayudó, pero no lo suficiente.

Primero, el siguiente comando no es realmente necesario.

tc qdisc del dev eth0 root

Se 'eliminará' la raíz qdisc, pero inmediatamente se sustituirá por una pfifo_fast (para que no pierda la conectividad).

El segundo comando:

tc qdisc add dev eth0 root handle 1: prio

Sustituirá el qdisc pfifo_fast con el prio. Por defecto, la cola de prio tiene 3 bandas (0, 1, 2) cada una administrada por una clase (1: 1, 1: 2 y 1: 3).

Los paquetes se enviarán a una de esas bandas utilizando el campo TOS del paquete IP. Esta configuración se muestra cuando ejecuta:

tc qdisc ls

mirando los valores de 'priomap'.

Luego, agrega un qdisc netem:

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

Con este comando, retrasará todo el tráfico que vaya a la banda 1: 1 (hasta que el filtro esté en su lugar).

Pero hay dos advertencias:

  • Su tráfico puede tener un valor de TOS diferente y luego ser enviado a otra banda.
  • El prio qdisc se puede configurar para que el tráfico vaya a otra banda.

Lo siguiente resolvió mi problema para no verse afectado por el netem mientras no se aplica el filtro. En lugar de los pasos anteriores, hice:

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

Esto enviará todo el tráfico por defecto a la banda 1: 3.

Luego, agregué la regla para retrasar el tráfico:

tc qdisc add dev eth0 parent 1: 1 handle 10: netem delay 100ms 10ms

Esto crea el qdisc en la banda 0, pero como todo el tráfico va a la banda 3, no me afectó.

Luego, agregué el filtro:

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

Ahora con el filtro, solo el IP / puerto elegido se verá afectado, ya que redirigimos el tráfico elegido a la banda 0.

El resto del tráfico no se ve afectado ya que continúa fluyendo hacia la banda 3.

Telegrafista
fuente
¿Qué es el "ip dst 10.0.0.1/32"? ¿Es ese el ip de destino? ¿eso significa que hay un "ip src xxx.yyy.zz.www / aa"?
Zach Folwick
Sí, es la IP de destino en mi ejemplo. Y sí, hay una opción 'ip src'.
Telegrapher
La razón para el primer comando (tc qdisc del) es borrar cualquier estado anterior, como podría ser si está experimentando tratando de hacer que esto funcione. FWIW la respuesta aceptada funcionó para mí.
Dan Pritts
Gracias, esta respuesta fue realmente útil.
PepeHands
1

Ejemplo simple de https://wiki.linuxfoundation.org/networking/netem que le permite retrasar paquetes a una IP determinada sin afectar ningún otro tráfico, incluso durante la configuración:

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
fuente
Debo agregar una advertencia, luego pareció que el retraso se aplicaba de manera más amplia de lo que esperaba y no pude llegar al fondo. Sin embargo, no todo el tráfico parecía retrasado.
NeilenMarais
0

No he logrado retrasar el tráfico a una IP mientras mantengo el tráfico normal a otras IP normales con el método descrito en este hilo.

Sin embargo, logro hacerlo usando los siguientes comandos.

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

Para retrasar el 15001mstráfico a IP 1.2.3.4desde el host donde se ejecuta el comando. El comando hostname -Ise usa para obtener la IP principal del host, pero el valor se puede reemplazar directamente dentro del comando.

Tuve que agregar otro filtro con 0msretraso para que coincida con el tráfico proveniente del host. Seguro que no es elegante, pero no he logrado que algo más agradable funcione.

El último comando se puede reemplazar para que coincida con un solo puerto.

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

Para retrasar el tráfico al puerto en 18583lugar de IP 1.2.3.4.


También he encontrado un segundo método en esta respuesta para retrasar el tráfico 1.2.3.4:18583sin impacto en otro tráfico.

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
fuente