Simulación de condiciones de red en Linux con TC y NetEm

La herramienta tc (Traffic Control) en Linux es fundamental para gestionar y manipular la configuración del tráfico de red. Integrada en el kernel desde versiones 2.6 en adelante, el módulo netem (Network Emulator) se apoya en tc para simular condiciones de redes de área amplia (WAN), como latencia, pérdida de paquetes, duplicación y más, directamente en entornos LAN de alto rendimiento.

Para utilizar netem, es necesario que el módulo esté habilitado en el kernel y que la herramienta tc esté disponible en el sistema. Distribuciones populares como CentOS, Ubuntu, Debian, Fedora, Red Hat y OpenSUSE suelen incluir estas capacidades.

Importante: Las reglas aplicadas con tc afectan principalmente al tráfico saliente de una interfaz de red. Si se aplican a una interfaz física (ej. eth0), también influirán en las interfaces lógicas asociadas (ej. eth0:1). Las configuraciones en interfaces lógicas podrían no tener el efecto deseado.

Configuración de Latencia y Pérdida de Paquetes

A continuación, se presentan comandos para simular estas condiciones:

Añadir Latencia

sudo tc qdisc add dev eth0 root netem delay 1000ms

Eliminar Regla de Latencia

sudo tc qdisc del dev eth0 root netem delay 1000ms

Añadir Pérdida de Paquetes

sudo tc qdisc add dev eth0 root netem loss 10%

Eliminar Regla de Pérdida de Paquetes

sudo tc qdisc del dev eth0 root netem loss 10%

Verificar y Eliminar Configuraciones

Para inspeccionar las reglas de qdisc (traffic control discipline) aplicadas a una interfaz:

sudo tc qdisc show dev enp2s0

Para eliminar todas las reglas de una interfaz:

sudo tc qdisc del dev enp2s0 root

Simulación Avanzada de Red

netem permite simulaciones más complejas, como latencia variable con distribución normal:

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

Este comando añade una latencia base de 100ms con una desviación estándar de 20ms, siguiendo una distribución normal.

Control de Ancho de Banda por Puerto en CentOS

Para limitar el ancho de banda de un puerto específico utilizando tc e iptables, se puede emplear la disciplina htb (Hierarchical Token Bucket). Los parámetros clave son:

  • rate: Ancho de banda máximo permitido.
  • ceil: Ancho de banda máximo en ráfagas (burst).
  • prio: Prioridad de la clase de tráfico (menor número indica mayor prioridad).

Ejemplo de Configuración para Limitar Tráfico HTTP Saliente (Puerto 7500) a 5 Mbps:

# Configurar la raíz HTB en la interfaz em1
 sudo tc qdisc add dev em1 root handle 1: htb

 # Definir una clase con 1Mbps de tasa y ráfaga, prioridad 1
 sudo tc class add dev em1 parent 1: classid 1:5 htb rate 1Mbps ceil 1Mbps prio 1

 # Asociar la clase con una marca de firewall (handle 5 fw)
 sudo tc filter add dev em1 parent 1:0 protocol ip handle 5 fw flowid 1:5

 # Marcar el tráfico saliente del puerto 7500 con la marca 5 usando iptables
 sudo /sbin/iptables -A OUTPUT -t mangle -p tcp --sport 7500 -j MARK --set-mark 5

Comandos Útiles para Gestión de TC:

Para eliminar todas las reglas de qdisc:

sudo tc qdisc del dev em1 root

Para listar las reglas de qdisc y sus estadísticas:

tc qdisc ls dev em1
tc -s qdisc ls dev em1

Para listar las clases de tráfico y sus estadísticas:

tc class ls dev em1
tc -s class ls dev em1

Para ver las reglas de iptables en la tabla mangle:

iptables -t mangle -n -v -L

Etiquetas: tc netem linux traffic control network emulation

Publicado el 8-8 05:48