En el ámbito de iptables, se utilizan los módulos --state
y --ctstate
para trabajar con el seguimiento de conexiones, una característica que permite identificar el estado de las conexiones de red y actuar en consecuencia. Aunque pueden parecer similares, tienen diferencias importantes en cuanto a funcionalidad y contexto de uso.
1. --state
: Módulo legacy
El módulo --state
pertenece a la extensión state
, que es una versión más antigua del seguimiento de conexiones. Esta extensión está estrechamente ligada al subsistema Netfilter en el kernel de Linux.
Estados disponibles con --state
:
NEW
: Indica el inicio de una nueva conexión.ESTABLISHED
: Señala que la conexión ya ha sido reconocida y existe una comunicación bidireccional.RELATED
: La conexión está asociada con una conexión existente (por ejemplo, conexiones FTP de datos creadas a partir de una conexión de control).INVALID
: La conexión no es válida o no puede ser identificada.
Ejemplo de regla con --state
:
# Permitir conexiones establecidas y relacionadas
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Bloquear conexiones inválidas
iptables -A INPUT -m state --state INVALID -j DROP
2. --ctstate
: La evolución moderna
--ctstate
forma parte del módulo conntrack, que reemplaza al módulo state
. Este es más flexible y potente, ya que aprovecha el sistema de seguimiento de conexiones avanzado integrado en Netfilter.
Estados disponibles con --ctstate
:
NEW
,ESTABLISHED
,RELATED
,INVALID
: Idénticos a los de--state
.- Estados adicionales en
--ctstate
:UNTRACKED
: Paquetes no rastreados intencionadamente por conntrack.SNAT
: Conexiones que usan Source NAT.DNAT
: Conexiones que usan Destination NAT.
Ejemplo de regla con --ctstate
:
# Permitir tráfico relacionado con conexiones NAT
iptables -A FORWARD -m conntrack --ctstate DNAT,ESTABLISHED -j ACCEPT
# Bloquear paquetes no rastreados
iptables -A INPUT -m conntrack --ctstate UNTRACKED -j DROP
Diferencias clave
Aspecto | --state | --ctstate |
---|---|---|
Módulo asociado | state (legacy) | conntrack (moderno) |
Compatibilidad | Kernel más antiguo | Kernel más reciente |
Estados adicionales | No | Sí (ej. UNTRACKED , SNAT , DNAT ) |
Uso recomendado | Descontinuado | Recomendado para configuraciones actuales |
Estados de conexión en iptables:
- NEW
El paquete inicia una nueva conexión que aún no ha sido vista por el sistema. - ESTABLISHED
El paquete pertenece a una conexión ya establecida y reconocida como válida por el sistema. - RELATED
El paquete está asociado con una conexión existente, pero no forma parte directamente de la misma (por ejemplo, conexiones de datos FTP que dependen de una conexión de control existente). - INVALID
El paquete no pertenece a ninguna conexión válida conocida por el sistema (puede deberse a errores o datos corruptos). - UNTRACKED
El paquete no es rastreado por el sistema de seguimiento de conexiones. Se utiliza para excluir ciertos paquetes del seguimiento.
Estados relacionados con NAT:
- DNAT (Destination Network Address Translation)
Aplica traducción de la dirección IP de destino en un paquete, redirigiéndolo a otra dirección IP. Es común en configuraciones de servidores donde el tráfico hacia una IP pública se redirige a una máquina interna. - SNAT (Source Network Address Translation)
Cambia la dirección IP de origen en un paquete, generalmente para permitir que una red privada acceda a Internet a través de una única IP pública.
Estos estados son compatibles e inherentes con los anteriores y suelen utilizarse en conjunto con NEW, ESTABLISHED y RELATED, dependiendo del flujo del tráfico. Por ejemplo, un paquete DNAT podría estar en estado NEW cuando inicia su conexión.
Ejemplo práctico en iptables:
Configuración básica de NAT:
# Hacer DNAT (redirección de tráfico hacia un servidor interno)
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
# Hacer SNAT (salida de red privada con una IP pública)
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 203.0.113.1
Uso combinado con estados:
# Permitir conexiones nuevas, establecidas y relacionadas en tráfico redirigido
iptables -A FORWARD -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# Bloquear paquetes inválidos, incluidos los relacionados con NAT
iptables -A FORWARD -m state --state INVALID -j DROP
Notas importantes:
- DNAT y SNAT no son "estados" propiamente dichos, sino acciones realizadas por las reglas de NAT. Sin embargo, los estados NEW, ESTABLISHED, y RELATED son críticos para gestionar el tráfico NAT correctamente.
- El sistema de seguimiento de conexiones (conntrack) rastrea los paquetes modificados por NAT para mantener la continuidad de las conexiones.
¿Cuándo usar uno u otro?
- Compatibilidad del sistema:
Si trabajas en un sistema moderno, utiliza--ctstate
para aprovechar sus características avanzadas y mayor flexibilidad. - Requerimientos específicos:
- Si necesitas manejar estados como
SNAT
oUNTRACKED
, es necesario usar--ctstate
. - Para configuraciones básicas y sistemas antiguos,
--state
puede ser suficiente.
- Si necesitas manejar estados como
- Normativa actual:
Como buena práctica, se recomienda usar--ctstate
, ya que el módulostate
está obsoleto en las versiones recientes de iptables y Netfilter.
Ejemplo práctico combinado
# Permitir tráfico legítimo y seguro
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Bloquear tráfico inválido y no rastreado
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A INPUT -m conntrack --ctstate UNTRACKED -j DROP
# Permitir conexiones nuevas en el puerto 80 (HTTP)
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
En resumen, la elección entre --state
y --ctstate
depende de la modernidad del sistema y los requisitos de la configuración de red. En general, para implementaciones nuevas y avanzadas, siempre se debería optar por --ctstate
.