iptables: diferencia entre paquetes NUEVOS, ESTABLECIDOS y RELACIONADOS

46

Parte de un firewall en un servidor:

iptables -A INPUT -p tcp --dport 22 -m state NEW --state -m recent --set

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 100 --hitcount 10 -j DROP

Cuando busco en línea, siempre veo que NUEVA se usa en esa regla, pero me cuesta entender por qué no se usan ESTABLECIDO y RELACIONADO.

Me gusta esto :

iptables -A INPUT -p tcp --dport 22 -m state NEW,ESTABLISHED,RELATED --state -m recent --set

iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED,RELATED -m recent --update --seconds 100 --hitcount 10 -j DROP

¿Alguien puede explicarme cuándo exactamente un NUEVO paquete cambia a ESTABLECIDO y RELACIONADO?

Kris
fuente

Respuestas:

46

Considere un paquete NUEVO, una llamada telefónica antes de que el receptor haya contestado. Un paquete ESTABLECIDO es su "Hola". Y un paquete RELACIONADO sería si estuviera llamando para informarles sobre un correo electrónico que estaba a punto de enviarles. (El correo electrónico está RELACIONADO).

En caso de que mi analogía no sea tan buena, personalmente creo que las páginas de manual lo manejan bien:

NUEVO - lo que significa que el paquete ha comenzado una nueva conexión, o de lo contrario asociado con una conexión que no ha visto paquetes en ambas direcciones, y

ESTABLECIDO: significa que el paquete está asociado con una conexión que ha visto paquetes en ambas direcciones,

RELACIONADO: significa que el paquete está iniciando una nueva conexión, pero está asociado con una conexión existente, como una transferencia de datos FTP o un error ICMP.

iptables (8) - página de manual de Linux

Aaron Copley
fuente
99
Por curiosidad, ¿sabes cómo determina los paquetes RELACIONADOS? ¿Existe algún mecanismo que las aplicaciones puedan usar para señalar a iptables que una conexión será una conexión relacionada, o es puramente parte de la parte con estado de iptables?
Matthew Scharley
99
Es manejado por una serie de módulos del núcleo llamados ip_conntrack_ *, cada uno escrito para un protocolo particular que usa conexiones no relacionadas (como FTP). Para responder a su pregunta, creo que necesitaría cargar un módulo similar para su aplicación.
Kyle Smith
44
Ok, gracias. Pero volviendo a la regla con NUEVO, ¿no es posible hacer que un paquete parezca que ya ESTÁ ESTABLECIDO y por lo tanto no está bloqueado por la regla?
Kris
2
@Kris: Es bastante difícil falsificar paquetes salientes, por lo que, según la redacción de la página de manual en la respuesta, no veo cómo. Tiene razón en que es posible falsificar un paquete que parece estar destinado a una conexión abierta, pero incluso sin un cortafuegos, la pila TCP simplemente dejaría caer el paquete en el piso si aún no sabía sobre una conexión abierta desde el remitente. Si esto está en un firewall en un enrutador, aún es posible mantener este estado inspeccionando los paquetes SYN/ ACK/ RST/ etc a medida que pasan a través del enrutador, y esperaría que iptables haga esto.
Matthew Scharley
2
@Kris: Algo similar a esto (aunque no es técnicamente idéntico) es utilizado por el software VNC como TeamViewer para hacer un túnel a través de firewalls / enrutadores. El proceso se llama perforar agujeros . En resumen, tiene una PC host (que podría estar detrás de un firewall de restricción) a la que desea conectarse desde un dispositivo diferente (a través de Internet). Ambas PC abren una conexión individual a un servidor separado (por ejemplo, el Servidor TeamViewer), que "media" entre ellas, por lo que se ve en sus firewalls como si los paquetes estuvieran relacionados y, por lo tanto, esas PC pueden establecer una conexión separada con cada uno otro.
Levite
14

Asumiendo que tanto el servidor como el cliente sean restrictivos INPUTy abiertos OUTPUT, es decir:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT

Y de iptables-extensions (8) sobre el ejemplo de FTP en modo activo:

1. NUEVO

NUEVO El paquete ha comenzado una nueva conexión o se ha asociado con una conexión que no ha visto paquetes en ambas direcciones.

El cliente en el puerto 50000(cualquier puerto aleatorio sin privilegios) se conecta al servidor FTP en el puerto 21, el servidor necesitaría al menos esto para aceptar esta conexión entrante:

iptables -A INPUT --dport 21 -m state --state NEW -j ACCEPT

2. ESTABLECIDO

ESTABLECIDO El paquete está asociado con una conexión que ha visto paquetes en ambas direcciones.

Ahora, en el lado del cliente, abrió una conexión de salida de servidor en el puerto 21utilizando un puerto local 50000y necesita los siguientes iptables para permitir que la respuesta a llegar a partir server (21)de client (50000):

sudo iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

3. RELACIONADO

RELACIONADO El paquete está iniciando una nueva conexión, pero está asociado con una conexión existente, como una transferencia de datos FTP o un error ICMP.

Ahora, una vez que se ha establecido la conexión FTP y se va a realizar una conexión de datos, el cliente abrirá un socket de servidor (sí, con el cliente FTP activo se convierte en un servidor para la conexión de datos) en el puerto 60000(según tengo entendido, el cliente marcará este puerto 60000en cuanto RELATEDa la otra conexión desde 50000->21) y enviará este número de puerto al servidor utilizando el PORTcomando FTP . Luego, el servidor FTP abrirá una nueva conexión de su puerto 20a puerto 60000en el cliente, y bueno, el cliente ahora requiere lo siguiente para permitir que esta nueva conexión tenga éxito:

sudo iptables -A INPUT -m state --state RELATED -j ACCEPT

Finalmente, para que esto funcione, debe habilitar el ip_conntrack_ftpmódulo del kernel para permitir que el sistema marque conexiones / paquetes como RELATED( según tengo entendido, no he profundizado demasiado en esto):

modprobe ip_conntrack_ftp
Jaime Hablutzel
fuente
establecido solo requiere flujo unidireccional originado localmente previamente, no un apretón de manos tcp de 3 vías, ¿es correcto mi entendimiento?
sdaffa23fdsf
Gracias por la respuesta, por establecer que dijo "iptables para permitir que la respuesta llegue del servidor (21) al cliente (50000)" si es DE servidor a cliente, ¿por qué es ENTRADA y NO SALIDA?
Medya
@Medya, porque desde la perspectiva del cliente, los paquetes enviados desde el servidor (21) al cliente (50000) son paquetes entrantes, por lo que para el cliente es un INPUT.
Jaime Hablutzel