La utilidad de cortafuegos nftables tiene como intención sustituir a iptables

El porqué de nftables

Durante mucho tiempo han existido cuatro herramientas para administrar el cortafuegos, que tuvieron un inicio similar, pero que con el tiempo se han ido distanciando en su desarrollo, por diversos motivos, estas han sido iptables, ip6tables, ebtables y arptables

Esto hizo que se comenzase a trabajar en un sucesor de estos. Finalmente en 2009, de la mano del proyecto netfilter, se anunció el lanzamiento de nftables El nombre de la herramienta tiene que ver con “netfilter tables“, esto es, en el idioma de Bolivar y Márquez, de “tablas de filtro de red” Entre los objetivos del proyecto se busca un mayor rendimiento en el uso de los datos, mayor escalibilidad y una estructura modular, más fácil de mantener.

Desde la versión de kernel de Linux 3.13, lanzada en enero de 2014, nftables se encuentra integrado en este.

Ya se encuentra disponible en la flamante nueva versión de Debian, que como sabéis es la número 10, con el codename “Buster”, ergo, en sus derivadas como Ubuntu o Linux Mint, también. La compañía del sombre rojo Red Hat, está siguiendo la misma senda. De hecho en las últimas versiones de la mayoría de distribuciones, por lo menos está disponible, aunque quizás no habilitado.

¿Cómo funciona nftables?

Con nftables podemos hacer lo mismo que las cuatro herramientas clásicas (iptables, ip6tables, ebtables y artables), para ello debemos utilizar la herramienta nft, que nos permite establecer todas las reglas, ya sea aceptar, reenviar, modificar o rechazar, paquetes de red en el sistema.

A diferencia de iptables, que trabaja con reglas como: INPUT, FORWARD o OUTPUT, en nftables no existe nada similar de inicio, de hecho las tendremos que crear nosotros mismos.

Nft utiliza dos pequeñas librerías (libnml y libnftnetlink), de esta manera el código en el kernel ocupado es bastante pequeño. Por lo que sus cambios apenas tienen efecto.

Podemos comprobar que efectivamente el módulo del kernel correspondiente está cargado, utilizando herramientas como lsmod o modinfo, tal y como se muestra en los siguientes imágenes:

Empezando a trabajar

En el caso de Debian 10, aunque el módulo está disponible, debemos instalar la herramienta, de la siguiente manera:

1 sudo apt install nftables sudo apt install nftables

También lo podemos habilitar al arranque:

1 sudo systemctl enable nftables.service sudo systemctl enable nftables.service

De inicio nftables empieza sin ninguna regla añadida, ni tablas ni cadenas. Para poder añadir debemos tener permisos de superusuario y debemos utilizar el comando nft, como sigue:

1 2 3 4 5 sudo nft add table ip filter sudo nft add chain ip filter input { type filter hook input priority 0 \; } sudo nft add rule ip filter input drop sudo nft list ruleset -a sudo nft delete rule ip filter input handle 2 sudo nft add table ip filter sudo nft add chain ip filter input {type filter hook input priority 0\;} sudo nft add rule ip filter input drop sudo nft list ruleset -a sudo nft delete rule ip filter input handle 2

Paso a explicar lo que hemos hecho en las líneas anteriores de código. Primero añadimos una tabla (table) para filtrar por IP y a continuación creamos una cadena (chain) para realizar el filtrado. Y en la tercera, por último en esta parte, añadimos una nueva regla para que descarte todos los paquetes. (drop)

El comando en la línea 4 ofrece una visión general con todas las líeas del firewall. Y en la última línea descartamos la regla de descarte (drop)

Un poco de información sobre nft, con algunos ejemplos

Los creadores y desarrolladores de nft escogieron la BFP (Berkley Packet Filter) para definir la nomenclatura de sus reglas, y además orientan su trabajo en el ya clásico tcpdump, para que todo nos sea más familiar.

Con nft podemos trabajar con varias familias de dirección, como arp (ARP), bridge, inet (para IPv4 y IPv6), ip (para IPv4), ip6 (para IPv6) y netdev. Este último se utiliza para filtrar los paquetes entrantes antes de que lleguen a la capa 3, siguiendo el módelo ISO/OSI

nft traduce las reglas y las mantiene en una pequeña máquina virtual (ntp-tables core) para la comunicación con el kernel de Linux.

A mode de ejemplo, vemos como habilitar el puerto de FTP, que como sabéis es el 21

sudo nft add rule inet filter input tcp \ dport 21 ct state new,established accept sudo nft add rule inet filter input tcp \ dport 21 ct state new,established accept

Además, nft, permite habilitar diferentes puertos en una misma línea, a diferencia de iptables, que necesita varios:

sudo nft add rule inet filter input tcp \ dport { 21 , 22 , 23 } ct state new,established accept sudo nft add rule inet filter input tcp \ dport { 21,22,23 } ct state new,established accept

En el ejemplo anterior habilitamos los puertos para FTP, SSH y telnet, respectivamente.

Al igual que con otras herramientas en GNU/Linux, debemos ser muy estrictos con la forma de añadir las reglas, respetando el formato de estas. Si no tendremos problemas, tanto en Bash como en otras consolas como Zsh

Para encontrar más ejemplos de uso, os recomiendo la página de la Wiki de Arch al respecto, que tiene un buen puñado de ejemplos.

Guardar y restaurar

Al igual que pasa con iptables, que permite guardar la configuración en un fichero, con nft podemos hacer lo mismo. De la siguiente forma:

sudo nft list ruleset > firewall.config sudo nft list ruleset > firewall.config

Y si queremos restaurarla

sudo nft -f firewall.config sudo nft -f firewall.config

Cuando restauramos, para asegurarnos que las reglas a restaurar, no se solapen con las ya existentes, debemos realizar un flush ruleset , justo al principio del fichero de configuración firewall.config , similar a un iptables -F de toda la vida 🙂

Convertir

Si ya tenemos un gran número de reglas predefinidas, utilizando iptables, no hay problema, ya que las podemos convertir, utilizando la herramienta iptables-translate o bien ip6tables-translate , según nuestras necesidades.

Veamos un ejemplo, en este caso habilitamos los puertos de Netbios:

sudo iptables-translate -A INPUT -m state --state NEW -m tcp -p tcp --dport 135 : 139 -j ACCEPT sudo iptables-translate -A INPUT -m state --state NEW -m udp -p udp --dport 135 : 139 -j ACCEPT sudo iptables-translate -A INPUT -m state --state NEW -m tcp -p tcp --dport 135:139 -j ACCEPT sudo iptables-translate -A INPUT -m state --state NEW -m udp -p udp --dport 135:139 -j ACCEPT

Veamos el resultado:



Conclusiones

Nada dura para siempre y toda cambia, por lo que nos hemos de ir acostumbrando a las nuevas herramientas que van apareciendo, por muy doloroso que nos sea.

Nftables, nos ayuda a simplificar las tareas que realizábamos con varias herramientas en una sola, simplificando así nuestro trabajo.

Todo tiene un proceso, así que al final la idea es ir practicando, en entornos de pruebas y/o virtuales, hasta que la tengamos por la mano

Y eso es todo, espero que os haya parecido interesante y os sea de utilidad en algún momento.

Fuentes consultadas

Documentación de nftables en la Wiki de Debian

Página wiki de nftables