Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Nftables: il firewall di Linux si rinnova

Linux 3.13 ha introdotto una grande novità: vediamo come funziona nftables, il sostituto di iptables.
Linux 3.13 ha introdotto una grande novità: vediamo come funziona nftables, il sostituto di iptables.
Link copiato negli appunti

Con il rilascio del kernel Linux 3.13, sono cambiate un po’ di cose all’interno dell’infrastruttura del kernel del sistema stesso: una tra le più grandi novità introdotte in questa release è stata proprio nftables, che sostanzialmente è un software sostituto di iptables. E basta? In realtà no: c’è di più infatti, e come andremo a vedere nftables è il rimedio proposto dagli sviluppatori del kernel ad alcune criticità esposte non solo da iptables stesso, ma da altri software collaterali correlati all’uso di iptables ed utilizzati per gestire il filtering delle interfacce di rete all’interno del sistema.

Nftables: una panoramica

Quali sono quindi queste criticità esposte dai software precedenti, e come intende nftables rimediare ai “bachi” che si sono creati durante gli anni? Innanzi tutto, è bene sapere che l’infrastruttura del firewall è stata ripensata: nftables espone una virtual machine tramite il kernel, che è incaricata di eseguire le istruzioni che noi inviamo al firewall. In kernelspace quindi abbiamo un binario che si occupa di eseguire il bytecode derivato da quello che scriviamo nei nostri file di configurazione. Viceversa, tutta la scrittura del codice e la compilazione in bytecode per così dire edibile da nftables, è spostata nello userspace.

Tutto quello che noi scriviamo, quindi, verrà compilato in bytecode e mandato al kernel stesso, dove nftables si occuperà di rendere effettive le modifiche. Questo disaccoppiamento, come vedremo più in là, porta notevoli vantaggi dal punto di vista dell’amministrazione di sistema. Inoltre, questo comporta che nftables sia capace di gestire svariati dataset (come indirizzi IP o altro), permettendo che operazioni di comparazione multiple (per ogni protocollo ad esempio) vengano sostituite con dei semplici lookup. Al contrario di iptables quindi, non abbiamo le strutture di rete codificate in maniera complessa e replicate più volte all’interno del software.

Una concezione di questo tipo comporta notevoli vantaggi:

  • Ovviamente, la semplificazione della ABI del kernel Linux stesso;
  • La riduzione della duplicazione del codice;
  • Una meccanica di report degli errori migliore;
  • Delle prassi di esecuzione, storage, cambiamenti incrementali e filtering parecchio migliorate rispetto alle implementazioni precedenti.

Inoltre, l’eseguibile nft fornisce la retrocompatibilità e sostituisce più applicativi, come iptables, ip6tables, arptables e ebtables, che servono rispettivamente per IPv4, IPv6, ARP ed Ethernet bridging. L’implementazione adesso è unica e fornisce la possibilità di configurare un firewall sulle basi della virtual machine presente nel kernel.

Nftables: alcuni esempi pratici

La sola teoria non serve a molto: passiamo quindi a vedere come alcuni comandi di iptables diventino molto più semplici tradotti nella loro alternativa in nftables. Assumendo quindi che la nostra chain si chiami “filter”, possiamo infatti vedere come sia semplicissimo specificare più target in una sola riga, e come due comandi del genere:

iptables -A FORWARD -p tcp --dport 22 -j LOG
iptables -A FORWARD -p tcp --dport 22 -j DROP

Possano diventare con uno schiocco di dita (e le conoscenze adeguate) una sola direttiva da impartire all’interprete:

nft add rule filter forward tcp dport 22 log drop

Inoltre, nftables accetta set di target a cui applicare una medesima direttiva. Tramite l’uso dei set possiamo risparmiare tempo ed evitare di scrivere mille e mille comandi, rimpiazzando il tutto con un solo comando che agisca su tutti i bersagli di cui abbiamo bisogno di cambiare il comportamento. I comandi iptables corrispondenti quindi:

ip6tables -A INPUT -p tcp -m multiport --dports 23,80,443 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT

Diventano solo due righe nel corrispettivo nftables che tramite le parentesi graffe specifica ogni diverso target separato da virgole.

nft add rule ip6 filter input tcp dport {telnet, http, https} accept
nft add rule ip6 filter input icmpv6 type { nd-neighbor-solicit, echo-request, nd-router-advert, nd-neighbor-advert } accept

Per l’handling basilare delle regole, ci basta sapere che l’intero meccanismo di funzionamento di nftables è basato su keyword interpretate poi dalla virtual machine nel giusto modo, un po’ come l’utility ip. Per droppare l’output verso una destinazione ad esempio, basta dare come comando:

nft add rule ip filter output  ip daddr 1.2.3.4 drop

Mentre per accettare le richieste ICMP di tipo echo, ad esempio, possiamo agire in questo modo:

nft add rule  filter input icmp type echo-request accept

Le regole che andiamo ad inserire nella chain che amministriamo sono contrassegnate da un numero. Nftables consente l’uso di procedure estremamente granulari per andare a coprire i nostri bisogni, per esempio possiamo decidere di cancellare tutte le regole della nostra tabella:

nft delete rule filter output

Ma, con estrema precisione, quasi chirurgica, possiamo anche ottenere un listato della chain con associato a ogni riga un numero di handle caratterizzante la specifica istruzione:

# nft list table filter -a
table global {
    chain filter {
        ip protocol icmp ip daddr 1.2.3.4 counter packets 5 bytes 420 drop # handle 10
...

In questo modo, possiamo poi andare ad eliminare la regola senza intaccare il funzionamento delle altre (in questo caso, la numero 10):

nft delete rule filter output handle 10

Oltre tutto, possiamo anche inserire allo stesso modo una regola tramite la keyword position, in un preciso punto della chain in modo da controllare che l’istruzione venga eseguita prima o dopo qualche punto di nostro interesse:

nft insert rule filter output position 8 ip daddr 127.0.0.12 drop

Dopo aver agito pesantemente sulle tabelle di filtering, possiamo anche fare flush della tabella su cui abbiamo operato:

nft flush table filter

Altri vantaggi di nftables

Dopo aver elencato un po’ di cose che possiamo fare con nftables, torniamo a parlare dei vantaggi: cosa ci offre, infatti, l’implementazione che scorpora la kernel mode dalla user mode, alla luce di quello che abbiamo visto? La questione è molto semplice: abbiamo una API in userspace che permette il rimpiazzamento in maniera atomica delle regole che impartiamo al nostro firewall. Questo significa che possiamo apportare dei cambiamenti a dei ruleset molto ampi in pochissimo tempo.

Inoltre, un meccanismo del genere che ci permette di agire in maniera così precisa sul set di istruzioni, ci consente di effettuare delle procedure di diagnostica ottime, e di evitare race condition mentre il set di regole che abbiamo imposto viene passato al kernel ed eseguito. Inoltre, chiaramente, forte di queste feature, nftables è molto più veloce nell’aggiornare i nostri schemi di regole, dato che comunque gli script basati su iptables impiegano molto più tempo dovendo agire sull’intero set, senza la possibilità di effettuare upgrade atomici all’interno dell’insieme.

Ultimo ma non per importanza, viene l’aspetto di pura amministrazione di sistema: con iptables c’era bisogno di un modulo del kernel per ogni target, e quindi era necessaria la ricompilazione del kernel nel caso in cui volessimo usare qualcosa di nuovo. Chiaramente, questo diventa superfluo con la maggior parte del lavoro da fare spostato in userspace.


Ti consigliamo anche