nftables

nftables

Empezar con nftables

Nftables viene por defecto a partir de Debian11, de lo contrario, podemos instalarlo como siempre con una

apt install nftables

Archivo de configuración de nftables

El archivo de nftables se encuentra en /etc/nftables.conf

Es un archivo con una notación parecida a JSON

Para activar el servicio ejecutaremos

systemctl enable nftables

Para iniciarlo, ejecutaremos

systemctl start nftables

O bien

service nftables start

En cuanto a las posibilidades de nftables con respecto a iptables, nftables es mucho más potente y permite una configuración más flexible.

 

Configurar nftables servidores

El archivo de nftables se encuentra en /etc/nftables.conf

Para activar el servicio ejecutaremos

systemctl enable nftables

Para iniciarlo, ejecutaremos

systemctl start nftables

O bien

service nftables start

Ejemplo práctico de configuración de nftables para un servidor

Ejemplo de nftables que permite web y correo desde cualquier IP, y bloquea el ssh a una serie de IP predefinidas.

#!/usr/sbin/nft -f

flush ruleset

# `inet` applies to both IPv4 and IPv6.
table inet filter {
   set management_ips_ipv4 {
  	type ipv4_addr
	flags interval
  	elements = {A.B.C.D/26,
		F.G.H.I/23,
		J.K.L.M/24,
		N.O.P.R}
    }

    chain input {
        type filter hook input priority 0;

        # accept any localhost traffic
        iif lo accept

        # no ping floods:
        ip protocol icmp icmp type echo-request limit rate over 10/second burst 4 packets drop
        ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 10/second burst 4 packets drop

        # accept traffic originated from us
        ct state established,related accept

        # accept ICMP & IGMP
        ip6 nexthdr icmpv6 icmpv6 type { echo-request, destination-unreachable, packet-too-big, time-exceeded, parameter-problem, mld-listener-query, mld-listener-report, mld-listener-reduction, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, ind-neighbor-solicit, ind-neighbor-advert, mld2-listener-report } accept
        ip protocol icmp icmp type { echo-request, destination-unreachable, router-solicitation, router-advertisement, time-exceeded, parameter-problem } accept
        ip protocol igmp accept

        # ssh
        #tcp dport 22 accept
        tcp dport {22} ip saddr @management_ips_ipv4  accept

        # http/https
        tcp dport 80 accept
        tcp dport 443 accept

        # smtp/submission
        tcp dport 25 accept
        tcp dport 587 accept
		tcp dport 465 accept

        # pop3/pop3s
        tcp dport 110 accept
        tcp dport 995 accept

        # imap/imaps
        tcp dport 143 accept
        tcp dport 993 accept

        # count and drop any other traffic
        counter drop
    }

    chain output {
        type filter hook output priority 0;
        policy accept;
    }

    chain forward {
        type filter hook forward priority 0;
        policy drop;
    }
}

En el caso de querer abrir otro puerto pondríamos en cualquiera de las líneas a partir de la 37 para tcp

 tcp dport puerto-a-abrir accept

Para UDP

udp dport puerto-a-abrir accept

En el caso de querer abrir el puerto solo a determinadas IP

 tcp dport {puerto-a-abrir} ip saddr @management_ips_ipv4  accept

Referencia de nftables. https://www.netfilter.org/projects/nftables/manpage.html


Conjuntos o sets en nftables

Los Conjuntos o sets permiten predefinir determinados valores en nftables. Esto nos permite definir grupos a efectos de simplificar estos valores.

Tipos soportados

Las especificaciones de los conjuntos son:

type o typeof, es obligatorio y determina el tipo de datos de los elementos del conjunto.
Los tipos de datos admitidos si se utiliza la palabra clave type son:

ipv4_addr: dirección IPv4
ipv6_addr: dirección IPv6.
ether_addr: dirección Ethernet.
inet_proto: tipo de protocolo Inet.
inet_service: servicio de Internet (el puerto tcp, por ejemplo)
mark: tipo de marca de un paquete previamente marcado.
ifname: nombre de la interfaz de red (eth0, eth1...)

Por ejemplo, un serie de IP (por ejemplo nuestras IP de gestión)

set management_ips_ipv4 {
  	type ipv4_addr
	flags interval
  	elements = {A.B.C.D/26,
		F.G.H.I/23,
		J.K.L.M/24,
		N.O.P.R}
    }

En este caso, vemos una etiqueta denominada management_ips_ipv4 que puede ser referenciada en nuestras reglas con un @management_ips_ipv4

Se pueden crear conjuntos con diferentes parámetros, por ejemplo puertos, Vlan id, etc.

set conjunto2 {
		type vlan id
		elements = { 205, 206, 207, 250 }
	}


nftables bloqueo por país o zona

Para eso necesitamos clonar el repositorio de Geoip que se puede localizar aquí

Luego podemos ver las opciones usando el comando:

./nft_geoip --help

El script necesita dos archivos .csv.

Un csv de datos de país (location.csv), su ruta se puede especificar con la opción --file-location
Un csv de datos geoip (dbip.csv), su ruta se puede especificar con la opción --file-address

location.csv

El script se envía con este archivo. Un .csv modificado que contiene los datos del país necesarios para generar los mapas.

dbip.csv

Este .csv no se envía y es necesario recuperarlo antes de utilizar el script. Existe la opción --download para hacerlo.

Generando los mapas geoip

Para generar las asignaciones en el directorio actual (suponiendo que no tenga el archivo dbip.csv)

 ./nft_geoip.py --file-location location.csv --download

Esto nos descargará los siguientes archivos

 rwxr-xr-x 2 root root 4,0K ene  4 19:38 .
 drwxr-xr-x 5 root root 4,0K ene  4 19:38 ..
 -rw-r--r-- 1 root root  22M ene  4 19:38 dbip.csv
 -rw-r--r-- 1 root root  956 ene  4 19:38 geoip-def-africa.nft
 -rw-r--r-- 1 root root 8,3K ene  4 19:38 geoip-def-all.nft
 -rw-r--r-- 1 root root  902 ene  4 19:38 geoip-def-americas.nft
 -rw-r--r-- 1 root root   15 ene  4 19:38 geoip-def-antarctica.nft
 -rw-r--r-- 1 root root  808 ene  4 19:38 geoip-def-asia.nft
 -rw-r--r-- 1 root root  810 ene  4 19:38 geoip-def-europe.nft
 -rw-r--r-- 1 root root  461 ene  4 19:38 geoip-def-oceania.nft
 -rw-r--r-- 1 root root 8,8M ene  4 19:38 geoip-ipv4.nft
 -rw-r--r-- 1 root root  16M ene  4 19:38 geoip-ipv6.nft

geoip-def-all.nft

Contiene todas las definiciones. También contiene un mapa entre las marcas de país y su marca de continente correspondiente.

geoip-def-{continente}.nft
Subconjunto de definiciones para países de un continente determinado. Para ser utilizado como marcas.

geoip-ipv4.nft
Que contiene el mapa entre rangos ipv4 y sus datos geoip. @geoip4

geoip-ipv6.nft
Que contiene el mapa entre rangos ipv6 y sus datos geoip. @geoip6

Ejemplo permitir sólo IP de España por https

table inet filter {
 
        include "/etc/nftables/geoip-def-all.nft"
        include "/etc/nftables/geoip-ipv4.nft"
        include "/etc/nftables/geoip-ipv6.nft"
 
        chain output {
                type filter hook output priority filter; policy accept;
        }
 
        chain input {
                type filter hook input priority filter; policy accept;
                meta mark set ip saddr map @geoip4
                meta mark set ip6 saddr map @geoip6
                meta mark $ES tcp dport 443 accept
                tcp dport 443 drop
        }
}