Introducción a nftables y familia de direcciones
Historia e Introducción
Antes de iptables y nftables, existía ipfwadm, una herramienta que se utilizaba en las primeras versiones del kernel de Linux para gestionar el firewall. Aunque ipfwadm sentó las bases para el firewalling en Linux, fue reemplazada debido a su limitada capacidad de manejo de tráfico y escalabilidad. Primero fue sustituida por ipchains y más tarde por el popular iptables.
Comunidad y Grupos Clave
-
Netfilter Project: La comunidad principal detrás de iptables y nftables. Este grupo ha sido esencial en el desarrollo, mantenimiento y promoción de herramientas de filtrado de paquetes en Linux.
-
Kernel Contributors: Muchos desarrolladores de kernel han colaborado en la optimización de las capacidades de firewalling en Linux, asegurando su integración fluida y eficiente.
Creación de nftables
nftables fue introducido en 2014 como el sucesor de iptables, diseñado para abordar las limitaciones de su predecesor en términos de rendimiento y escalabilidad.
Si bien eso fue hace más de 10 años, hay cambios tecnológicos que van por ascensor y otros por escalera. En ámbitos corporativos el mero hecho de reemplazar un software que es cardinal en una infraestructura, no es una tarea trivial. Ese cambio se debe a que los tiempos de vida de las distribuciones que las medianas y grandes organizaciones tienen soporte a largo a plazo. A veces es falta de urgencia y otras veces por sencilla negligencia :smile:.
Sin embargo apenas 3 datos para considerar la adopción de nftables:
-
RHEL9 considera iptables, ipset y ebtables herramientas depreciadas.
-
iptables no estará disponible en RHEL10 ni en OpenShift 4.16.
-
Debian Bullseye (a la fecha oldstable) ha depreciado iptables en favor de nftables.
¿Cuál es el problema de iptables?
Aunque ha sido una herramienta extraordinaria que ha servido de base para muchas soluciones de firewall, iptables presenta algunas limitaciones. A continuación, mencionamos tres de las más importantes:
-
Reprocesamiento completo al modificar reglas:
Cada vez que se agrega o elimina una regla, el kernel debe volver a procesar toda la lista de reglas. Este enfoque resulta ineficiente, especialmente en entornos donde se realizan cambios frecuentes o se manejan firewalls con un gran número de reglas. -
Gestión complicada de rangos de direcciones IP:
Manejar rangos de direcciones IP o grandes conjuntos de direcciones en iptables puede ser tedioso y poco práctico. La herramienta ipset fue una solución ingeniosa para optimizar esta tarea, ya que permite manejar conjuntos de IPs, rangos o puertos de manera más eficiente. Sin embargo, su uso añade una capa de complejidad adicional al proceso de configuración y gestión. -
Extensiones con sintaxis inconsistente:
iptables cuenta con extensiones como xtables, que amplían sus funcionalidades al incluir capacidades avanzadas como el seguimiento de conexiones o la inspección profunda de protocolos. No obstante, la sintaxis de estas extensiones no siempre es uniforme ni intuitiva, lo que puede dificultar su uso y generar confusiones en configuraciones complejas.
En cambio, desde su incorporación, nftables ha demostrado ser una herramienta eficiente y moderna para la gestión del tráfico de red en Linux. Una de sus principales innovaciones es consolidar las herramientas clásicas como iptables, ip6tables, ebtables y arptables en una única interfaz, simplificando tanto la configuración como el mantenimiento.
Conceptos claves de nftables
Contexto y Familias de Direcciones
En iptables
, cada tipo de tráfico o protocolo tenía su propio comando o herramienta específica, que funcionaba de manera independiente:
Comando/herramienta | Propósito |
---|---|
iptables |
Filtrar y manipular tráfico IPv4. |
ip6tables |
Filtrar y manipular tráfico IPv6. |
arptables |
Filtrar y manipular tráfico ARP. |
ebtables |
Filtrar tráfico en bridges (Ethernet frames). |
Cada una de estas herramientas tenía su propia sintaxis y requería comandos separados para manejar diferentes tipos de tráfico, lo que podía ser confuso y propenso a errores.
Problemas del enfoque de iptables
-
Fragmentación:
- Si querías manejar tráfico IPv4 e IPv6, debías configurar reglas separadas con
iptables
eip6tables
, incluso si las reglas eran idénticas. - Lo mismo ocurría si querías gestionar tráfico ARP con
arptables
o tráfico en bridges conebtables
.
- Si querías manejar tráfico IPv4 e IPv6, debías configurar reglas separadas con
-
Falta de unificación:
- Cada herramienta tenía su propia lógica, lo que aumentaba la complejidad administrativa.
- No existía una forma centralizada de gestionar tráfico que abarcase múltiples protocolos o tipos de datos.
-
Mantenimiento difícil:
- Las configuraciones de firewall requerían gestionar múltiples conjuntos de reglas, lo que hacía el mantenimiento y la depuración más complicados.
Cómo nftables
mejoró este enfoque:
-
Introducción de familias: En
nftables
, las familias permiten manejar diferentes tipos de tráfico dentro de un mismo marco conceptual, con una sintaxis unificada.- Familia
ip
: Maneja tráfico IPv4. - Familia
ip6
: Maneja tráfico IPv6. - Familia
inet
: Unifica IPv4 e IPv6. - Familia
arp
: Maneja tráfico ARP. - Familia
bridge
: Maneja tráfico L2 en bridges. - Familia
netdev
: Maneja tráfico en interfaces específicas.
- Familia
-
Unificación de reglas:
- Con la familia
inet
, puedes escribir reglas que funcionen tanto para IPv4 como para IPv6. - Esto simplifica significativamente la configuración y el mantenimiento del firewall.
- Con la familia
-
Menor duplicación de configuraciones: En lugar de mantener múltiples herramientas (
iptables
,ip6tables
,arptables
,ebtables
), todo se gestiona con el comandonft
.
Ejemplos en nftables
:
# Una regla para IPv4 e IPv6 nft add rule inet filter input ip saddr 192.168.0.0/24 accept nft add rule inet filter input ip6 saddr fc00::/7 accept
nft add table arp filter nft add chain arp filter input { type filter hook input priority 0; } # Permitir solicitudes ARP desde el rango 192.168.1.0/24 en eth0 nft add rule arp filter input iif "eth0" arp sip 192.168.1.0/24 arp op request accept # Bloquear cualquier otra solicitud ARP nft add rule arp filter input iif "eth0" arp op request drop
nft add table bridge filter nft add chain bridge filter forward { type filter hook forward priority 0; } # Permitir solicitudes ARP desde direcciones MAC específicas en el bridge br0 nft add rule bridge filter forward iif "br0" ether type arp arp op request ether saddr 00:11:22:33:44:55 accept nft add rule bridge filter forward iif "br0" ether type arp arp op request ether saddr 00:aa:bb:cc:dd:ee accept # Bloquear cualquier otra solicitud ARP en el bridge nft add rule bridge filter forward iif "br0" ether type arp arp op request drop
Diferencia entre las familias inet y netdev
La familia netdev
puede ser una opción adecuada para implementar policing con nftables
, dependiendo del escenario. Esto se debe a que la familia netdev
opera en el hook ingress
, lo que significa que puede evaluar el tráfico directamente en la interfaz antes de que llegue al stack de red.
Vamos a explorar por qué usar la familia netdev
podría ser más apropiado para policing en algunos casos y cuándo es mejor utilizar otras familias.
Por qué usar la familia netdev
para policing:
- Posición temprana en el flujo del tráfico:
- La familia
netdev
opera en el hookingress
, lo que significa que intercepta el tráfico inmediatamente después de que llega a la interfaz de red y antes de que sea procesado por el stack TCP/IP. - Esto permite implementar políticas de policing directamente en el nivel de la interfaz, evitando sobrecargar el sistema con tráfico innecesario.
Ejemplo de regla de policing en netdev
:
nft add table netdev ingress nft add chain netdev ingress mychain { type filter hook ingress priority 0; } nft add rule netdev ingress mychain ip limit rate 10 mbps drop
-
Esta regla limita el tráfico IP entrante a 10 Mbps en la interfaz.
-
Evitar procesamiento innecesario:
-
Como
netdev
actúa antes de que los paquetes sean entregados al stack TCP/IP, los paquetes que no cumplen con las políticas son descartados sin consumir recursos adicionales del sistema. -
Ideal para interfaces específicas:
-
Cuando el objetivo es aplicar policing solo en una interfaz específica (por ejemplo,
eth0
), la familianetdev
es la opción más directa. -
Compatibilidad con
limit rate
: - La familia
netdev
admite acciones comolimit rate
, que es esencial para configurar políticas de policing basadas en rates.
¿Cuándo usar netdev
frente a otras familias (ip
, inet
)?
Criterio | Familia netdev |
Familias ip /inet |
---|---|---|
Posición en el stack | Hook ingress , antes del stack TCP/IP. |
Hook prerouting , forward , o input , después de ingresar al stack. |
Eficiencia | Muy alta: paquetes descartados antes de procesarse. | Menor: los paquetes son procesados parcialmente antes de aplicar las políticas. |
Tráfico inspeccionado | Solo tráfico entrante en una interfaz específica. | Tráfico en todas las interfaces (dependiendo de la configuración). |
Complejidad de las reglas | Más limitada: ideal para políticas simples (policing básico). | Más flexible: soporta reglas complejas (filtrado avanzado, conntrack). |
Uso típico | Policing directo en una interfaz (DDoS, límites de ancho de banda). | Filtrado y políticas basadas en estado o dirección IP. |
Limitaciones de la familia netdev
:
- Solo para tráfico entrante:
-
La familia
netdev
opera únicamente en el hookingress
, por lo que no puedes aplicar policing en el tráfico saliente de una interfaz. -
Falta de seguimiento de conexiones (
conntrack
): -
No puedes usar estados como
NEW
oESTABLISHED
, ya quenetdev
opera antes de que el móduloconntrack
pueda procesar el tráfico. -
Menor flexibilidad:
- Si necesitás reglas más complejas basadas en capas superiores (por ejemplo, L7 o estados de conexión), las familias
ip
oinet
son más adecuadas.
¿Cuándo es mejor usar la familia netdev
para policing?
-
Tráfico entrante en una interfaz específica: Cuando necesitás limitar o descartar tráfico directamente en una interfaz antes de que afecte el sistema. Ejemplo: Mitigar un ataque DDoS en
eth0
. -
Simplicidad y eficiencia: Si solo necesitas evaluar tráfico basándote en tasas o direcciones básicas (IP, MAC).
Ejemplo práctico:
Supongamos que queremos limitar el tráfico entrante a 100 Mbps en una interfaz específica (eth0
):
nft add table netdev ingress nft add chain netdev ingress eth0_chain { type filter hook ingress priority 0; } nft add rule netdev ingress eth0_chain limit rate 100 mbps drop
Diferencia entre la familia bridge y netdev
Dado que la tanto la tabla bridge como la tabla netdev operan en Capa 2 uno podría preguntarse, qué diferencia hay entre estas dos familias, aquí tenemos una tabla comparativa detallada entre las familias bridge
y netdev
en nftables
:
Aspecto | Familia bridge |
Familia netdev |
---|---|---|
Nivel del modelo OSI | Capa 2 (L2) | Capa 2 (L2), pero en el contexto de interfaces individuales. |
Tráfico manejado | Tráfico que cruza un bridge (tramas Ethernet). | Todo el tráfico en una interfaz específica antes de llegar al stack de red. |
Propósito principal | Controlar y filtrar tráfico dentro de bridges. | Filtrar tráfico en una interfaz individual (sin importar si forma parte de un bridge). |
Ámbito de aplicación | Solo funciona en interfaces que forman parte de un bridge. | Funciona en cualquier interfaz (física o virtual), bridge o no. |
Casos de uso típicos | - Aislar tráfico entre puertos de un bridge. - Proteger bridges contra broadcast storms, spoofing de MAC, etc. - Controlar tráfico entre VLANs en un bridge. |
- Filtrar tráfico directo en una interfaz (ingress/egress). - Detectar y mitigar DDoS a nivel de interfaz. - Filtrar ARP o IPv4 antes de pasar al stack de red. |
Compatibilidad con VLANs | Sí, puede filtrar tráfico basado en etiquetas VLAN (802.1Q). | No trabaja específicamente con VLANs. |
Estado de conexión | No tiene integración con conntrack . |
No tiene integración con conntrack . |
Posición en el stack | Filtra tráfico que pasa a través de un bridge antes de ser reenviado. | Filtra tráfico directamente en una interfaz, antes de ser procesado por el stack de red. |
Soporte de ARP | Sí, puede filtrar tramas ARP. | Sí, puede filtrar tramas ARP. |
Soporte de IPv4/IPv6 | Sí, puede inspeccionar tráfico IP encapsulado. | Sí, puede inspeccionar tráfico IP encapsulado. |
Direcciones MAC | Puede filtrar según direcciones MAC de origen y destino. | Puede filtrar según direcciones MAC de origen y destino. |
Uso con interfaces individuales | No, requiere que las interfaces formen parte de un bridge. | Sí, funciona en cualquier interfaz individual. |
Reemplaza a... |
ebtables . |
tc ingress para ciertas tareas de filtrado. |
Limitaciones | - Solo opera en tráfico dentro de bridges. - No puede controlar tráfico de interfaces individuales fuera del bridge. |
- No tiene integración con conntrack .- No puede manejar tráfico reenviado entre interfaces. |
Diferencias clave entre bridge
y netdev
:
- Ámbito del tráfico manejado:
-
bridge
: Filtra tráfico que cruza un bridge, conectando múltiples interfaces dentro del mismo dominio de difusión. -
netdev
: Filtra tráfico directo en una interfaz individual, antes de pasar al stack de red. -
Dependencia de bridges:
-
bridge
: Solo funciona en interfaces que son parte de un bridge. -
netdev
: Funciona en cualquier interfaz, sin importar si es parte de un bridge o no. -
Posición en el stack de red:
-
bridge
: Opera después de que el tráfico ha ingresado al bridge pero antes de ser reenviado a otra interfaz. -
netdev
: Opera antes de que el tráfico entre al stack de red del sistema operativo, en el hookingress
. -
Casos de uso:
-
bridge
: Aislar tráfico dentro del bridge, controlar VLANs, proteger contra ataques L2 como spoofing de MAC. -
netdev
: Inspeccionar todo el tráfico que entra o sale de una interfaz específica, ideal para mitigación temprana de DDoS o filtros basados en MAC/IP/ARP.
¿Cuándo usar cada una?
Usa la familia bridge
si:
- Tenemos configurado un bridge que conecta múltiples interfaces.
- Necesitamos controlar tráfico entre dispositivos conectados al mismo bridge.
- Queremos aislar tráfico entre VLANs o puertos del bridge.
- Deseamos implementar políticas de seguridad para tráfico L2 dentro del bridge.
Usa la familia netdev
si:
- Queremos filtrar tráfico directo en una interfaz individual, incluso si no es parte de un bridge.
- Necesitamos mitigar DDoS o ataques en el hook más temprano (
ingress
), antes de que el tráfico llegue al stack de red. - Deseamos inspeccionar tráfico ARP, IPv4 o IPv6 en una interfaz específica.
Ejemplos prácticos:
Con bridge
:
- Bloquear tráfico entre dos interfaces en un bridge:
nft add table bridge filter nft add chain bridge filter forward { type filter hook forward priority 0; } nft add rule bridge filter forward iif "eth0" oif "eth1" drop nft add rule bridge filter forward iif "eth1" oif "eth0" drop
- Permitir solo tráfico ARP en el bridge:
nft add rule bridge filter forward ether type arp accept nft add rule bridge filter forward drop
Con netdev
:
- Bloquear todo el tráfico IPv4 en una interfaz específica (
eth0
):
nft add table netdev filter nft add chain netdev filter ingress { type filter hook ingress priority 0; } nft add rule netdev filter ingress iif "eth0" ip drop
- Mitigar ataques DDoS limitando paquetes por segundo:
nft add rule netdev filter ingress iif "eth0" ip limit rate 1000/second drop
Entonces:
-
Familia
bridge
: Para manejar tráfico dentro de un bridge, enfocándose en L2 (direcciones MAC, VLANs, tramas Ethernet). -
Familia
netdev
: Para filtrar tráfico temprano en una interfaz específica, independientemente de si forma parte de un bridge.
Ambas familias trabajan en L2, pero con propósitos distintos y aplicables en diferentes escenarios.
Resumen:
En iptables
, no existía el concepto de familias. En su lugar, se usaban herramientas separadas para cada protocolo o tipo de tráfico (iptables
, ip6tables
, arptables
, ebtables
). Esto hacía que la configuración fuera fragmentada y menos eficiente.
Con la llegada de nftables
, se introdujo el concepto de familias para unificar la gestión de diferentes tipos de tráfico, mejorando la flexibilidad, la simplicidad y el mantenimiento de las reglas de firewall. Este cambio fue una de las razones clave por las que nftables
es considerado un reemplazo moderno y más avanzado.
Conocer en profundidad nftables y el concepto de las familias, tiene implicancias sumamente prácticas. Por ejemplo: ¿qué familia usarías para poder separar en una misma LAN el tráfico inalámbrico del cableado? Lo dejo para que lo pienses. 😊