Estadísticas de tráfico de red con iptables

iptbales es una herramienta en Linux para gestionar reglas de firewall y monitorear el tráfico de red. A continuación se describe cómo configurar iptables para obtener estadísticas detalladas de tráfico para IP y puertos específicos.

Para medir el tráfico entrante hacia una dirección IP como 10.0.0.5:

iptables -I INPUT -d 10.0.0.5

Para el tráfico saliente desde esa IP:

iptables -I OUTPUT -s 10.0.0.5

Para estadísticas de tráfico en un puerto específico, como TCP 8080 en la IP 192.168.1.1:

iptables -I INPUT -d 192.168.1.1 -p tcp --dport 8080

El tráfico saliente desde ese puerto se registra así:

iptables -I OUTPUT -s 192.168.1.1 -p tcp --sport 8080

Se pueden combinar parámetros como -s, --sport, -d y --dport para filtrar por origen, destino, puertos y direcciones según sea necesario.

Para visualizar las estadísticas acumuladas:

iptables -n -v -L -t filter

Para mostrar los valores en bytes sin conversión automática a unidades legibles:

iptables -n -v -L -t filter -x

Cuando el servidor opera como router, las reglas deben insertarse en la cadena FORWARD, ya que el tráfico no termina en el propio servidor:

iptables -I FORWARD -d 10.0.0.5
iptables -I FORWARD -s 10.0.0.5

En este caso, no se requiere distinguir entre INPUT y OUTPUT, ya que el servidor solo reenvía paquetes basados en la IP de destino.

Las reglas de iptables se pierden al rieniciar el sistema, por lo que se deben guardar. En distribuciones basadas en Red Hat:

service iptables save

En sistemas Debian o Ubuntu:

iptables-save > /etc/iptables.rules
iptables-restore < /etc/iptables.rules

Para implementar control de tráfico, se puede monitorear periódicamente y detener servicios si se excede un límite. Ejemplo para el puerto 8080:

# Configuración inicial y guardado del PID
PUERTO=8080
ARCHIVO_PID=~/$PUERTO.pid
sudo iptables -I OUTPUT -s 192.168.1.1 -p tcp --sport $PUERTO
echo "$!" > $ARCHIVO_PID

Script de monitoreo que verifica el tráfico cada 30 segundos y detiene el servicio si supera 200 MB:

PUERTO=8080
ARCHIVO_PID=~/$PUERTO.pid
LIMITE=200
INTERVALO=30
while true
do
    trafico=$(sudo iptables -n -v -L -t filter | grep -i "spt:$PUERTO" | awk '{print $2}')
    if echo "$trafico" | grep -q 'M'; then
        valor=$(echo "$trafico" | tr -d 'M')
        if [ "$valor" -gt "$LIMITE" ]; then
            kill -9 $(cat $ARCHIVO_PID)
            rm $ARCHIVO_PID
            sudo iptables -D OUTPUT -s 192.168.1.1 -p tcp --sport $PUERTO
            break
        fi
    fi
    sleep $INTERVALO
done

Etiquetas: iptables linux monitoreo de red firewall redes

Publicado el 7-12 20:05