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.