Simule paquetes retrasados ​​y descartados en Linux

Respuestas:

323

Netem aprovecha la funcionalidad ya integrada en Linux y las utilidades de espacio de usuario para simular redes. Esto es en realidad a lo que se refiere la respuesta de Mark, con un nombre diferente.

Los ejemplos en su página de inicio ya muestran cómo puede lograr lo que ha pedido:

Ejemplos

Emulando retrasos en la red de área amplia

Este es el ejemplo más simple, solo agrega una cantidad fija de retraso a todos los paquetes que salen de la Ethernet local.

# tc qdisc add dev eth0 root netem delay 100ms

Ahora, una simple prueba de ping para alojar en la red local debería mostrar un aumento de 100 milisegundos. El retraso está limitado por la resolución del reloj del núcleo (Hz). En la mayoría de los sistemas 2.4, el reloj del sistema funciona a 100 Hz, lo que permite retrasos en incrementos de 10 ms. En 2.6, el valor es un parámetro de configuración de 1000 a 100 Hz.

Los ejemplos posteriores solo cambian los parámetros sin volver a cargar qdisc

Las redes de área amplia reales muestran variabilidad, por lo que es posible agregar una variación aleatoria.

# tc qdisc change dev eth0 root netem delay 100ms 10ms

Esto hace que el retraso agregado sea de 100 ± 10 ms. La variación del retraso de la red no es puramente aleatoria, por lo que para emular también existe un valor de correlación.

# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%

Esto hace que la demora agregada sea de 100 ± 10 ms con el siguiente elemento aleatorio dependiendo del 25% del último. Esto no es una correlación estadística verdadera, sino una aproximación.

Distribución diferida

Típicamente, el retraso en una red no es uniforme. Es más común usar algo como una distribución normal para describir la variación en el retraso. La disciplina netem puede tomar una tabla para especificar una distribución no uniforme.

# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal

Las tablas reales (normal, pareto, paretonormal) se generan como parte de la compilación iproute2 y se colocan en / usr / lib / tc; Por lo tanto, es posible con cierto esfuerzo hacer su propia distribución basada en datos experimentales.

Paquete perdido

La pérdida aleatoria de paquetes se especifica en el comando 'tc' en porcentaje. El valor distinto de cero más pequeño posible es:

2 −32 = 0.0000000232%

# tc qdisc change dev eth0 root netem loss 0.1%

Esto hace que se descarte aleatoriamente una décima parte de los paquetes porcentuales (es decir, 1 de cada 1000).

También se puede agregar una correlación opcional. Esto hace que el generador de números aleatorios sea menos aleatorio y se puede usar para emular las pérdidas de ráfaga de paquetes.

# tc qdisc change dev eth0 root netem loss 0.3% 25%

Esto hará que se pierda el 0.3% de los paquetes, y cada probabilidad sucesiva depende en un cuarto del último.

Prob n = 0.25 × Prob n-1 + 0.75 × Aleatorio

Tenga en cuenta que debe usarlo tc qdisc addsi no tiene reglas para esa interfaz o tc qdisc changesi ya tiene reglas para esa interfaz. Intentar usar tc qdisc changeen una interfaz sin reglas dará el error RTNETLINK answers: No such file or directory.

efímero
fuente
2
El sitio web original tiene ese error, acabo de copiar ese texto directamente. Pero sí, 2 ^ (- 32) = 2.33e-10
ephemient
34
Tenga en cuenta que tc -p qdisc ls dev eth0habrá una lista de reglas definidas actuales, y tc qdisc del dev eth0 rootlos eliminará
Quamis
1
votó por señalar error al intentar cambiar una entrada no existente
Neo
¿Sabes por qué recibo estos errores? ubuntu @ anmol-vm1-new: / home / hadoop / yarnpp / workloads / RESULTS $ sudo tc qdisc add dev eth0 root netem delay 100ms RTNETLINK respuestas: El archivo existe ubuntu @ anmol-vm1-new: / home / hadoop / yarnpp / workloads / RESULTADOS $ sudo tc qdisc change dev eth0 root netem delay 100ms RTNETLINK respuestas: argumento no válido serverfault.com/questions/743885/…
Mona Jalal
Probablemente sería una buena idea incluir detalles sobre cómo limitar el rendimiento completo de las interfaces para simular enlaces de baja velocidad
Pavel P
91

Para los paquetes descartados, simplemente usaría iptables y el módulo estadístico .

iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP

Arriba caerá un paquete entrante con una probabilidad del 1%. Tenga cuidado, cualquier cosa por encima de 0.14 y la mayoría de sus conexiones tcp probablemente se bloqueará por completo.

Eche un vistazo a man iptables y busque "estadística" para obtener más información.

Bjarke Freund-Hansen
fuente
66
¿Por qué las conexiones TCP se estancan en algo superior al 14%?
David Wolever
2
@DavidWolever: Debido a la forma en que se ajusta el tamaño de las ventanas deslizantes tcp. Pero el 14% es puramente por experiencia, pruébelo usted mismo y verá que ssh se vuelve prácticamente inutilizable al 14% o más, pero en realidad funciona bastante bien a niveles más bajos de tasas de caída de paquetes.
Bjarke Freund-Hansen
12
Por seguridad, probablemente sea mejor limitar la regla para que se aplique solo a los puertos que desea probar: iptables -A INPUT --dport FOO -m estadísticas ... De esta manera, su ssh y otras conexiones serán permanezca sin molestias y puede aumentar la tasa de caída del servicio de interés para poder reproducir cualquier problema con él más rápido.
Mikhail T.
55
Tenga DROPen cuenta que en las conexiones de salida hace que las send()operaciones regresen de forma bastante ridícula EPERM, en lugar de simplemente descartar paquetes (como debería).
Nombre falso
2
¿Es esto todo lo que se necesita para deshacer ese comando? iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
jcalfee314
6

Uno de mis colegas usa tc para hacer esto. Consulte la página del manual para obtener más información. Puede ver un ejemplo de su uso aquí .

marca
fuente
Creo que es más fácil de usar iptables :)
c4f4t0r
claro, pero tc es mucho más rápido que iptables
teknoraver
5

iptables (8) tiene un módulo de coincidencia estadística que se puede usar para hacer coincidir cada enésimo paquete. Para descartar este paquete, simplemente agregue -j DROP .

hillu
fuente
1

No lo he intentado yo mismo, pero esta página tiene una lista de módulos de complemento que se ejecutan en el sistema de filtrado IP integrado de Linux 'iptables'. Uno de los módulos se llama "enésimo" y le permite configurar una regla que eliminará una velocidad configurable de los paquetes. Podría ser un buen lugar para comenzar, al menos.

relajarse
fuente
1

Una herramienta de inyección de fallas de red fácil de usar es Saboteur . Puede simular:

  • Partición de red total
  • Servicio remoto inactivo (no escucha en el puerto esperado)
  • Retrasos
  • Pérdida de paquetes: tiempo de espera de conexión TCP (como suele suceder cuando dos sistemas están separados por un firewall con estado)
Alex Giotis
fuente
1
Lamentablemente, el último compromiso con ese proyecto fue el 28 de agosto de 2015, es decir, hace casi 4 años. Los temas abiertos tienen ahora 5 años.
Ali
1

Una de las herramientas más utilizadas en la comunidad científica para ese fin es DummyNet . Una vez que haya instalado el ipfwmódulo del núcleo, para introducir un retraso de propagación de 50 ms entre 2 máquinas, simplemente ejecute estos comandos:

./ipfw pipe 1 config delay 50ms
./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2

Para introducir también el 50% de las pérdidas de paquetes, debe ejecutar:

./ipfw pipe 1 config plr 0.5

Aquí más detalles.

gaetano
fuente