Marcio Cunha

Cómo Simular Límites de Ancho de Banda y Pérdida de Paquetes Localmente en Linux con TC

Aprenda a probar la resiliencia de aplicaciones distribuidas en condiciones reales de red utilizando el emulador de red nativo del kernel de Linux, la utilidad tc.

Marcio Cunha5 min
También disponible en:EnglishPortuguês
Resumen
  • La simulación de restricciones severas de red directamente en el entorno de desarrollo elimina sorpresas en sistemas de producción geográficamente dispersos.
  • El subsistema Netem opera directamente en la capa de enlace del kernel de Linux para inyectar latencia, fluctuación y pérdida de paquetes de forma controlada.
  • La definición de límites finos de ancho de banda requiere el uso combinado de disciplinas de encolamiento HTB y la extensión Netem.
  • La eliminación inmediata de las reglas aplicadas evita que las pruebas de estrés corrompan conexiones administrativas de larga duración en la máquina local.
  • La validación empírica de protocolos basados en tiempo de espera revela fallas estructurales invisibles en conexiones locales de alta velocidad.

El Desafío Invisible de la Resiliencia en Redes Imperfectas

Desarrollar software en entornos locales conectados por cables de fibra óptica de alta velocidad crea una falsa sensación de seguridad operativa. En la práctica, la infraestructura global de internet es caótica, repleta de conexiones móviles inestables, rutas congestionadas y caídas intermitentes de paquetes de datos. Cuando un sistema distribuido falla al manejar estas variaciones, el usuario final experimenta pantallas congeladas, solicitudes duplicadas y datos corruptos. El ingeniero de software necesita herramientas capaces de reproducir este caos de red directamente en su estación de trabajo de desarrollo.

En lugar de depender de servidores remotos costosos o simulaciones en la nube difíciles de orquestar, el sistema operativo Linux ofrece una navaja suiza integrada directamente en su núcleo. Estamos hablando del comando tc (Traffic Control), parte del paquete iproute2, que gestiona el flujo de paquetes en las interfaces de red. Combinado con el módulo Netem (Network Emulator), tc permite inyectar retrasos temporales, corromper datos, duplicar tráfico y descartar paquetes de forma quirúrgica, simulando conexiones vía satélite, redes 3G degradadas u oficinas remotas distantes.

Comprendiendo la Arquitectura de Encolamiento del Kernel de Linux

Para dominar el control de tráfico, debemos comprender cómo el sistema operativo maneja los datos que salen de la tarjeta de red. El kernel utiliza disciplinas de encolamiento (qdisc) para organizar el orden en que los paquetes de red se transmiten o descartan. Por defecto, la mayoría de las interfaces utiliza una cola simple de tipo FIFO (First-In, First-Out), donde el primer paquete en llegar es el primero en ser enviado, sin ninguna priorización o limitación intencional de velocidad.

Cuando aplicamos una regla de limitación de ancho de banda o pérdida de paquetes, interceptamos esta cola por defecto y la reemplazamos por una estructura programable. Netem actúa como un qdisc especial que se puede acoplar directamente a la interfaz de red o integrarse en estructuras más complejas, como HTB (Hierarchical Token Bucket). En la práctica, HTB funciona como un distribuidor inteligente de tokens, donde cada token otorga permiso para transmitir una cantidad específica de bytes, permitiendo dividir el ancho de banda total en porciones restringidas para cada aplicación.

Preparando el Escenario de Pruebas en la Interfaz de Loopback

Antes de aplicar cualquier modificación de tráfico en una interfaz de red física, lo cual podría cortar su acceso SSH remoto a la máquina, es altamente recomendable utilizar la interfaz de loopback (lo). Esta interfaz virtual representa la computadora hablando consigo misma, aislando completamente los experimentos y asegurando un entorno totalmente seguro para pruebas de estrés y validación de comandos.

Para verificar el estado actual de la interfaz de loopback y confirmar que no hay reglas restrictivas activas, utilizamos la utilidad ip route o listamos las disciplinas configuradas. En la práctica, esto significa que podemos probar servidores web, bases de datos locales y clientes de API simulando conexiones internacionales de alta latencia sin necesidad de desconectar el cable de red físico de la computadora.

Aplicando Pérdida de Paquetes y Retrasos Simulados con Netem

Pasemos al primer escenario práctico de ingeniería: simular una conexión de internet móvil inestable que descarta aleatoriamente el diez por centos de los paquetes enviados y agrega cien milisegundos de retraso con fluctuación. Para ejecutar este procedimiento de manera segura en su máquina de desarrollo, siga la secuencia a continuación utilizando la terminal de Linux con privilegios administrativos.

  1. Abra la terminal y asegúrese de ejecutar los comandos con privilegios de superusuario para interactuar directamente con el kernel del sistema.
  2. Inspeccione la interfaz de red elegida, como la interfaz virtual de loopback, para asegurarse de que está activa y respondiendo correctamente:
    ip link show lo
  3. Aplique la regla de Netem en la interfaz de loopback para inyectar diez por ciento de pérdida de paquetes y cien milisegundos de latencia base:
    sudo tc qdisc add dev lo root netem loss 10% delay 100ms 20ms
  4. Valide inmediatamente si la regla se aplicó correctamente listando los qdiscs activos en la interfaz:
    sudo tc qdisc show dev lo
  5. Pruebe la nueva latencia enviando paquetes de diagnóstico a la dirección local:
    ping -c 5 127.0.0.1

Con este simple cambio, las herramientas de monitoreo y las aplicaciones que dependen de conexiones continuas comenzarán a experimentar tiempos de espera y reintentos. Este comportamiento es esencial para observar cómo el código del cliente maneja las fallas parciales de red.

Limitando el Ancho de Banda con HTB y Netem Combinados

El comando netem por sí solo es excelente para retrasos y pérdidas, pero no restringe la velocidad máxima de transmisión por sí mismo. Para limitar el ancho de banda, por ejemplo, a exactamente un megabit por segundo, debemos crear una raíz HTB y colgar netem debajo de ella. Esta combinación nos permite restringir la velocidad y corromper paquetes simultáneamente, simulando un enlace satelital congestionado y de baja capacidad.

La estructura de comandos requiere crear una clase HTB raíz que controle la tasa máxima de salida (rate 1mbit) y luego agregar una hoja netem subordinada a esa clase. En la práctica, cualquier solicitud HTTP o transferencia de archivos ejecutada a través de esta interfaz ahora será estrangulada rígidamente por el kernel, permitiendo observar cuellos de botella en búferes y desbordamientos de memoria en tiempo real.

Limpiando las Reglas y Restaurando el Estado Original de la Red

Un error común al utilizar el subsistema tc es olvidar eliminar las reglas de simulación después de que terminan las pruebas. Debido a que las configuraciones persisten en la memoria de la interfaz de red hasta que el sistema se reinicia o el qdisc se borra explícitamente, futuras aplicaciones en la misma máquina continuarán sufriendo pérdida de paquetes y lentitud inexplicable.

Para revertir todos los cambios y restaurar el comportamiento nativo de alta velocidad de la interfaz de loopback o cualquier tarjeta física, utilizamos el comando de limpieza general. En la práctica, ejecutar este comando elimina instantáneamente cualquier disciplina de encolamiento personalizada, devolviendo el control total del tráfico al kernel predeterminado de Linux sin necesidad de reiniciar la computadora.

Consideraciones Finales sobre Pruebas de Resiliencia de Red

Simular escenarios adversos de red localmente utilizando el subsistema tc de Linux transforma la forma en que diseñamos aplicaciones distribuidas. En lugar de descubrir fallas de tiempo de espera y corrupción de estado solo cuando el software llega a producción, los ingenieros adquieren la capacidad de auditar el comportamiento del código bajo presión extrema directamente en su máquina de desarrollo. Dominar estas herramientas eleva la robustez de los sistemas y garantiza experiencias de usuario consistentes, independientemente de la calidad de la infraestructura conectada.