Al usar las reglas de firewall de iptables, ¿por qué afirmar el estado NUEVO en todos los puertos permitidos?

23

A menudo veo iptables configuradas para permitir todos los paquetes a conexiones RELACIONADAS, y los puertos de servicio específicos a NUEVAS conexiones.

¿Cuál es la razón para declarar NUEVO? Si una conexión no es NUEVA, está RELACIONADA, supongo, por lo que la regla de puerto específica no se ejecutará. Entonces, ¿por qué definir explícitamente los puertos de servicio con NUEVO y no solo protocolo y número de puerto?

Dronus
fuente

Respuestas:

21

Las reglas en un firewall de netfilter (iptables) se verifican secuencialmente y el destino del paquete (ACEPTAR, DROP, RECHAZAR, etc.) se determina en una primera coincidencia.

Al hacer que el cortafuegos tenga estado y que la primera regla sea la típica, -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPTse acepta la gran mayoría del tráfico legítimo a su servidor después de pasar solo esa regla única. Ese tráfico no necesita atravesar ninguna otra regla.

Dependiendo del tamaño de su base de reglas, eso puede significar una diferencia significativa en el rendimiento de su firewall.

El único tráfico que el firewall ahora necesita validar son las conexiones explícitamente nuevas.

Es decir, comparo un firewall para un servidor web público con acceso para unos pocos webmasters desde sus estaciones de trabajo:

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp -m multiport --dports 80,443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -m iprange --src-range 10.9.8.7-10.9.8.10 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited

Aproximadamente el 99% de los paquetes legítimos pertenecerán a conexiones establecidas, solo cumpliendo con la primera regla. De los paquetes que no coinciden con esa regla, la mayoría deben ser conexiones nuevas a su sitio web, el módulo multipuerto puede otorgar acceso a HTTP o HTTPS en una sola regla. Los webmasters inician sesión desde varias estaciones de trabajo con direcciones fijas usando ssh y sftp y todo lo demás es rechazado.

Un firewall donde las reglas se ordenan lógicamente por el puerto TCP:

-A INPUT -p tcp  -m tcp --dport 22  --source 10.9.8.7 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 22  --source 10.9.8.8 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 22  --source 10.9.8.9 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 22  --source 10.9.8.10 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 443 -j ACCEPT

Aquí todos y cada uno de los paquetes a su servidor web HTTP tendrían que verificarse con 5 reglas antes de que se otorgue el acceso. Y con más servicios que se ejecutan en un servidor que puede convertirse fácilmente en 50 reglas o mucho más cuando, por ejemplo, usaría fail2ban o productos similares.

HBruijn
fuente
1
Una respuesta excelente (¡+1 de mi parte!) Excepto que usted dice "el acceso está permitido en una primera partida ". Si la primera coincidencia es DROP o RECHAZO, esto no permitirá el acceso; si se trata de un REGISTRO, debe continuar buscando una coincidencia posterior; y si se involucran cadenas personalizadas, las cosas pueden volverse bastante barrocas. Más bien diría que " el destino del paquete se determina en base a la primera coincidencia de dispositivos ".
MadHatter apoya a Monica
55
¿Puede reflexionar sobre el caso en que la related/establishedlínea está presente pero las reglas posteriores no se afirman NEW?
Daniel Widrick
13

NEW significa que el paquete ha comenzado una nueva conexión.

Lo manejan los módulos del kernel llamados ip_conntrack_*que hacen que su Firewall tenga estado . Los firewalls con estado pueden ver flujos de tráfico.

Si solo especifica el protocolo y el número de puerto, su Firewall no tiene estado, sino que no tiene estado. Significa que solo restringe o bloquea paquetes. Este tipo de firewall no conoce los flujos de datos.

Un buen ejemplo es FTP: el FTP activo usa el puerto 21 para el canal de control pero luego usa el puerto 20 para el canal de datos. En el caso de un Firewall con estado, no necesita abrir explícitamente el puerto 20 porque está relacionado con una nueva conexión establecida anterior en el puerto 21.

Aquí hay un extracto de la iptablespágina man:

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

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.

krisFR
fuente
1
¿Qué mecanismo 'asociará' el puerto 20 con el puerto 21? ¿Se puede transferir una conexión IP abierta a otro puerto?
dronus
nf_conntrack_ftp.ko
mateusza
7
-A INPUT -m tcp -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -DROP

El conjunto de reglas anterior permitirá que los paquetes lleguen al puerto TCP 22 con un estado de INVALIDhastaACCEPT

No válido : si ninguno de los estados anteriores se aplica, el paquete está en estado NO VÁLIDO. Esto podría deberse a varios tipos de sondas de red ocultas, o podría significar que se está quedando sin entradas de CONNTRACK (que también debería ver en sus registros). O simplemente puede ser completamente benigno.

/unix/57423/how-to-understand-why-the-packet-was-considered-invalid-by-the-iptables


La afirmación de ESTADO NEWasegura que los paquetes NO VÁLIDOS no sean aceptados por error.

Y para aclarar los significados:

  • NUEVO : esta es una nueva conexión
  • ESTABLECIDO : Este es un paquete involucrado en una conexión actual
  • RELACIONADO : Esta es una nueva conexión, pero ha sido predicada por una conexión existente
  • NO VÁLIDO : Ninguno de los anteriores se aplica.
Daniel Widrick
fuente