nftables vs iptables: algunas notas
Hoy veremos algunas diferencias entre iptables y nftables, el nuevo estándar de firewall en Linux, y jugaremos un poco con algunos comandos 🙂
Estoy preparando un nuevo curso sobre firewalling en Linux, esta vez utilizando nftables y su herramienta de línea de comandos: nft
.
Esto para actualizar contenido existente en el curso de iptables, y para que, tanto mis alumnos como los seguidores de JuncoTIC, puedan aprender las nuevas herramientas sobre firewalling que en un futuro cercano creo que serán las predeterminadas en casi todas las distros!
Veamos de qué se trata nftables!
iptables, la vieja escuela
iptables
es una herramienta de usuario, un comando, que nos permite configurar el conjunto de reglas de filtrado de tráfico de red del kernel.
A nivel del núcleo, iptables
utiliza diferentes módulos de Netfilter para analizar distintos protocolos: iptables
para IPv4, ip6tables
para IPv6, arptables
para ARP, o ebtables
para gestionar puentes Ethernet.
Cabe una aclaración, iptables es la herramienta de usuario para configurar las reglas de filtrado y NAT, y mantener registros de log de tráfico, pero no es el firewall completo. En general nos referimos al firewall de Linux como iptables
, pero en realidad toda la infraestructura que asociamos con filtrado, nat, log, mangle, etc, es provista por el proyecto Netfilter.
Netfilter es un proyecto de código abierto, y una comunidad de desarrolladores que proveen el framework de filtrado de tráfico del kernel Linux. Este framework permite interactuar con los paquetes y nos brinda funcionalidades de cortafuegos/firewall, log, NAT, etc.
Así es que iptables
es solamente el nombre de la utilidad del espacio de usuario que le permite al administrador configurar las reglas del framework Netfilter.
Además, iptables
sustituyó, hace años ya, a la anterior utilidad de gestión de filtrado de tráfico en Linux: ipchains
, cuando el kernel paso a la versión 2.4.
nftables, lo nuevo
Ahora bien, nunca dije que iptables
haya dejado de usarse. Se sigue utilizando en la mayoría de las distros GNU/Linux, y tiene por delante varios años todavía.
No obstante, un nuevo proyecto ha llegado para convertirse en el nuevo estándar de filtrado de tráfico en Linux: nftables.
nftables reutiliza mucho de la infraestructura de netfilter existente, como los módulos de tracking de conexiones (conntrack), el sistema de registro de tráfico (nf_log), etc. nftables, con su utilidad de línea de comandos, nft
, reemplaza a iptables como componente del framework netfilter.
nftables posee algunas características innovadoras y mejoras respecto de la herramienta anterior, iptables
, para la configuración y mantenimiento de un firewall en Linux.
Su sintaxis cambia bastante respecto de iptables
, por lo que si estamos acostumbrados al viejo framework, puede costarnos un poco adaptarnos :S
Pero las ventajas son interesantes: rendimiento, facilidad de administración, algo de seguridad tal vez, etc. Más abajo comento algunas diferencias entre nft
e iptables
, y por qué es importante que vayamos dándole un ojo, si es que todavía utilizamos iptables
, como yo 😛
¿Por qué nftables/nft
?
nft
es el candidato a reemplazar, dentro de algún tiempo, a iptables
, como herramienta de firewalling predeterminada en Linux.
De hecho, Debian, una de las distros GNU/Linux más utilizadas e influyentes en la comunidad del software libre y de código abierto, anunció en el 2017 que incluiría a nftables en el sistema operativo, y recomendaba a los usuarios migrar sus configuraciones de firewall.
A partir del 2019 Debian anunció que nftables sería la herramienta predeterminada a partir de Debian 11 «Bullseye».
Otras distros, como Devuan, ya traen de manera predeterminada a nft
como herramienta de configuración de firewall. Si deseamos utilizar iptables
(legacy o nf_tables, como comento más abajo) debemos instalarlo manualmente.
Así es que, una de las principales razones para aprender nftables es que dentro de un tiempo va a ser el estándar de firewalling en el núcleo Linux, y no queremos que nos tome por sorpresa!
Ventajas de nftables sobre iptables
nftables añade una máquina virtual al kernel Linux para que pueda interpretar bytecode para inspeccionar los paquetes de red y tomar decisiones según las reglas configuradas.
De esta forma las operaciones de filtrado y análisis de la máquina virtual son sencillas, contrario a lo que ocurre con iptables
, donde el código se adapta taaaanto a la lógica de cada protocolo para poder llevar a cabo los análisis, que dicho código se ha replicado para IPv4, IPv6, ARP y Ethernet, incrementando la complejidad de la lógica interna del firewall.
nftables reduce el código duplicado, mejora el reporte de errores, y logra un mejor rendimiento en el procesamiento del tráfico.
Además, al utilizar una máquina virtual podría decirse que hasta mejora un poco la seguridad en el manejo del firewall.
Estos cambios hacen que las herramientas de gestión de firewall de netfilter como iptables
, ip6tables
, arptables
y ebtables
(IPv4, IPv6, ARP y puentes Ethernet) sean reemplazadas por nft
, una única herramienta que permite configurar todos los aspectos de netfilter (hasta me recuerda al comando ip reemplazando varias utilidades de net-tools 😛 ).
Además de esto, nftables mejora el API de espacio de usuario, y mejora la eficiencia en la configuración de firewalls con conjuntos de reglas (rulesets) muy grandes.
Y por si fuera poco, también incluye algunas herramientas para migrar reglas de iptables a nftables, y herramientas para que el usuario pueda escribir reglas de iptables
, pero que por debajo, en el backend, en el núcleo, se utilice nftables con sus ventajas de rendimiento.
Algunas desventajas de nftables
Algunas desventajas de nftables podrían ser su madurez. Se trata de una herramienta bastante nueva en relación con iptables
, que ya lleva décadas funcionando en Linux.
La gran difusión de iptables
provocó una gran cantidad de front-ends que hacen uso de iptables
como back-end para configurar el firewall en Linux. nftables es más moderno y todavía muchos de estos front-end no lo soportan, y es necesario configurarlo por línea de comandos.
He leído por ahí el tema de documentación, iptables
tiene muchísima documentación en Internet, no así nft
, pero eso supongo que irá creciendo en la medida que nftables se haga más popular entre los administradores de redes y servidores.
Otro detalle que noté en nft
, es que los errores que genera el comando nft
cuando hay fallos no son del todo explicativos, y se requiere algo de investigación en Internet para determinar fallos y solucionarlos.
Cuando usamos iptables
, ¿realmente usamos iptables
?
En muchas distros la herramienta de usuario iptables
y el back-end nftables están bastante relacionados. Esto ha generado algo de confusión en la comunidad Linux.
Antes que surgiera nftables, usábamos iptables
para todas las configuraciones de firewalls en Linux, ya sea directamente, o con front-ends. Luego surgió nftables intentando mejorar iptables en varios aspectos, como comenté antes.
Ahora bien, con nftables uno de los mayores cambios fue la actualización de la API del kernel, que le permite a aplicaciones de usuario, como el comando nft
o el comando iptables
, programar reglas de firewall en el núcleo.
El comando iptables
en Linux hoy posee dos variantes:
- legacy
- nf_tables
La variante «legacy» es el iptables original, mientras que la variante «nf_tables» es un puente con la nueva API de nftables, beneficiándose de algunas de sus ventajas.
Más abajo analizamos la arquitectura de Netfilter, y ahí entenderemos esto de la API de nftables.
¿Qué variante de iptables utiliza nuestro sistema?
Eso podemos verlo con el comando «iptables -V
«:

En la terminal superior vemos que se trata de un iptables «legacy«, es decir, utiliza la API de iptables, mientras que en la inferior tenemos un iptables «nf_tables«, haciendo uso de la API de nftables.
Si tenemos instalado nftables además de iptables en nuestra distro, el comando iptables-nft
estará disponible, y nos permitirá utilizar la sintaxis de iptables
haciendo uso del API nf_tables:

De esta forma, podemos aprovechar las ventajas de la nueva API de nftables manteniendo la sintaxis del iptables original utilizando el comando iptables-nft
.
Igual, les recomiendo familiarizarse con la utilidad nft
, puesto que la perspectiva es que reemplace completamente a iptables en Linux… y demás, es más sencilla 😛
Un poco de arquitectura para entenderlo mejor
Bajando un poco a la arquitectura del kernel Linux, existen dos lógicas de selección de paquetes, o «packet matching«, una que hace uso de xtables, la manera tradicional con la que iptables filtra paquetes, y otra, nftables, que es la nueva lógica que utiliza nftables de manera nativa mediante la utilidad nft
.
Veamos el siguiente diagrama (fuente: RedHat Dev):

Aquí se puede ver que si usamos iptables
original (legacy) realizaremos llamadas al núcleo utilizando el API original de iptables, y este API utiliza el código de matching de paquetes de xtables.
Si, en su lugar, usamos el comando iptables-nft
(nf_tables) o el comando iptables
si es que está basado en nf_tables, mantendremos la sintaxis de iptables
, aprovechando las ventajas del API de nftables a nivel de kernel, pero para clasificar tráfico haremos uso del código original de iptables
, xtables.
Finalmente, si usamos el comando nft
, la utilidad de espacio de usuario de nftables, también utilizaremos el API del kernel de nftables, al igual que iptables-nft
, pero aquí el matching de paquetes se llevará a cabo con el nuevo código de nftables.
Así es que, si bien iptables-nft
nos permite mantener la sintaxis y aprovechar las ventajas del API de nftables, para aprovechar todas las nuevas funcionalidades de este firewall deberíamos hacer uso de la utilidad nft
, la herramienta de espacio de usuario de nftables.
Un ejemplo concreto con comandos 🙂
Veamos algunos ejemplos para entender estas diferencias.
Particularmente voy a trabajar sobre un sistema Devuan GNU/Linux, que de manera predeterminada no trae instalado iptables
, solamente nft
.
Para las prácticas instalé el paquete «iptables» desde los repositorios, y me encontré con lo siguiente:

Como se ve, el comando iptables
hace referencia a la versión nf_tables, igual que el comando iptables-nft
. Para acceder a la versión legacy de iptables
debo utilizar el comando iptables-legacy
.
Esto puede cambiar según la distro GNU/Linux que estemos utilizando. Lo importante es diferenciar qué comando iptables
se refiere a la versión legacy, y qué comando a la versión nf_tables.
Para evitar confusiones y para que los ejemplos se vean más claros, voy a utilizar iptables-legacy
para acceder a la utilidad iptables
tradicional, y voy a utilizar iptables-nft
para acceder a la versión basada en nf_tables.
Una de las consecuencias de que nft
e iptables-nft
compartan el API nf_tables es que las reglas cargadas con una de las utilidades pueden ser administradas con la otra, es decir, al cargar una regla con una de las utilidades se realiza la traducción automática a la sintaxis de la otra.
Veamos un ejemplo para aclarar las ideas. No voy a ahondar en la sintaxis de iptables
ni nft
, eso lo dejaremos para otra oportunidad 😛
Supongamos que cargamos una regla utilizando la utilidad iptables-nft
, que hace uso del API de nftables:
sudo iptables-nft -A FORWARD -s 192.168.10.0/24 -j ACCEPT
Si listamos las reglas del firewall veremos lo siguiente:
$ sudo iptables-nft -nL
# Warning: iptables-legacy tables present, use iptables-legacy to see them
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT 0 -- 192.168.10.0/24 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
Lo normal, cargamos una regla y podemos listarla, hasta ahí todo bien.
Ahora, como hemos utilizado iptables
basada en nftables, veamos qué pasa si listamos las reglas de nftables mediante la utilidad nft
:
$ sudo nft list ruleset
table ip filter {
chain FORWARD {
type filter hook forward priority filter; policy accept;
ip saddr 192.168.10.0/24 counter packets 0 bytes 0 accept
}
}
Como se ve, al cargar una regla con iptables
(basado en nf_tables), la regla también se verá con la utilidad nft
. Lo mismo ocurre al revés, si cargamos una regla con nft
, la veremos en la salida de iptables-nft
:
$ sudo nft add rule ip filter FORWARD ip daddr 192.168.100.0/24 tcp dport 8080 drop
Esto añade una regla para descartar todo el tráfico cuya IP destino sea 192.168.100.0/24, y cuyo puerto destino sea 8080.
Listemos las reglas con nft
:
$ sudo nft list ruleset
table ip filter {
chain FORWARD {
type filter hook forward priority filter; policy accept;
ip saddr 192.168.10.0/24 counter packets 0 bytes 0 accept
ip daddr 192.168.100.0/24 tcp dport 8080 drop
}
}
Y ahora con iptables
(nf_tables):
$ sudo iptables-nft -nL
# Warning: iptables-legacy tables present, use iptables-legacy to see them
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT 0 -- 192.168.10.0/24 0.0.0.0/0
DROP 6 -- 0.0.0.0/0 192.168.100.0/24 tcp dpt:8080
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Como puede verse ambas herramientas, al compartir el API de nf_tables, permiten trabajar con las mismas reglas en diferente sintaxis.
Supongamos ahora que cargamos una regla con la utilidad iptables
original (iptables-legacy
).
$ sudo iptables-legacy -A FORWARD -s 192.168.200.0/24 -j ACCEPT
Veamos el resultado:
$ sudo iptables-legacy -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT 0 -- 192.168.200.0/24 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Ahora, qué ocurre si visualizamos la lista de reglas de iptables-nft
y de nft
?
Lo probaron?
Habrán visto que no, no se ve esta regla, y esto es debido a que iptables-legacy
hace uso de un API diferente a la utilizada tanto por nft
como por iptables-nft
, por lo que la gestión de reglas se realiza de manera aislada.
Resumen y conclusiones
Lo importante que debemos aprender de todo esto es que tenemos dos APIs en el kernel Linux para poder configurar reglas de filtrado de tráfico:
- La API original de iptables.
- La nueva API de nftables.
El comando iptables
(legacy) hace uso de la API original para cargar reglas de firewall, mientras que el comando nft
utiliza la nueva API de nftables para hacer lo propio.
Luego, tenemos el comando iptables-nft
, que hace uso de la nueva API de nftables, pero mantiene la compatibilidad de las reglas con el iptables
original.
Si bien iptables
(legacy) seguirá un tiempo disponible, ya existen distros que no lo traen instalado de manera predeterminada. La tendencia a futuro indica que nft
pasará a ser la herramienta predeterminada para gestionar reglas de filtrado en Linux.
Por otro lado, iptables-nft
permite aprovechar algunas ventajas de nftables manteniendo la sintaxis de iptables
(legacy), pero para aprovechar todas las ventajas de nftables, como la simplicidad de la sintaxis, la solución a algunas race-conditions en la configuración del firewall, y las implicancias en seguridad y rendimiento que tiene la incorporación de una máquina virtual en el núcleo para correr el firewall, será necesario aprender a utilizar nft
.
Con esto además quiero aclarar una duda bastante recurrente en este mundo de nftables, y es que iptables-nft
NO ES una versión de nftables con la sintaxis original de iptables
, sino que se trata de dos herramientas diferentes que comparten parte de la infraestructura de netfilter en Linux.
Y de aquí se decanta un consejo: si configuramos un firewall en Linux con alguna de estas herramientas (iptables-legacy
, iptables-nft
o nft
) deberíamos continuar utilizando la misma herramienta.
Si optamos por migrar, por ejemplo, desde iptables-legacy
a nft
, deberíamos utilizar solamente nft
de aquí en adelante.
Lo que NO debemos hacer es tener reglas configuradas en varias herramientas. Ni siquiera herramientas que compartan el match de paquetes. Por ejemplo, si usamos iptables-legacy
no deberíamos usar iptables-nft
en simultáneo, usamos una o la otra, pero no las dos a la vez.
En fin, hay muchas cosas nuevas que aprender para gestionar un firewall con nftables, de a poco iré publicando nuevos artículos y/o videos al respecto, y los mantendré informados en las redes sociales sobre los avances del curso de nftables!
Hasta la próxima!