# Diferencias entre --ctstate y --state en iptables

- Link: https://binariocero.com/redes/diferencias-entre-ctstate-y-state-en-iptables
- Published: 2024-12-05T18:12:59+01:00
- Author: Juan José Fernández Durán

![Loading](https://binariocero.com/wp-content/plugins/page-views-count/ajax-loader-
2x.gif)

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`:**

    ```wp-block-preformatted
    # Permitir conexiones establecidas y relacionadasiptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT# Bloquear conexiones inválidasiptables -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`:**

    ```wp-block-preformatted
    # Permitir tráfico relacionado con conexiones NATiptables -A FORWARD -m conntrack --ctstate DNAT,ESTABLISHED -j ACCEPT# Bloquear paquetes no rastreadosiptables -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**:

 1. **NEW**
    El paquete inicia una nueva conexión que aún no ha sido vista por el sistema.
 2. **ESTABLISHED**
    El paquete pertenece a una conexión ya establecida y reconocida
    como válida por el sistema.
 3. **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).
 4. **INVALID**
    El paquete no pertenece a ninguna conexión válida conocida por el sistema(
    puede deberse a errores o datos corruptos).
 5. **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:

 1. **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.
 2. **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:

    ```wp-block-preformatted
    # 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:

    ```wp-block-preformatted
    # Permitir conexiones nuevas, establecidas y relacionadas en tráfico redirigidoiptables -A FORWARD -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT# Bloquear paquetes inválidos, incluidos los relacionados con NATiptables -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?**

 1. **Compatibilidad del sistema:**
    Si trabajas en un sistema moderno, utiliza `--ctstate`
    para aprovechar sus características avanzadas y mayor flexibilidad.
 2. **Requerimientos específicos:**
 3.  * Si necesitas manejar estados como `SNAT` o `UNTRACKED`, es necesario usar `--
       ctstate`.
     * Para configuraciones básicas y sistemas antiguos, `--state` puede ser suficiente.
 4. **Normativa actual:**
    Como buena práctica, se recomienda usar `--ctstate`, ya que
    el módulo `state` está obsoleto en las versiones recientes de iptables y Netfilter.

#### **Ejemplo práctico combinado**

    ```wp-block-preformatted
    # Permitir tráfico legítimo y seguroiptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTiptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT# Bloquear tráfico inválido y no rastreadoiptables -A INPUT -m conntrack --ctstate INVALID -j DROPiptables -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`.
