Índice

El siguiente artículo forma parte de un trabajo en grupo realizado para la asignatura Seguridad en Sistemas Operativos de la facultad de Ingeniería Informática de Granada (ETSIIT), puedes leer el otro trabajo publicado en el blog, Biometría Aplicada a La Seguridad. Este trabajo es autoría de Jose Maria Caballero Alba y Edlin Lastenia Morel Mateo

Qué es nftables

nftables es un nuevo framework que sustituye al antiguo iptables. Este nuevo software aún no está desarrollado al 100% de sus funciones, tenemos la problemática de la implantación, que aunque se incluye desde el kernel 3.13, las personas aún no están acostumbradas a su uso y por tanto siguen usando iptables o en su defecto la nomenclatura de sus reglas.

Quizá te interese el artículo 20 ejemplos de iptables para SysAdmins novatos, u otro de los múltiples artículos sobre iptables disponibles.



En pocas palabras:

Las diferencias con iptables son notables, estas son algunas diferencias proporcionadas por su página oficial:

Máquina de pseudo-estados en el espacio del kernel, nftables interpreta el mapa de reglas proporcionadas por el usuario (con la nueva sintaxis) , esta se compila y entra en la máquina de estados como bytecode y esta misma la transfiere al kernel por la api Netlink’s de netflter.

Reduce el total del código en el espacio del kernel. Se puede elegir que selectores de paquetes de todos los protocolos existentes puede usar la máquina de pseudo-estados, esto significa que no necesitamos una extensión en espacio de kernel para cada protocolo si queremos soportarlo. Esto supone una ventaja, ya que no necesitamos actualizar el kernel para obtener nuevas características y esto ha sido diseñado para trabajar en el espacio lógico de usuario.

Interfaz unificada para reemplazar las utilidades iptables/ip6tables/arptables/ebtables.

Introducción a nftables

Como ya dijimos en la descripción del problema, nftables es un nuevo framework que sustituye al antiguo iptables para el filtrado de paquetes y clasificación de estos en Linux. nftables es una combinación del núcleo de Linux y una utilidad de espacio de usuario (lo que sería la antigua iptables, nft). Usa la infraestructura de Netfilter, como el connection tracking system.

Requisitos de nftables

nftables está operativo desde el kernel 3.13, para poder usarlo necesitamos compilar este kernel o un kernel superior. Además de la utilidad nft para poder usar el framework la cual necesita las librerías libmnl (normalmente en los repositorios) y libnftnl.

Necesitamos instalar un kernel superior al 3.13, en este caso vamos a usar el ultimo kernel estables de kernel.org, siendo este a la fecha actual el 3.16.5.

Por lo tanto, para la instalación debemos de hacer lo siguiente:

tar -xvJf linux-3.16.tar.xz
cd linux-3.16
make menuconfig
sudo make modules_install
sudo update−grub2

Una vez hecho esto, reiniciamos y ya tendríamos el kernel disponible en la selección de inicio de grub, para comprobar que esta todo correcto, basta con abrir un terminal y poner iuname -r debería de salir que tenemos un kernel 3.16.3

Instalación de la utilidad nft

Para esto instalaremos las 2 librerías necesarias (libmnl y libnfnl), para ambas necesitamos hacer:

git clone git://git.netflter.org/lib[mnl o fnl]
cd libnftnl
sh autogen.sh
./confgure
make
sudo make install

Ahora ya podemos instalar la utilidad nft:

git clone git://git.netflter.org/__nftables__
cd __nftables__
sh autogen.sh
./configure
make
make install

Y para comprobar su correcto funcionamiento tecleamos:

sudo nft

Al cual debe responder nft: no command specified. Confirmando su correcta instalación.

iptables vs nftables

Es interesante comparar el uso de iptables de manera práctica y compararlo con lo que sería la traducción a nftables, tenemos que tener en cuenta que algunas opciones de iptables no están disponibles en nftables por estar aún en desarrollo y viceversa.

Diferencias principales entre nftables y iptables

Tablas cadenas y reglas en nftables

Creando tablas con nftables

En nftables seguimos contando con las mismas tablas que en iptables, que siguen siendo las zonas en las que podemos crear cadenas y después crear reglas en ellas. La diferencia principal y más notable respecto a iptables que podemos crear nuestras tablas y además no nos obliga a configurar una cadena a la hora de crearla. Para configurar una tabla en nftables tenemos el siguiente formato:

nft create table [ip] nombre tabla

Como vemos tenemos un formato más sencillo que además podemos crear la tabla solamente sin configurar nada y decidir si pertenece (o no) a la familia ip. Un ejemplo muy sencillo de crear una tabla:

nft create table filter

Esto creará la tabla de tipo ip (por defecto, si no lo hemos especificado) filter, la cual no contiene cadenas ni reglas. Solo contiene la definición de la tabla en sí misma.

Borrando tablas en nftables

En nftables sí que se nos permite borrar una tabla, con esto borraríamos la tabla, sus cadenas y sus reglas. El formato a usar seria el siguiente:

nft delete table nombretabla

Y no es necesario nada más, con esto podemos borrar una tabla en nftables, cosa que con iptables no podíamos.

Creando cadenas en nftables

En nftables no tenemos cadenas por defecto dentro de nuestras tablas, pero tenemos la posibilidad de an˜adir las cadena de tipo base (input, output, forward, postrouting, prerouting) o crear cadenas personalizadas, con el siguiente formato seria para las tipo base:

nft add chain ip nombreTabla nombreCadena typefilter hook [cadenabase] priority 0

Y un ejemplo:

nft add chain ip filter postrouting   type filter hook postrouting  priority  0

Esto no crearía la cadena de tipo base postrouting dentro de la tabla filter, si queremos tener cadenas personalizadas, simplemente hacemos:

nft add chain nombre tabla  nombre cadena

Ejemplo:

nft add chain filter input

Borrando tablas en nftables

En nftables por el contrario podemos borrar tanto cadenas base como no base, solo necesitamos el nombre de la cadena, no nos importa si es de un tipo u otro, tenemos el siguiente formato:

nft delete chain nombreTabla nombreCadena

Ejemplo:

nft delete chain flter output

El único requisito que nos impone nftables para poder borrar una cadena es que no esté vacía.

Creando reglas en nftables

En nftables podemos ver a la hora de an˜adir reglas que es mucho más comprensible para el usuario. El formato para añadir una regla es:

nft add rule nombreTabla nombreCadena tcp upd ip daddr saddr dport sport drop accept reject counter

Los parámetros están simplificados, solo están algunos de los más usuales, se ver todas las opciones posibles en man nft Si quisiéramos usar el ejemplo anterior de iptables, bastaría con esto:

nft add rule flter input  tcp dport  22 drop.

Podemos apreciar que nftables ofrece una interfaz más clara en la creación de reglas respecto de iptables.

Borrando reglas en nftables

Para eliminar una regla en nftables lo podemos hacer de manera similar a como lo hacemos en iptables, listando las reglas de una tabla especifica (en nuestro caso filter) con el parámetro -a para que nos muestre el número de las reglas dentro de la tabla.

nft list [table — tables] [nombreTabla − a]
# Ejemplo
nft list table filter -a

De esta manera, identificamos la regla que queremos eliminar mediante su handle, para ejecutar a continuación la orden de eliminación con el siguiente formato:

nft delete rule nombreTabla nombreCadena handle númerodeRegla
# Ejemplo
nft delete rule flter input  handle 2.

Acciones sobre los paquetes

Aceptando y rechazando paquetes en nftables

Suponiendo que ya tengamos (como lo visto en los ejemplos anteriores) una cadena y una tabla, para aceptar los paquetes de una cadena especifica podemos hacer:

nft add rule nombreTabla nombreCadena [operadores] accept

Y un ejemplo especifico, por ejemplo aceptar el uso de ftp (hacia nuestro host):

nft add rule filter input  tcp dport  21 accept

Para rechazar paquetes haríamos exactamente lo mismo pero cambiando accept por drop:

nft add rule nombreTabla nombreCadena [operadores] drop

Saltando a cadenas

De manera similar a iptables, también podemos tener cadenas personalizadas, una vez tengamos creado alguna, podemos redirigir los paquetes que venga por una cadena base (por ej input) a esta cadena para tratarlos ahí… El formato a seguir es el siguiente:

nft add rule nombreTabla nombreCadena[operadores] jump cadenaPersonalizada
# Ejemplo
nft add rule filter input  tcp dport  9999 jump pruebaCadenaPersonal

Log de paquetes en nftales

Para poder hacer un log de paquetes completo en nftables, necesitamos una versión mayor o igual a la 3.17, si se usa un kernel menor, se puede usar el siguiente comando para permitir el log:

modprobe iptLOG

Para usar el log de paquetes hacemos:

nft add rule nombreTabla nombreCadena [operadores] log

Y el mismo ejemplo que usamos en iptables para el login de conexiones ssh.

nft add rule filter input  tcp dport  22 ct state  new log prefix "Nueva conexión ssh" accept

NAT en nftables

Como en iptables, nftables también puede hacer nat y de manera más simple por su sintaxis, de nuevo, distinguimos entre SNAT (source nat) y DNAT (destination nat).

SNAT en nftables

echo 1  /proc/sys/net/ipv4/ipForward

Hecho esto, debemos hacer:

nft add table nat
nft add chain nat  prerouting   type nat  hook prerouting  priority  0
nft add chain nat  postrouting   type nat  hook postrouting  priority  0

Con esto hemos creado la tabla nat con las cadenas base prerouting y postrouting (creamos las 2 para el ejemplo de snat y dnat, aunque no es necesario si solo se implementa uno de los casos).

Un ejemplo:

nft add rule nat  postrouting  ip saddr 192.168.1.0/24 oif wlan0 snat  8.8.8.8

De esta manera, si nuestro host es un router que está conectado a la red indicada los host que tengan configurada como gateway nuestro host, cambiará 8.8.8.8 de los paquetes que salgan de nuestra red.

DNAT en nftables

Para hacer dnat, si tenemos algún servidor web en nuestra red y queremos que sea accesible desde el exterior si se está usando nat, debemos de seguir el mismo formato que en el anterior caso, y bastaría con lo siguiente:

nft add rule nat  prerouting  iif wlan0 tcp dport  80 dnat  192.168.1.3

De esta manera, se podrá acceder al servidor web desde el exterior de nuestra red. Cabe decir que nftables nos permite hacer tambien un set de puertos para un mismo destino.

Ejemplos de nftables

Para terminar podemos exponer un uso práctico de nftables en una red, el problema es:

Tenemos una empresa, en la cual tenemos 3 subredes: 192.168.1.0/24, 192.168.2.0/24 y 192.168.3.0/24.

Para la red 192.168.1.0/24 tenemos los requisitos siguientes:

Para red 192.168.2.0/24 tenemos los siguientes requisitos:

Para la red 192.168.3.0/24 tenemos los siguientes requisitos:

Para la red 192.168.1.0/24:

nft add rule nat prerouting  ip daddr 192.168.1.2 tcp dport 80 dnat 192.168.1.2
nft add rule nat prerouting  ip daddr 192.168.1.3 tcp dport 21 dnat 192.168.1.3

Para la red 192.168.2.0/24:

nft  add  rule  filter  input  ip saddr  192.168.2.0/24  ct  state  new,  established accept
nft add rule filter input  ip daddr  192.168.2.0/24 ct state  new drop
# (Suponiendo  facebook.es - 8.8.8.8 y twitter.es - 8.8.8.4)
nft add rule filter input  ip saddr 192.168.2.0/24 ip daddr  8.8.8.8, 8.8.8.4 drop

Para la red 192.168.3.0/24:

nft add rule filter input  ip saddr 192.168.3.0/24 drop
nft add rule filter input  ip daddr  192.168.3.0/24 drop

Conclusiones

nftables es un framework que su finalidad es eliminar o solventar problemas de iptables remplazándolo, presenta una mejora en la sintaxis, las tablas y las cadenas son completamente configurables dando una flexibilidad al usuario para que defina sola las reglas que se vayan a utilizar. Ipv4 y Ipv6 se pueden utilizar en una sola tabla simplificando la administración.

Se pueden especificar diferentes acciones en una sola regla lo cual nos permite el ahorro de tiempo y creación de reglas engorrosas como se solía hacer con iptables, además soportara nuevos protocolos sin la necesidad de hacer una actualización del kernel.

Como podemos analizar nftables nos proporciona numerosas ventajas y soluciones de problemas en la clasificación de paquetes sin embargo hay que tener en mente que aún esta en desarrollo. </caballeroalba>