Simular lentitud de red con tc

Introducción

En entornos de desarrollo y pruebas, simular condiciones de red adversas es fundamental para comprobar la robustez de aplicaciones web, servicios distribuidos y clientes VPN. El comando tc (traffic control) en Linux es una herramienta poderosa para modelar latencia, pérdida de paquetes y ancho de banda. En este artículo detallado exploraremos desde los conceptos básicos de tc hasta escenarios avanzados que incluyen OpenVPN y WireGuard.

Conceptos fundamentales de red y tc

Antes de profundizar en ejemplos prácticos, veamos brevemente los componentes clave:

  • Qdisc: Cola de salida que gestiona paquetes en una interfaz (p. ej. htb, fq_codel, netem).
  • Classes: Subcolas dentro de un qdisc padre que permiten priorizar tráfico.
  • Filters: Reglas que asignan paquetes a clases según criterios (IP, puerto, DSCP).
  • Netem: Emula latencia, pérdida, duplicación, corrupción y reorder de paquetes.

Parámetros de interés en netem

Parámetro Descripción Ejemplo
delay Añade latencia fija a cada paquete. 100ms
loss Simula pérdida de paquetes en porcentaje. 1%
duplicate Duplica paquetes aleatoriamente. 0.1%
corrupt Corrompe paquetes. 0.5%

Configuración básica: retraso y pérdida

  1. Eliminar configuraciones anteriores:
    tc qdisc del dev eth0 root
  2. Añadir un root qdisc tipo netem:
    tc qdisc add dev eth0 root netem delay 200ms loss 1%
  3. Verificar ejecución:
    tc qdisc show dev eth0

Con esto, cada paquete saliente por eth0 tendrá un retardo de 200 ms y una probabilidad de pérdida de 1 %.

Jitter aleatorio

Para introducir variabilidad en el retardo:

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

Este comando aplica un retardo medio de 100 ms con una variación estándar de 30 ms siguiendo distribución normal.

Escenarios avanzados con clases y filtros

Cuando se requiere más control, combinamos htb y netem:

tc qdisc add dev eth0 root handle 1: htb default 20
tc class add dev eth0 parent 1: classid 1:10 htb rate 1mbit
tc class add dev eth0 parent 1: classid 1:20 htb rate 512kbit
tc qdisc add dev eth0 parent 1:10 netem delay 300ms
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 
  match ip dst 10.0.0.0/24 flowid 1:10
  
  • Clase 1:10 para red local (10.0.0.0/24) con retardo de 300 ms.
  • Clase 1:20 para tráfico general a 512 kbit/s.

Simulación de condiciones en tráfico entrante

Linux no soporta netem en ingreso directamente se utilizan ifb (Intermediate Functional Block).

  1. Crear interfaz ifb:
    modprobe ifb numifbs=1 ip link add ifb0 type ifb ip link set dev ifb0 up
  2. Redirigir tráfico entrante:
    tc qdisc add dev eth0 ingress
    tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
          
  3. Aplicar netem en ifb0:
    tc qdisc add dev ifb0 root netem delay 150ms

Así simulamos latencia en recepción de paquetes.

Aplicaciones prácticas

  • Pruebas de rendimiento de APIs bajo alta latencia.
  • Validación de tolerancia al jitter en videoconferencias.
  • Evaluación de throughput en clientes de OpenVPN, WireGuard y servicios como NordVPN.
  • Simulación de redes móviles 3G/4G:
    tc qdisc add dev eth0 root netem delay 200ms 50ms loss 2% rate 1mbit

Mejores prácticas y consideraciones

  • Análisis previo: Monitorizar condiciones reales con tcpdump o wireshark para definir parámetros aproximados.
  • Impacto en CPU: netem añade carga evalúa en máquinas de pruebas dedicadas.
  • Eliminación de reglas:
    tc qdisc del dev eth0 root
    tc qdisc del dev ifb0 root
  • Persistencia: Incluir comandos en scripts de arranque (/etc/rc.local) o usar systemd para automatizar.

Conclusiones

El uso de tc y netem en Linux ofrece una solución versátil para simular una amplia variedad de condiciones de red. Desde simples retardos de milisegundos hasta entornos complejos con clases, filtros e interfaces ifb, esta técnica es esencial en pruebas de software, validación de VPNs y análisis de rendimiento.

Implementar estos trucos garantiza que tus aplicaciones responderán adecuadamente aun cuando los usuarios experimenten redes inestables o de baja calidad.

  • Hola 👋 , soy la IA de Linuxmind.dev, te puedo ayudar a aprender.
Gathering thoughts ...

Leave a Reply

Your email address will not be published. Required fields are marked *