Apunts NFTables

Índex

1 Introducció

1.1 Motivació

Fins al curs 2018-19 al INS Lacetània he estat impartint tallafocs utilitzant sempre iptables. L'objectiu era veure un tallafocs omnipresent a GNU/Linux i que funcionés a un nivell prou baix com per què qualsevol altre tallafocs amb entorn gràfic fou automàticament assimilable amb els conceptes vistos. Tanmateix amb la sortida de Debian 10 Buster estable s'incorpora NFTables al kernel "reemplaçant" parcialment a netfilter (mòduls a nivell de kernel que utilitza iptables) i que de fet ja està incorporat al kernel 3.13 que va sortir al 2014. Això fa que, tot i poder instal·lar la paqueteria i continuar treballant amb iptables, la tendència de la comunitat sigui adoptar NFtables a nivell de kernel i el programa nft a nivell d'espai d'usuari per gestionar les comunicacions del sistema. Tot això junt amb el fet de tenir per primer cop a alumnes que he tingut a SMX a ASIX amb la mateixa assignatura de seguretat fa que em plantegi adoptar aquest nou programari, o si més no donar-hi un cop d'ull.

1.2 NFTables

NFTables és un framework integrat al kernel de GNU/Linux i que disposa de mòduls tant dins el kernel, de l'espai d'usuari i llibreries per actuar com a tallafocs. Reemplaça alguns mòduls de l'antic netfilter i reutilitza la major part d'ells, per tant el podem entendre com una reimplantació o evolució d'aquest. De fet tot i que la nomenclatura canvia és evident que continua sent NetFilter Tables. NFTables implementa la comanda nft que aglutina el que anteriorment es podia fer amb iptables, ip6tables, arptables i etables a més de permetre treballar de formes força més flexibles, com per exemple combinant vàries regles, accions o protocols en una sola regla (p. ex.: Ja no caldrà repetir regles per protocol tcp i un altre per udp). Les major diferències, extretes de la wiki de Debian son:

What are the major differences?

  • In iptables there are several tables (filter, nat) and chains (FORWARD, INPUT…) by default. In nftables, there are no default tables/chains.
  • Also, in iptables you only have one target per rule (-j ACCEPT, -j LOG …). In nftables, you can perform several actions in one single rule.
  • nftables includes built-in data sets capabilities. In iptables this is not possible, and there is a separated tool: ?ipset.
  • In the iptables framework there are tools per family: iptables, ip6tables, arptables, ebtables. Now, nftables allows you to manage all families in one single CLI tool.
  • This new framework features a new linux kernel subsystem, known as nftables. The new engine mechanism is inspired by BPF-like systems, with a set of basic expressions, which can be combined to build complex filtering rules.

Per poder treballar correctament amb NFtables i entendre el concepte de hook que apareixerà més endavant, cal conneixer el recorregut que fa un paquet en un sistema GNU/Linux i els punts d'inspecció on podrem actuar sobre els paquets. puntsInspeccioXarxa.jpg

2 Instal·lació

Irònicament, tot i que ja s'aplica el nou framework a Debian 10 Buster, no ve instal·lat per defecte sinó que han optat per associar la comanda iptables i la resta a una nova iptables-nft que permet mantenir la sintaxi de iptables però utilitzant el nou framework de NFTables del kernel. Així doncs, per utilitzar la nova comanda nft que aglutina totes les eines desprecated caldrà instal·lar-ho manualment. Esperem que en properes versions ja treguin la "muleta".

apt install nftables
systemctl enable nftables.service

D'aquesta manera instal·lem el paquet i fem que s'activa automàticament durant la seqüència de boot. Les regles, per defecte, del tallafocs les localitzarem a /etc/nftables.conf. Altres comandes interessants al començar poden ser:

  • nft flush ruleset: Elimina totes les regles actives al tallafocs.
  • systemctl mask nftables.service: Desactiva l'inici automàtic de nftables durant el boot.
  • apt purge nftables: Elimina totalment nftables del sistema, per si el volem treure.
  • nft list tables: Llista les taules existents.
  • nft list table <familia> <taula>: Veure totes les regles creades d'una mateixa familia (gairebé sempre farem servir ip que és per IPv4) i una taula concreta.
  • nft list ruleset: Veure tota la configuració del tallafocs actiu.

3 Creació de tallafocs

3.1 Amb comandes

Crear el tallafocs utilitzant la comanda nft i creant l'estructura i regles una a una. És útil però presenta algunes deficiències com la impossibilitat d'afegir comentaris, no poder fer un tallafocs de forma modular i sobretot incomoditat per ordenar les regles, eliminar-les o modificar-les.

Per tant es recomana utilitzar un script per crear el tallafocs.

3.2 Directe al arxiu de configuració

Tot i que una opció per construïr el nostre tallafocs és editar directament el arxiu /etc/nftables.conf i recarregar el dimoni, és molt poc recomanable ja que qualsevol error en aquest arxiu provocarà una fallada en el dimoni i que el tallafocs quedi inservible.

3.3 Amb script

Una de les millores és l'ús natiu de scripts per part de nftwables, amb un intèrpret propi, que permet crear scripts i donar la comoditat d'ordenar les regles de forma senzilla, afegir comentaris, etc. Per indicar L'intèrpret de NFTables al script caldrà afegir com a primera línia: #!/usr/sbin/nft -f. Comentar que el format del script pot ser o bé amb crides al binari nft o utilitzant l'estructura de dades que genera nft (arxiu de configuració o llistat de regles).

3.3.1 Script bàsic

El script ens permetrà afegir comentaris i ordenar les regles, per exemple:

#!/usr/sbin/nft -f

#
# table declaration
#
add table filter

#
# chain declaration
#
add chain filter input { type filter hook input priority 0; policy drop; }

#
# rule declaration
#
add rule filter input ct state established,related counter accept

3.3.2 Incloure arxius

També podrem desglossar el tallafocs en varis arxius script i cridar-los des-de un principal, permetent modularitat, reutilització i afavorint el manteniment.

#!/usr/sbin/nft -f

# include a single file using the default search path
include "ipv4-nat.ruleset"

# include all files ending in *.nft in the default search path
include "*.nft"

# include all files in a given directory using an absolute path
include "/etc/nftables/myruleset.nft"

Així doncs podem crear diferents arxius per temàtiques, per exemple per subxarxes (DMZ, INTERNA, etc) o per temporalitat (EXCEPCIONS).

3.3.3 Variables

Per facilitar la lectura del script, i el seu desenvolupament, podem afegir variables amb la directiva define.

#!/usr/sbin/nft -f

define google_dns = 8.8.8.8
define ntp_servers = { 84.77.40.132, 176.31.53.99, 81.19.96.148, 138.100.62.8 }

add table filter
add chain filter input { type filter hook input priority 0; }
add rule filter input ip saddr $google_dns counter
add rule filter input ip saddr $ntp_servers counter

4 Creació de regles del tallafocs

4.1 Taules

Per defecte nftables no crea cap mena de taula per defecte. Per tant caldrà crear-ne per afegir-hi taules i a dins regles.

Amb l'objectiu de mantenir una similitud amb iptables mostrarem com crear les mateixes cadenes que portava per defecte aquest aplicatiu. Per crear una cadena cal fer:

nft add table ip filter #Per afegit una taula anomenada filter
nft delete table ip filter #Per eliminar la taula filter

Tenim les següents famílies de cadenes:

ip
Per ipv4
ip6
Per ipv6
arp
Per ARP
Bridge
Per ponts.
inet
per cadenes mixtes ipv4/ipv6 (necessita kernel 3.14 o superior).

4.2 Cadenes

Les cadenes s'utilitzen per agrupar les regles que s'han d'aplicar en els diferents punts d'inspecció de la vida d'un paquet. Igual que les taules, no existeix cap de predefinida. En podem diferenciar de dos tipus:

Cadenes Base
Estan enganxades (hook) a un dels ganxos de netfilter (del kernel) i tenen definit també un tipus i una prioritat.
Cadenes Non-Base
No estan enganxades a un hook i per tant no veuen el tràfic per defecte (no estan associades a cap punt d'inspecció del kernel).

Cal afegir que cada cadena pot tenir associada una política per defecte, que serà l'acció a aplicar si el paquet analitzat no coincideix amb cap regla especificada.

Per crear les cadenes disposem de:

  • Tres tipus de cadenes: filter, route i nat.
  • Cinc tipus de hooks: prerouting, input, output, forward, postrouting.

Aquí podeu veure un esquema de les diferetns tipus de cadenes i on poden anar "enganxades"dels diferents punts d'inspecció on poden "enganxar" les cadenes i quins tipus. chains&hooks.png

La sintaxi per crear una cadena és:

  • Per crear una cadena:
nft add chain [<family>] <table-name> <chain-name> { type <type> hook <hook> priority <value> \; policy <drop | accept>\; }
  • Per eliminar una cadena:
nft delete chain inet filter input

Per exemple, per crear una cadena anomenada filter en el punt d'inspecció d'entrada input per a paquets IPv4 amb política per defecte accept faríem:

nft add chain inet ip filter input { type filter hook input priority 0 \; policy accept\; }

4.3 Regles

Les regles estaran contingudes dins d'una taula i una cadena i contindran una part que utilitzarem de filtre del paquet (especificant les característiques del paquet que volem filtrar) i una part d'accions on podrem especificar quines accions caldrà aplicar a aquest paquet.

Per comparativa amb iptables cal remarcar que amb nftables per defecte les regles no tindran comptador, caldrà especificar-ho si ho volem, i a més podrem afegir tantes accions com vulguem a una sola regla.

A l'hora de crear una regla disposem de les següents opcions per filtrar i caracteritzar els paquets:

ip
Protocol IPv4.
  • protocol <protocol>
  • daddr <adreça destí>
  • saddr <adreça origen>
ip6
Protocol IPv6.
  • daddr <adreça destí>
  • saddr <adreça origen>
tcp
Protocol TCP.
  • dport <port destí>
  • sport <port origen>
udp
Protocol UDP.
  • dport <port destí>
  • sport <port origen>
udplite
Protocol UDP-lite.
sctp
Protocol SCTP.
  • dport <port destí>
  • sport <port origen>
ddcp
Protocol DCCP.
ah
Authentication headers.
esp
Encrypted security payload headers.
ipcomp
IPcomp headers.
icmp
Protocol ICMP.
  • type <tipus icmp>
icmpv6
Protocol ICMPv6.
  • type <tipus icmpv6>
ct
Connection tracking.
  • state <new | established | related | invalid>
meta
Meta propietats, com la interfície.
  • oif <INDEX interfície de sortida>
  • iif <INDEX interfície d'entrada>
  • oifname <NOM interficie de sortida>
  • iifname <NOM interficie d'entrada>
ether
Filtratge per MAC
  • saddr <MAC:MAC:MAC:MAC:MAC:MAC>

I pel que fa a l’acció a aplicar al paquet que coincideixi podem jugar amb:

accept
Accepta el paquet
drop
Llença el paquet sense contestar.
reject with <tipus resposta>
Respon amb una resposta concreta, com per exemple icmp type port-unreachable.
queue
FALTA
continue
FALTA
return
FALTA
<cadena> jump
Envia el paquet a un altre cadena.
<cadena> goto
FALTA
masquerade
Fa un SNAT, és a dir, modifica l'origen per passar a ser la interfície de sortida del tallafocs.

Així doncs l'estructura d'una comanda per afegir una regla nova, al final de la cadena, serà:

nftadd rule <familia> <taula> <cadena> [position <handle>] [<propietats> <valors>] <acció>

Per exemple, per acceptar els paquets que vinguin per la interfície enp0s8 des de la IP 192.168.2.100 cap al port 22:

nft add rule inet filter input iifname enp0s8 ip saddr 192.168.2.100 tcp dport 22 accept

Per blocar el ping al 8.8.8.8:

nft add rule inet filter output ip protocol ip icmp daddr 8.8.8.8 drop

4.3.1 Mètodes per afegir regles

Bàsicament disposem de dos mètodes d'inserció:

add
Afegeix la regla en última posició.
insert
si afegim un handle <identificador> on el i

4.3.2 Eliminació de regles

Per eliminar una regla necessitem saber el seu handle, per tant:

nft list table <taula> -a

I després ja la podrem eliminar amb:

nft delete rule <taula> <cadena> handle <num>

5 Persistència

Com hem comentat anteriorment, nftables funciona com a servei i les regles que carrega en cada arrencada estan emmagatzemades a /etc/nftables.conf. Per tant qualsevol canvi que realitzem amb la comanda nft tindrà efecte tan sols fins a reiniciar el dimoni, un cop reiniciar els canvis es perdran.

Per evitar-ho cal passar la configuració que hem anat elaborant cap a l'arxiu esmentat, ho podem fer amb la següent comanda: nft list ruleset > /etc/nftables.conf.

NOTA: No cal dir que és una bona idea fer una còpia d'aquest arxiu abans de modificar-lo per primer cop.

6 TODO Estructures avançades

6.1 Sets

6.2 Mapes

7 TODO Exemples d'ús avançat

7.1 Multi-NAT

7.1.1 DNAT

% nft add rule nat prerouting dnat \
      tcp dport map { 1000 : 1.1.1.1, 2000 : 2.2.2.2, 3000 : 3.3.3.3} \
      : tcp dport map { 1000 : 1234, 2000 : 2345, 3000 : 3456 }

7.1.2 SNAT

% nft add rule nat postrouting snat \
      ip saddr map { 192.168.1.1 : 1.1.1.1, 192.168.2.2 : 2.2.2.2, 192.168.3.3 : 3.3.3.3 }

7.2 TODO Balaceig de càrrega

En aquest aspecte tan sols veurem dos aplicacions de balanceig, tot i que n'hi ha alguns més que podeu trobar directament a la wiki de nftables.

Balanceig Round Robin al 50% entro dos servidors:

nft add rule TAULA CADENA iifname enp0s3 tcp dport {80, 443} dnat to numgen inc mod 2 map {0:192.168.1.2, 1:192.168.1.3}

Balanceig per pes (aleatori 2/3 - 1/3):

nft add rule TAULA CADENA iifname eno0s3 tcp dport {80, 443} dnat to numgen random mod 100 map {0-32:192.168.1.2, 33-99:192.168.1.3}

FALTA: Balanceig per connexions actives, cal controlar-les amb conntrack.

7.3 Port Knocking

Knocking sequence, in this example below, are TCP ports: 123, 234, 345 and 456.

define guarded_ports = {ssh}

table inet portknock {
	set clients_ipv4 {
		type ipv4_addr
		flags timeout
	}

	set clients_ipv6 {
		type ipv6_addr
		flags timeout
	}

	set candidates_ipv4 {
		type ipv4_addr . inet_service
		flags timeout
	}

	set candidates_ipv6 {
		type ipv6_addr . inet_service
		flags timeout
	}

	chain input {
		type filter hook input priority -10; policy accept;

		iifname "lo" return

		tcp dport 123 add @candidates_ipv4 {ip  saddr . 234 timeout 1s}
		tcp dport 123 add @candidates_ipv6 {ip6 saddr . 234 timeout 1s}
		tcp dport 234 ip  saddr . tcp dport @candidates_ipv4 add @candidates_ipv4 {ip  saddr . 345 timeout 1s}
		tcp dport 234 ip6 saddr . tcp dport @candidates_ipv6 add @candidates_ipv6 {ip6 saddr . 345 timeout 1s}
		tcp dport 345 ip  saddr . tcp dport @candidates_ipv4 add @candidates_ipv4 {ip  saddr . 456 timeout 1s}
		tcp dport 345 ip6 saddr . tcp dport @candidates_ipv6 add @candidates_ipv6 {ip6 saddr . 456 timeout 1s}
		tcp dport 456 ip  saddr . tcp dport @candidates_ipv4 add @clients_ipv4 {ip  saddr timeout 10s} log prefix "Successful portknock: "
		tcp dport 456 ip6 saddr . tcp dport @candidates_ipv6 add @clients_ipv6 {ip6 saddr timeout 10s} log prefix "Successful portknock: "

		tcp dport $guarded_ports ip  saddr @clients_ipv4 counter accept
		tcp dport $guarded_ports ip6 saddr @clients_ipv6 counter accept
		tcp dport $guarded_ports ct state established,related counter accept

		tcp dport $guarded_ports counter reject with tcp reset

7.4 TODO QoS

8 Exercicis

8.1 Tallafocs host amb llistes negres

8.1.1 Enunciat

L’objectiu és crear un tallafocs en una estació de treball Debian que funciona amb IP fixa dintre del rang que tingueu assignat. Aquest primer tallafocs tan sols ha de blocar el tràfic cap a unes adreces concretes que no volem que els usuaris visitin. Hem d’acabar aconseguint un script que contingui les regles per a fer el següent: Crear una taula i una cadena per controlar la sortida establint una política de llista negres (permetre-ho tot, excepte el que indiquem a continuació). Blocar l’accés al robust del infla (10.51.0.202) Voler denegar l’accés a la web de Bages Centre, per a que no es distreguin els usuaris, i hem determinat que la IP és 212.121.227.57. Per cada punt cal tenir clara la regla i haver-la comprovat que funciona correctament (que permet i no permet fer el que toca). Un cop fet això ens interessa aconseguir persistència per a que les regles no es perdin en reiniciar la màquina.

8.1.2 Solució

#!/usr/sbin/nft -f

flush ruleset

add table DENEGAR
add chain DENEGAR SORTIDA { type filter hook output priority 0; policy accept;}
add rule DENEGAR SORTIDA ip daddr {10.51.0.202, 212.121.227.57} drop

La persistència s'aconsegueix fent cat tallafocs.nft > /etc/nftables.conf.

8.2 Tallafocs host amb llistes blanques

8.2.1 Enunciat

L’objectiu és crear un tallafocs el màxim segur possible per a una estació de treball Debian Desktop que funciona amb IP fixa dintre del rang que tingueu assignat. Per assegurar-la al màxim utilitzarem política de llistes blanques tant pel que fa a sortida com d’entrada de comunicacions. Hem d’acabar aconseguint un tallafocs que faci el següent:

  • Establir política de llista blanca (denegar-ho TOT, excepte el que indiquem a continuació).
  • Permetre navegar per Internet.
  • Permetre actualitzar el sistema (fer un apt-get update i un apt-get upgrade).
  • Permetre protocol ICMP (tant rebre’ls com fer-los) per poder utilitzar per exemple el ping.
  • Obrir el port 22 TCP d’entrada per a la gestió remota, però tan sols des de la IP i MAC de la vostra màquina real.
  • Ús de client de correu electrònic Thunderbird.

Per cada punt cal tenir clara la regla i haver-la comprovat que funciona correctament (que permet i no permet fer el que toca). Un cop fet ens centrarem a investigar com resoldre els següents punts que, a priori, no són tan senzills de tractar. Concretament:

  • Problemes: Denegar la web de FaceBook.
  • Problemes: Permetre l’ús d’un FTP.

8.2.2 Solució

#!/usr/sbin/nft -f

#Neteja de regles anteriors, per a que no acumuli.
flush ruleset

# Creació taula / contenidor
add table PERMETRE

# Creació cadena de sortida,  política DROP
add chain PERMETRE SORTIDA { type filter hook output priority 0; policy drop;}
# Pings i comandes gestió xarxa
add rule PERMETRE SORTIDA ip protocol icmp accept
#Ports navegació i email.
add rule PERMETRE SORTIDA tcp dport {80, 443, 53, 110, 25, 587, 143, 995, 465, 993} accept
# Recordar DNS també per UDP
add rule PERMETRE SORTIDA udp dport 53 accept
# Permetre la sortida de "respostes" Cal per el nostre servei de SSH.
add rule PERMETRE SORTIDA ct state {related, established} accept

# Creació de cadena d'entrada de paquets, política DROP
add chain PERMETRE ENTRADA { type filter hook input priority 0; policy drop;}
# ICMP ídem sortida.
add rule PERMETRE ENTRADA ip protocol icmp accept
# Permetre entrar respostes (navegació, email, etc)
add rule PERMETRE ENTRADA ct state {related, established} accept
# Permetre entrar al servei SSH a una IP i MAC concretes.
add rule PERMETRE ENTRADA tcp dport 22 ip saddr 10.50.13.13 ether saddr 70:85:c2:89:31:d4 accept

9 Webgrafía

10 Glossari

Cadena
Punt d'inspecció on actuem sobre el paquet (prerouting, input, forward, output i postrouting). A nftables no en ve cap de creada per defecte.
Taula
Contenidor de cadenes on agrupar regles per funcionalitat,a iptables teníem: filter, nat, raw, mangle, security i personalitzades. A nftables podem crear les que vulguem, no en ve cap de definida.
Regla
Instrucció afegeix una regla dins d'una cadena i taula, on es filtra un tipus de paquet objectiu i s'hi apliquen unes accions en cas de coincidència.

Data: 2019-08-25 dg. 00:00

Autor: Raul Gimenez Herrada

Created: 2020-02-19 dc. 21:33

Validate