Image

Base de conocimientos → Limitar y controlar el tráfico saliente en Linux mediante iptables

[Servidores virtuales]
Fecha de publicación: 21.07.2025

Limitar y controlar el tráfico saliente puede ser útil en muchos casos, como por ejemplo:

  • Protección contra ataques - cuando los servicios en el servidor generan respuestas
  • Protección de datos - dificultando la extracción de información del servidor
  • Protección contra scripts de código cerrado que pueden recopilar y transmitir información sin tu conocimiento

En nuestro ejemplo, crearemos una máquina virtual y asumiremos que necesitamos probar un software en cuanto a la transmisión de datos. Por lo tanto, bloquearemos todo excepto una dirección IP desde la cual probaremos el software.

1. Añadir reglas a iptables

# Limpiar las reglas actuales (con precaución si estás conectado por SSH)
iptables -F OUTPUT

# Permitir loopback (localhost)
iptables -A OUTPUT -o lo -j ACCEPT

# Permitir consultas DNS (si son necesarias, opcional)
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# Permitir todas las conexiones salientes a la IP 111.222.111.222
iptables -A OUTPUT -d 111.222.111.222 -j ACCEPT

# Bloquear todas las demás conexiones salientes
iptables -A OUTPUT -j REJECT

Donde 111.222.111.222 es la dirección IP desde la cual probaremos, enviaremos y recibiremos datos.

2. Comprobación de reglas, verificando a través de SSH desde el propio servidor

2.1 Comprobación de ping

ping 8.8.8.8

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
From 79.174.xx.xxx icmp_seq=1 Destination Port Unreachable
ping: sendmsg: Operación no permitida
From 79.174.xx.xxx icmp_seq=2 Destination Port Unreachable
ping: sendmsg: Operación no permitida
From 79.174.xx.xxx icmp_seq=3 Destination Port Unreachable
ping: sendmsg: Operación no permitida

2.2 Comprobación de telnet

telnet google.com 443
Trying 209.85.233.101...
Connection failed: Conexión rechazada
Trying 209.85.233.113...
Connection failed: Conexión rechazada
Trying 209.85.233.139...
Connection failed: Conexión rechazada
Trying 209.85.233.100...

Como podemos ver, las reglas funcionan, y cuando los scripts o servicios intentan conectarse, no se transmitirán datos a internet.

3. Monitoreo de tráfico e intentos de conexión

3.1 Este ejemplo actualizará los datos de conexión para PHP cada segundo

watch -n 1 'lsof -i -nP | grep php'

php-fpm8.  445 www-data   11u  IPv4 2405976614      0t0  TCP 127.0.0.1:9000 (LISTEN)
php-fpm8.  448 www-data   12u  IPv4 2405976614      0t0  TCP 127.0.0.1:9000 (LISTEN)
php-fpm8.  449 www-data   14u  IPv4 2405976614      0t0  TCP 127.0.0.1:9000 (LISTEN)
php-fpm8.  453 www-data   16u  IPv4 2405976614      0t0  TCP 127.0.0.1:9000 (LISTEN)

Si hay intentos de conectarse a un nodo externo, la conexión será visible, incluyendo el puerto y la dirección IP.

Cuando se monitorean scripts PHP, también hay módulos adicionales, como xdebug. No lo dejes habilitado en modo de producción; úsalo solo para depuración.

De esta manera, puedes crear rápidamente un entorno de prueba en un servidor virtual para los scripts necesarios y monitorear la actividad de la red sin arriesgar la exposición de datos.





Sin comentarios aún