Dopo un anno di sviluppo rilascio del filtro dei pacchetti , che si sta sviluppando come sostituto di iptables, ip6tables, arptables ed ebtables grazie all'unificazione delle interfacce di filtraggio dei pacchetti per IPv4, IPv6, ARP e bridge di rete. Il pacchetto nftables include componenti di filtraggio dei pacchetti che operano nello spazio utente, mentre a livello di kernel l'operazione è gestita dal sottosistema nf_tables, incluso nel kernel Linux dalla versione 3.13.
A livello di kernel è fornito solo un'interfaccia generica, indipendente dal protocollo specifico e che offre funzioni di base per l'estrazione dei dati dai pacchetti, l'esecuzione di operazioni sui dati e il controllo del flusso.
La logica di filtraggio e i gestori specifici per i protocolli vengono direttamente compilati in bytecode nello spazio utente, dopo di che questo bytecode viene caricato nel kernel tramite l'interfaccia Netlink e viene eseguito in una speciale macchina virtuale simile a BPF (Berkeley Packet Filters). Questo approccio consente di ridurre significativamente la dimensione del codice di filtraggio che opera a livello di kernel e di spostare tutte le funzioni di parsing delle regole e la logica di gestione dei protocolli nello spazio utente.
Novità principali:
- Supporto IPsec, che consente di eseguire la corrispondenza degli indirizzi dei tunnel in base ai pacchetti, all'identificatore della richiesta IPsec e al tag SPI (Security Parameter Index). Ad esempio,
… ipsec in ip saddr 192.168.1.0/24
… ipsec in spi 1-65536È possibile anche il controllo del passaggio del percorso attraverso il tunnel IPsec. Ad esempio, per bloccare il traffico che non passa attraverso IPSec:
… filter output rt ipsec missing drop
- Supporto del protocollo IGMP (Internet Group Management Protocol). Ad esempio, per scartare le richieste di appartenenza al gruppo IGMP in entrata, è possibile utilizzare la seguente regola:
nft add rule netdev foo bar igmp type membership-query counter drop
- Possibilità di utilizzare variabili per determinare le catene di salto (jump / goto). Ad esempio:
define dest = ber
add rule ip foo bar jump $dest - Supporto di maschere per l'identificazione dei sistemi operativi (OS Fingerprint) basato sui valori TTL nell'intestazione. Ad esempio, per contrassegnare i pacchetti in base al sistema operativo del mittente, è possibile utilizzare il comando:
… meta mark set osf ttl skip name map { «Linux» : 0x1,
«Windows» : 0x2,
«MacOS» : 0x3,
«unknown» : 0x0 }
… osf ttl skip version «Linux:4.20» - Possibilità di corrispondere l'indirizzo ARP del mittente e l'indirizzo IPv4 del sistema di destinazione. Ad esempio, per incrementare il contatore dei pacchetti ARP inviati dall'indirizzo 192.168.2.1, è possibile utilizzare la seguente regola:
table arp x {
catena y {
tipo filtro hook input priorità filtro; politica accetta;
arp saddr ip 192.168.2.1 counter packets 1 bytes 46
}
} - Supporto per il passaggio trasparente delle richieste tramite proxy (tproxy). Ad esempio, per reindirizzare le richieste sulla porta 80 alla porta proxy 8080:
tabella ip x {
catena y {
tipo filtro hook prerouting priorità -150; politica accetta;
tcp dport 80 tproxy to :8080
}
} - Supporto per l'annotazione dei socket con la possibilità di recuperare l'annotazione impostata tramite setsockopt() in modalità SO_MARK. Ad esempio:
tabella inet x {
catena y {
tipo filtro hook prerouting priorità -150; politica accetta;
tcp dport 8080 mark set socket mark
}
} - Supporto per la specifica di nomi testuali priorità per le catene. Ad esempio:
nft add chain ip x raw { tipo filtro hook prerouting priorità raw; }
nft add chain ip x filter { tipo filtro hook prerouting priorità filtro; }
nft add chain ip x filter_later { tipo filtro hook prerouting priorità filtro + 10; } - Supporto per le etichette SELinux (Secmark). Ad esempio, per definire l'etichetta "sshtag" in associazione al contesto SELinux, si può eseguire:
nft add secmark inet filter sshtag "system_u:object_r:ssh_server_packet_t:s0"
E poi utilizzare questa etichetta nelle regole:
nft add rule inet filter input tcp dport 22 meta secmark set "sshtag"
nft add map inet filter secmapping { tipo inet_service : secmark; }
nft add element inet filter secmapping { 22 : "sshtag" }
nft add rule inet filter input meta secmark set tcp dport map @secmapping - Possibilità di specificare le porte associate ai protocolli in forma testuale, come definite nel file /etc/services. Ad esempio:
nft add rule x y tcp dport "ssh"
nft list ruleset -l
table x {
catena y {
…
tcp dport «ssh»
}
} - Possibilità di controllare il tipo di interfaccia di rete. Ad esempio:
add rule inet raw prerouting meta iifkind «vrf» accept
- Migliorato il supporto per l'aggiornamento dinamico dei contenuti dei set (sets) tramite l'indicazione esplicita del flag «dynamic». Ad esempio, per aggiornare il set «s» con l'aggiunta dell'indirizzo sorgente e resettare l'entry in caso di mancanza di pacchetti per 30 secondi:
add table x
add set x s { type ipv4_addr; size 128; timeout 30s; flags dynamic; }
add chain x y { type filter hook input priority 0; }
add rule x y update @s { ip saddr } - Possibilità di definire una condizione separata per l'attivazione del timeout. Ad esempio, per ridefinire il timeout di default per i pacchetti ricevuti sulla porta 8888, si può specificare:
table ip filter {
ct timeout agressive-tcp {
protocol tcp;
l3proto ip;
policy = {established: 100, close_wait: 4, close: 4}
}
chain output {
…
tcp dport 8888 ct timeout set «agressive-tcp»
}
} - Supporto NAT per la famiglia inet:
table inet nat {
…
ip6 daddr dead::2::1 dnat to dead:2::99
} - Strumenti di output migliorati per la segnalazione di errori causati da errori di battitura:
nft add chain filtre test
Error: No such file or directory; did you mean table «filter» in family ip?
add chain filtre test
^^^^^^ - Possibilità di specificare i nomi delle interfacce nei set (sets):
set sc {
type inet_service . ifname
elements = { «ssh» . «eth0» }
} - Aggiornata la sintassi delle regole flowtable:
nft add table x
nft add flowtable x ft { hook ingress priority 0; devices = { eth0, wlan0 }; }
…
nft add rule x forward ip protocol { tcp, udp } flow add @ft - Migliore supporto per JSON.
Fonte: opennet.ru
