LinuxParty
🔐 Cómo crear chains reutilizables en iptables para una gestión de firewall más eficiente
Cuando administramos un firewall con iptables
, mantener las reglas organizadas y comprensibles se vuelve esencial, especialmente a medida que el número de reglas crece. En lugar de tener una lista desordenada y difícil de mantener, podemos crear chains personalizadas reutilizables, lo que nos permite aplicar lógicas de filtrado específicas en distintos puntos del proceso.
Usar cadenas personalizadas en iptables
es una práctica que facilita la gestión del firewall, especialmente en entornos con múltiples servicios y rangos IP cambiantes. Esta técnica no solo mejora la legibilidad y el mantenimiento del sistema, sino que permite una gestión más modular y segura de las reglas de red.
🎯 Objetivo del ejemplo
Supongamos un caso práctico y simplificado: tenemos un sistema Linux con un proxy escuchando en el puerto 3128
(por ejemplo, Squid), y queremos permitir el acceso remoto únicamente desde ciertos rangos de IP. Hasta ahora, la regla existente es la siguiente:
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- anywhere anywhere tcp dpt:squid reject-with tcp-reset
❌ Problema
Agregar directamente los rangos permitidos al chain INPUT
funcionaría, pero se volvería inmanejable si:
-
Aumentan los rangos de IP permitidos.
-
Se habilitan otros puertos para los mismos rangos.
Para evitar este desorden, la solución es crear una nueva cadena personalizada.
🛠️ Paso a paso
1. Crear una nueva cadena: EXTERNOS
# iptables -N EXTERNOS
Podemos verificar que se ha creado correctamente:
# iptables -L
Chain EXTERNOS (0 references)
target prot opt source destination
2. Añadir rangos IP permitidos
Ahora agregamos las IP o rangos autorizados en esta nueva cadena:
# iptables -A EXTERNOS -s 84.88.0.0/24 -j ACCEPT
# iptables -A EXTERNOS -s 213.55.111.66/32 -j ACCEPT
3. Añadir reglas de rechazo y caída
Agregamos un rechazo con tcp-reset
para conexiones no autorizadas, y finalmente un DROP
para el resto:
# iptables -A EXTERNOS -p tcp -j REJECT --reject-with tcp-reset
# iptables -A EXTERNOS -j DROP
Esto asegura que conexiones no autorizadas reciban una respuesta rápida (evitando aparecer como "filtered" en escaneos nmap
) y que todo lo demás se descarte silenciosamente.
4. Sustituir la regla original en INPUT
Primero, eliminamos la regla genérica anterior:
# iptables -D INPUT -i eth0+ -p tcp --dport 3128 -j REJECT --reject-with tcp-reset
Luego, redirigimos ese tráfico a la nueva chain EXTERNOS
:
# iptables -A INPUT -i eth0+ -p tcp --dport 3128 -j EXTERNOS
✅ Resultado esperado
Al ejecutar:
# iptables -L -nv
Deberías ver algo como esto:
Chain INPUT (policy ACCEPT)
pkts bytes target prot opt in out source destination
10 440 EXTERNOS tcp -- eth0+ * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3128
Chain EXTERNOS (1 references)
pkts bytes target prot opt in out source destination
8 336 ACCEPT all -- * * 84.88.0.0/24 0.0.0.0/0
0 0 ACCEPT all -- * * 213.55.111.66 0.0.0.0/0
2 104 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 reject-with tcp-reset
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
💾 Guardar configuración
Para mantener las reglas tras un reinicio, guarda la configuración:
# /etc/init.d/iptables save
Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
🔁 Ventajas de usar chains reutilizables
-
✅ Centralizas el control de IPs autorizadas.
-
✅ Puedes aplicar la chain
EXTERNOS
a otros puertos sin duplicar reglas. -
✅ Para añadir o eliminar IPs, solo modificas una cadena.
Ejemplo: Si mañana necesitas habilitar el puerto 22
para los mismos rangos:
# iptables -A INPUT -i eth0+ -p tcp --dport 22 -j EXTERNOS
