Firewall Stateful vs. Stateless: diferencias y aplicaciones
¿Sabes la diferencia entre un firewall stateful y uno stateless? Hoy veremos sus características y algunas recomendaciones sobre su uso. ¡Vamos!
Completando la documentación para el mi nuevo curso de Firewalling con NFTables, vamos a analizar algunas configuraciones que permiten tanto iptables como nftables, y es el manejo de estados de las conexiones.
¿Estados de las conexiones?
Los firewalls de Netfilter (iptables, nftables, etc), cuando reciben un paquete nuevo, que no es respuesta de ningún mensaje anterior, lo marcan con un estado: NEW. Esto quiere decir que se trata de un paquete que inicia una nueva conexión.
El mensaje de respuesta a dicho paquete es etiquetado como ESTABLISHED, es decir, un paquete que pertenece a una conexión previamente establecida (la que se inició con NEW).
El resto de los mensajes de dicha conexión también son etiquetados como ESTABLISHED, ya que se asocian a la misma conexión.
Por otro lado, los mensajes inválidos, que tienen errores de checksum, o datos mal cargados en las cabeceras, son marcados como INVALID.
Finalmente, otro estado que nos interesa aquí es el de conexiones relacionadas. Algunos protocolos son de conexión múltiple, como es el caso de FTP. FTP utiliza una conexión principal como canal de control, por donde el usuario envía los comandos, y usa otra conexión secundaria para enviar el contenido de los archivos.
A esta conexión secundaria se la denomina canal de datos, y es abierta, ya sea por cliente o servidor FTP (según esté trabajando en modo activo o pasivo respectivamente), y para el firewall se trata de una conexión RELATED.
¿Y para qué nos sirve esto? Ya lo veremos…
Nota al margen… conexiones
Nota: cuando hablamos de estos estados de conexión en un firewall de Netfilter, no nos estamos refiriendo al concepto de «conexión» del protocolo TCP.
Como sabemos, una conexión TCP se establece en un handshake de 3 mensajes, SYN, SYN-ACK y ACK. Aquí, un paquete que pasa en un sentido es NEW, y su respuesta ya es ESTABLISHED, por lo que un mensaje TCP SYN sería etiquetado como NEW, y la respuesta, SYN-ACK, ya sería ESTABLISHED, por mas que la conexión TCP aún no se haya establecido.
Es más, la respuesta a un segmento UDP , o a un mensaje ICMP como el ping
, también se considera ESTABLISHED, por más que estos protocolos no sean orientados a la conexión.
Firewall stateless (sin estados)
Un firewall stateless examina cada paquete de forma independiente, sin tener en cuenta si forma parte de una conexión existente o no. Evalúa las reglas configuradas, una por una, y toma una decisión de permitir o denegar el tráfico basándose exclusivamente en las características del paquete: dirección IP, puerto, protocolo, etc… todos aquellos datos que configuramos en el patrón de selección de tráfico.
¿Qué ventajas tiene este tipo de configuraciones?
Utiliza menos recursos del sistema, ya que no debe almacenar estado de conexiones, solamente limitarse a comparar patrones de selección de tráfico.
En general la velocidad de procesamiento suele ser bastante buena, por lo que el firewall tendrá buen rendimiento.
Además, para entornos pequeños, suele ser una configuración bastante simple.
Pero, como todo en la vida, tiene su lado negativo.
Este firewall no reconoce si un paquete que quiere ingresar a la red proviene de una dirección legítima. Podríamos tener un paquete que intenta ingresar a la red como respuesta de otro saliente, sin que haya sido aceptada la consulta. Esto permitiría el ingreso de paquetes fuera de contexto, o incluso, atauques de suplantación (spoofing).
Por otro lado, requiere más reglas, y más específicas y detalladas, lo que puede causar dificultades de mantenimiento, principalmente en redes grandes.
Firewall stateful (con estados)
Un firewall stateful realiza un seguimiento del estado de las conexiones activas. Sabe si un paquete pertenece a una conexión existente, si es una nueva solicitud o una respuesta esperada, o si se trata de un paquete inválido.
Esto permite aplicar reglas de manera más inteligente y segura, ya que el firewall puede distinguir entre tráfico legítimo y malicioso según el contexto de la sesión.
Así, podríamos aceptar paquetes que salgan desde la LAN hacia Internet, etiquetados como NEW, y aceptar paquetes que vengan desde Internet únicamente de tipo ESTABLISHED.
Esto reduciría la cantidad de reglas de nuestro firewall, facilitando el mantenimiento.
Ayuda también a gestionar mejor los protocolos de conexión múltiple como FTP, ya que, independientemente de quién establezca la conexión de datos, podríamos aceptarla aceptando paquetes RELATED.
Este firewall ayuda a mejorar la seguridad identificando mejor las conexiones y respuestas válidas, reduciendo ataques de spoofing y tráfico fuera de contexto.
Aquí también tenemos algunas desventajas.
En primer lugar, este tipo de configuraciones requiere un poco más de CPU y memoria, aunque con el hardware actual difícilmente esto sea un inconveniente.
Puede también ser menos eficiente en redes grandes, o con tráfico intenso, aunque considerando la seguridad añadida que brinda, igual puede ser la mejor opción.
Comparando características
Veamos una breve lista con algunas de las características que acabo de mencionar:
Stateless Firewall | Stateful Firewall | |
Rastreo de conexiones | No | Si |
Rendimiento en redes simples | Alto | Variable |
Seguridad ante ataques | Limitada | Alta |
Reglas necesarias | Más reglas, y detalladas | Menos reglas, y simples |
Manejo de protocolos de conexión múltiple | Manual | Automático |
Uso de recursos de hardware | Bajo | Medio/Alto |
¿Cuándo usar cada uno?
Como regla general, es recomendable utilizar un firewall stateful:
- Cuando la seguridad es una prioridad, como las redes corporativas, entornos críticos, o aplicaciones conectadas a Internet.
- Cuando en la red se manejan protocolos de conexiones múltiples, como FTP y, si no me equivoco, también SIP y H.323.
- Cuando la configuración es tan grande que se requiera un conjunto de reglas acotado y fácil de administrar.
Ahora, en qué ambiente podríamos usar un firewall stateless?
- En redes de alto rendimiento o baja criticidad, ideal para entornos académicos y de investigación.
- Cuando se necesita máxima velocidad de procesamiento, y bajo consumo de memoria.
- Cuando se necesita un filtro simple y rápido de paquetes en routers y switches intermedios.
Conclusiones
Primero que nada, cabe una aclaración. Cuando hablamos de que un firewall puede ser stateful o stateless, nos referimos a sus configuraciones, no a la implementación de software. Es decir, nftables o iptables, ambos, pueden ser configurados como stateful o stateless dependiendo de las reglas que carguemos.
En fin, hemos visto las principales características de cada uno de estos tipos de firewalls, ahora toca elegir uno para cada caso. Si bien stateless suele tener mejor rendimiento, en general, yo suelo utilizar firewall stateful en mis configuraciones, la facilidad de configuración y mantenimiento es una enorme ventaja sobre una configuración sin manejo de estados.
Además, aumenta la seguridad y facilita la configuración de protocolos como FTP.
Suelo usar configuraciones stateless para pruebas de concepto, simulación de escenarios de ataque, o para explicar sus características en mis clases, pero en producción en general utilizo estados de conexiones.
Y lo que falta, es ver ejemplos de configuraciones de stateful y stateless con iptables y nftables, pero eso será para otra oportunidad, si les interesa comenten en Telegram! 🙂
Hasta la próxima!