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