Nftables: differenze tra le versioni
Wtf (discussione | contributi) Nessun oggetto della modifica |
Wtf (discussione | contributi) m (→Installazione) |
||
(24 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
{{Versioni compatibili}}{{Gateway-Router}} | {{Versioni compatibili}}{{Gateway-Router}} | ||
==Introduzione== | ==Introduzione== | ||
<code>nftables</code> è la nuova infrastruttura per l'analisi e manipolazione dei pacchetti di rete che sostituisce la vecchia <code>iptables</code>. Già in sviluppo da alcuni anni (è disponibile dalla versione 3.13 del kernel di linux) sarà la soluzione predefinita a partire da ''Buster'', attraverso gli strumenti del gruppo <code>xtables-nft</code> che permettono di agire su <code>nftables</code> usando la vecchia sintassi di <code>iptables</code>.<br> | <code>nftables</code> è la nuova infrastruttura per l'analisi e manipolazione dei pacchetti di rete che sostituisce la vecchia <code>iptables</code>. Già in sviluppo da alcuni anni (è disponibile dalla versione 3.13 del kernel di linux) sarà la soluzione predefinita a partire da ''Buster'', attraverso gli strumenti del gruppo '''<code>xtables-nft</code> che permettono di agire su <code>nftables</code> usando la vecchia sintassi''' di <code>iptables</code>.<br> | ||
Naturalmente come sempre in questi casi la transizione non sarà netta da un giorno all'altro, ma il vecchio <code>iptables</code> continuerà a sopravvivere come strumento ''legacy'' (difficile dire per quanto), visto che tra l'altro <code>nftables</code> presenta un livello di compatibilità con il suo predecessore. | Naturalmente come sempre in questi casi la transizione non sarà netta da un giorno all'altro, ma il vecchio <code>iptables</code> continuerà a sopravvivere come strumento ''legacy'' (difficile dire per quanto), visto che tra l'altro <code>nftables</code> presenta un livello di compatibilità con il suo predecessore. | ||
==Installazione== | |||
=== nftables === | |||
Per usare il nuovo strumento <code>nft</code> e quindi la sintassi nativa di <code>nftables</code> è necessario installare il pacchetto <code>nftables</code> | |||
<pre># apt install nftables</pre> | |||
== | === xtables-nft === | ||
Per usare gli strumenti del gruppo <code>xtables-nft</code> non è necessario fare alcunché | Per usare gli strumenti del gruppo <code>xtables-nft</code> non è necessario fare alcunché da ''Buster'' in avanti, infatti questi sono già disponibili di serie , mentre in ''Stretch'' è necessario installare il pacchetto <code>iptables-nftables-compat</code> | ||
<pre># apt install iptables-nftables-compat</pre> | <pre># apt install iptables-nftables-compat</pre> | ||
In ''Stretch'' l'eseguibile di riferimento non è infatti <code>xtables-nft</code>, ma <code>xtables-compat</code>. A prescindere dai nomi usati le due famiglie contengono gli stessi strumenti che permettono di gestire l'architettura <code>nftables</code> attraverso la vecchia sintassi di <code>iptables</code>, oltre a quelli di traduzione dei comandi <code>iptables-translate</code>, <code>iptables-restore-translate</code>, ecc. Per quando riguarda la vecchia sintassi '''si rimanda alla guida di [[Debian e iptables | iptables]]'''. | |||
=== Cambiare infrastruttura === | |||
<pre># | Come scritto nell'introduzione <code>nftables</code> è lo standard da ''Buster'' in poi, ma è comunque possibile continuare ad usare la vecchia infrastruttura attraverso <code>iptables-legacy</code> usando il comando <code>update-alternatives</code> come mostrato nel sottostante esempio: | ||
<pre> | |||
# update-alternatives --config iptables | |||
Sono disponibili 2 scelte per l'alternativa iptables (che fornisce /usr/sbin/iptables). | |||
Selezione Percorso Priorità Stato | |||
------------------------------------------------------------ | |||
* 0 /usr/sbin/iptables-nft 20 modalità automatica | |||
1 /usr/sbin/iptables-legacy 10 modalità manuale | |||
2 /usr/sbin/iptables-nft 20 modalità manuale | |||
Premere Invio per mantenere il valore predefinito[*] o digitare il numero della selezione: 1 | |||
</pre> | |||
Quindi anche se l'eseguibile di riferimento cambia, il collegamento simbolico no, ovvero i comandi continueranno ad essere dati digitando <code># iptables opzioni comando ecc.</code>. | |||
==Sintassi <code>nft</code>== | == Sintassi <code>nft</code> == | ||
Mostrare tutte le regole di tutte le tabelle (tutto in una parola): | Mostrare tutte le regole di tutte le tabelle (tutto in una parola): | ||
<pre># nft list ruleset</pre> | <pre># nft list ruleset</pre> | ||
Salvare tutte regole in un file testuale (utile per rendere permanente il tutto, si veda più sotto): | Salvare tutte regole in un file testuale (utile per rendere permanente il tutto, si veda più sotto): | ||
<pre># nft list ruleset > nftables.conf</pre> | <pre># nft list ruleset > /mio/percorso/nftables.conf</pre> | ||
Caricare tutte le regole salvate in un file: | Caricare tutte le regole salvate in un file: | ||
<pre># nft -f nftables.conf</pre> | <pre># nft -f /mio/percorso/nftables.conf</pre> | ||
Elencare tutte le tabelle: | Elencare tutte le tabelle: | ||
<pre># nft list tables</pre> | <pre># nft list tables</pre> | ||
Elencare tutte le catene e le regole della tabella ''filter'' appartenente alla famiglia ''ip'': | Elencare tutte le catene e le regole della tabella ''filter'' appartenente alla famiglia ''ip'': | ||
<pre># nft list table ip filter</pre> | <pre># nft list table ip filter</pre> | ||
Come sopra, ma in più visualizzando anche gli ''handle'', ovvero i riferimenti univoci di ogni riga: | |||
===Caricare automaticamente le regole=== | <pre># nft -a list table ip filter</pre> | ||
Aggiungere una regola in coda a tutte le altre (in questo caso si accettano tutte le connessioni in entrata su "enp1s0" e dirette alla porta 6666): | |||
<pre> | |||
# nft add rule ip filter INPUT iifname "enp1s0" ct state new tcp dport 6666 counter accept | |||
</pre> | |||
Come sopra, ma la regola viene inserita all'inizio e non appesa alla fine (un esempio per riga): | |||
<pre> | |||
# nft insert rule ip filter INPUT iifname "enp1s0" ct state new tcp dport 6666 counter accept | |||
# nft insert rule ip filter FORWARD iifname "enp1s0" oifname "enp2s0" ct state new udp dport 6667 counter accept | |||
</pre> | |||
Inserire una nuova regola subito dopo quella avente identificativo "8": | |||
<pre> | |||
# nft add rule filter OUTPUT position 8 ip daddr 127.0.0.8 drop | |||
# nft add rule ip nat PREROUTING position 8 iifname "enp1s0" tcp dport 6666 counter dnat to 192.168.0.83 | |||
</pre> | |||
Aggiungere una regola di prerouting in coda a tutte le altre: | |||
<pre> | |||
# nft add rule ip nat PREROUTING iifname "enp1s0" tcp dport 6666 counter dnat to 192.168.0.83 | |||
</pre> | |||
Inserire una nuova regola di prerouting subito dopo quella avente identificativo "8": | |||
<pre> | |||
# nft add rule ip nat PREROUTING position 8 iifname "enp1s0" tcp dport 6666 counter dnat to 192.168.0.83 | |||
</pre> | |||
Eliminare una riga avente identificativo "8": | |||
<pre># nft delete rule filter OUTPUT handle 8</pre> | |||
Eliminare tutte le regole della tabella ''filter'' catena ''output'': | |||
<pre># nft delete rule filter OUTPUT</pre> | |||
Svuotare completamente la tabella filter: | |||
<pre>nft flush table filter</pre> | |||
Per maggiori informazioni sulla nuova sintassi si rimanda alla sezione ''Approfondimenti'' in coda a questa pagina. | |||
=== Caricare automaticamente le regole === | |||
Come nel caso di <code>iptables</code> tutte le regole dichiarate saranno perse al riavvio della macchina, ma al momento non esiste uno strumento come <code>iptables-persistent</code>.<br> | Come nel caso di <code>iptables</code> tutte le regole dichiarate saranno perse al riavvio della macchina, ma al momento non esiste uno strumento come <code>iptables-persistent</code>.<br> | ||
Una soluzione può quindi essere quella di usare cron per far caricare in automatico ad ogni avvio un file testuale contenente tutte le regole del firewall.<br> | Una soluzione può quindi essere quella di usare cron per far caricare in automatico ad ogni avvio un file testuale contenente tutte le regole del firewall.<br> | ||
Riga 39: | Riga 86: | ||
* <code>iptables-translate</code> che permette di tradurre al volo un comando qualsiasi di <code>iptables</code> (e qualora non ne sia in grado avvisa l'utente). | * <code>iptables-translate</code> che permette di tradurre al volo un comando qualsiasi di <code>iptables</code> (e qualora non ne sia in grado avvisa l'utente). | ||
* <code>iptables-restore-translate</code> che invece traduce un file di regole generato attraverso <code>iptables-save</code>. | * <code>iptables-restore-translate</code> che invece traduce un file di regole generato attraverso <code>iptables-save</code>. | ||
=== iptables-translate === | === iptables-translate === | ||
Se non si hanno molte regole da convertire questo è probabilmente il modo migliore di procedere, per tre motivi: | Se non si hanno molte regole da convertire questo è probabilmente il modo migliore di procedere, per tre motivi: | ||
# permette immediatamente di vedere se una certa regola può essere tradotta correttamente; | # permette immediatamente di vedere se una certa regola può essere tradotta correttamente; | ||
# permette di avere un idea di come è cambiata la sintassi; | # permette di avere un idea di come è cambiata la sintassi; | ||
# permette di generale un elenco di regole chiaro e pulito (vedere il comando <code>nft list ruleset > nftables.conf</code>). | # permette di generale un elenco di regole '''chiaro e pulito''' (vedere il comando <code>nft list ruleset > nftables.conf</code>). | ||
Esempio: | Esempio: | ||
<pre> | <pre> | ||
Riga 52: | Riga 96: | ||
nft add rule ip filter INPUT tcp dport 22 ct state new counter accept | nft add rule ip filter INPUT tcp dport 22 ct state new counter accept | ||
</pre> | </pre> | ||
=== iptables-restore-translate === | |||
=== iptables- | |||
Per procedere è prima necessario salvare in un file testuale il contenuto di <code>iptables</code> col comando: | Per procedere è prima necessario salvare in un file testuale il contenuto di <code>iptables</code> col comando: | ||
<pre># iptables-save > save.txt</pre> | <pre># iptables-save > save.txt</pre> | ||
Riga 61: | Riga 103: | ||
e infine procedere al caricamento vero e proprio: | e infine procedere al caricamento vero e proprio: | ||
<pre># nft -f ruleset.nft</pre> | <pre># nft -f ruleset.nft</pre> | ||
Come già scritto le regole così importate andranno perse al riavvio e pertanto sta all'utente trovare un modo di caricarle in automatico all'avvio (un metodo è stato presentato nella sezione precedente). | Come già scritto le regole così importate andranno perse al riavvio e pertanto sta all'utente trovare un modo di caricarle in automatico all'avvio (un possibile metodo è stato presentato nella sezione precedente ''Caricare automaticamente le regole''). | ||
== Approfondimenti == | == Approfondimenti == | ||
=== Manpages === | === Manpages === | ||
* <code>man xtables-nft</code> in ''Buster'' e successive, <code>man iptables-compat</code> in ''Stretch'' | |||
* <code>man xtables-nft</code> in ''Buster'', <code>man iptables-compat</code> in ''Stretch'' | * <code>man xtables-translate</code> in ''Buster'' e successive, <code>man iptables-translate</code> in ''Stretch'' | ||
* <code>man xtables-translate</code> in ''Buster'', <code>man iptables-translate</code> in ''Stretch'' | |||
* <code>man nft</code> | * <code>man nft</code> | ||
=== Sitografia === | === Sitografia === | ||
* [https://wiki.nftables.org/wiki-nftables/index.php/Main_Page Wiki ufficiale], pagina principale | * [https://wiki.nftables.org/wiki-nftables/index.php/Main_Page Wiki ufficiale], pagina principale | ||
* [https://wiki.nftables.org/wiki-nftables/index.php/Moving_from_iptables_to_nftables Wiki ufficiale, migrazione], pagina dedicata alla migrazione da <code>iptables</code> | * [https://wiki.nftables.org/wiki-nftables/index.php/Moving_from_iptables_to_nftables Wiki ufficiale, migrazione], pagina dedicata alla migrazione da <code>iptables</code> | ||
Riga 87: | Riga 124: | ||
|Numero_revisori=0 | |Numero_revisori=0 | ||
}} | }} | ||
[[Categoria:Firewall]] | [[Categoria:Firewall]] |
Versione attuale delle 13:02, 8 ago 2024
Versioni Compatibili Tutte le versioni supportate di Debian |
Gateway-Router |
Sommario |
Introduzione
nftables
è la nuova infrastruttura per l'analisi e manipolazione dei pacchetti di rete che sostituisce la vecchia iptables
. Già in sviluppo da alcuni anni (è disponibile dalla versione 3.13 del kernel di linux) sarà la soluzione predefinita a partire da Buster, attraverso gli strumenti del gruppo xtables-nft
che permettono di agire su nftables
usando la vecchia sintassi di iptables
.
Naturalmente come sempre in questi casi la transizione non sarà netta da un giorno all'altro, ma il vecchio iptables
continuerà a sopravvivere come strumento legacy (difficile dire per quanto), visto che tra l'altro nftables
presenta un livello di compatibilità con il suo predecessore.
Installazione
nftables
Per usare il nuovo strumento nft
e quindi la sintassi nativa di nftables
è necessario installare il pacchetto nftables
# apt install nftables
xtables-nft
Per usare gli strumenti del gruppo xtables-nft
non è necessario fare alcunché da Buster in avanti, infatti questi sono già disponibili di serie , mentre in Stretch è necessario installare il pacchetto iptables-nftables-compat
# apt install iptables-nftables-compat
In Stretch l'eseguibile di riferimento non è infatti xtables-nft
, ma xtables-compat
. A prescindere dai nomi usati le due famiglie contengono gli stessi strumenti che permettono di gestire l'architettura nftables
attraverso la vecchia sintassi di iptables
, oltre a quelli di traduzione dei comandi iptables-translate
, iptables-restore-translate
, ecc. Per quando riguarda la vecchia sintassi si rimanda alla guida di iptables.
Cambiare infrastruttura
Come scritto nell'introduzione nftables
è lo standard da Buster in poi, ma è comunque possibile continuare ad usare la vecchia infrastruttura attraverso iptables-legacy
usando il comando update-alternatives
come mostrato nel sottostante esempio:
# update-alternatives --config iptables Sono disponibili 2 scelte per l'alternativa iptables (che fornisce /usr/sbin/iptables). Selezione Percorso Priorità Stato ------------------------------------------------------------ * 0 /usr/sbin/iptables-nft 20 modalità automatica 1 /usr/sbin/iptables-legacy 10 modalità manuale 2 /usr/sbin/iptables-nft 20 modalità manuale Premere Invio per mantenere il valore predefinito[*] o digitare il numero della selezione: 1
Quindi anche se l'eseguibile di riferimento cambia, il collegamento simbolico no, ovvero i comandi continueranno ad essere dati digitando # iptables opzioni comando ecc.
.
Sintassi nft
Mostrare tutte le regole di tutte le tabelle (tutto in una parola):
# nft list ruleset
Salvare tutte regole in un file testuale (utile per rendere permanente il tutto, si veda più sotto):
# nft list ruleset > /mio/percorso/nftables.conf
Caricare tutte le regole salvate in un file:
# nft -f /mio/percorso/nftables.conf
Elencare tutte le tabelle:
# nft list tables
Elencare tutte le catene e le regole della tabella filter appartenente alla famiglia ip:
# nft list table ip filter
Come sopra, ma in più visualizzando anche gli handle, ovvero i riferimenti univoci di ogni riga:
# nft -a list table ip filter
Aggiungere una regola in coda a tutte le altre (in questo caso si accettano tutte le connessioni in entrata su "enp1s0" e dirette alla porta 6666):
# nft add rule ip filter INPUT iifname "enp1s0" ct state new tcp dport 6666 counter accept
Come sopra, ma la regola viene inserita all'inizio e non appesa alla fine (un esempio per riga):
# nft insert rule ip filter INPUT iifname "enp1s0" ct state new tcp dport 6666 counter accept # nft insert rule ip filter FORWARD iifname "enp1s0" oifname "enp2s0" ct state new udp dport 6667 counter accept
Inserire una nuova regola subito dopo quella avente identificativo "8":
# nft add rule filter OUTPUT position 8 ip daddr 127.0.0.8 drop # nft add rule ip nat PREROUTING position 8 iifname "enp1s0" tcp dport 6666 counter dnat to 192.168.0.83
Aggiungere una regola di prerouting in coda a tutte le altre:
# nft add rule ip nat PREROUTING iifname "enp1s0" tcp dport 6666 counter dnat to 192.168.0.83
Inserire una nuova regola di prerouting subito dopo quella avente identificativo "8":
# nft add rule ip nat PREROUTING position 8 iifname "enp1s0" tcp dport 6666 counter dnat to 192.168.0.83
Eliminare una riga avente identificativo "8":
# nft delete rule filter OUTPUT handle 8
Eliminare tutte le regole della tabella filter catena output:
# nft delete rule filter OUTPUT
Svuotare completamente la tabella filter:
nft flush table filter
Per maggiori informazioni sulla nuova sintassi si rimanda alla sezione Approfondimenti in coda a questa pagina.
Caricare automaticamente le regole
Come nel caso di iptables
tutte le regole dichiarate saranno perse al riavvio della macchina, ma al momento non esiste uno strumento come iptables-persistent
.
Una soluzione può quindi essere quella di usare cron per far caricare in automatico ad ogni avvio un file testuale contenente tutte le regole del firewall.
Come già scritto nella precedente sezione è possibile salvare le regole col comando nft list ruleset
e ricaricarle con nft -f
, pertanto:
# nft list ruleset > /etc/nftables.conf
e a questo punto editare crontab
# crontab -e
aggiungendo la seguente riga:
@reboot /usr/sbin/nft -f /etc/nftables.conf
in modo che ad ogni riavvio vengano ricaricate in automatico tutte le regole.
Migrare da iptables
Sono stati sviluppati alcuni strumenti di conversione per facilitare la migrazione dalla sintassi di iptables
a quella di nftables
. In particolare:
iptables-translate
che permette di tradurre al volo un comando qualsiasi diiptables
(e qualora non ne sia in grado avvisa l'utente).iptables-restore-translate
che invece traduce un file di regole generato attraversoiptables-save
.
iptables-translate
Se non si hanno molte regole da convertire questo è probabilmente il modo migliore di procedere, per tre motivi:
- permette immediatamente di vedere se una certa regola può essere tradotta correttamente;
- permette di avere un idea di come è cambiata la sintassi;
- permette di generale un elenco di regole chiaro e pulito (vedere il comando
nft list ruleset > nftables.conf
).
Esempio:
# iptables-translate -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT nft add rule ip filter INPUT tcp dport 22 ct state new counter accept
iptables-restore-translate
Per procedere è prima necessario salvare in un file testuale il contenuto di iptables
col comando:
# iptables-save > save.txt
Quindi convertire detto file in uno compatibile per iptables
# iptables-restore-translate -f save.txt > ruleset.nft
e infine procedere al caricamento vero e proprio:
# nft -f ruleset.nft
Come già scritto le regole così importate andranno perse al riavvio e pertanto sta all'utente trovare un modo di caricarle in automatico all'avvio (un possibile metodo è stato presentato nella sezione precedente Caricare automaticamente le regole).
Approfondimenti
Manpages
man xtables-nft
in Buster e successive,man iptables-compat
in Stretchman xtables-translate
in Buster e successive,man iptables-translate
in Stretchman nft
Sitografia
- Wiki ufficiale, pagina principale
- Wiki ufficiale, migrazione, pagina dedicata alla migrazione da
iptables
- homepage degli sviluppatori di netfilter
- nftables su wiki.debian.org
- Wiki Gentoo
- Wiki ArchLinux
Guida scritta da: Wtf 22:27, 5 mag 2019 (CEST) | Debianized 20% |
Estesa da: | |
Verificata da: | |
Verificare ed estendere la guida | Cos'è una guida Debianized |