Dopo un anno di sviluppo rilascio del filtro dei pacchetti , che si sviluppa come sostituto di iptables, ip6tables, arptables ed ebtables grazie all'unificazione delle interfacce di filtraggio dei pacchetti per IPv4, IPv6, ARP e ponti di rete. Il pacchetto nftables include componenti del filtraggio dei pacchetti che operano nello spazio utente, mentre a livello di kernel l'operazione è fornita dal sottosistema nf_tables, incluso nel kernel Linux a partire dal rilascio 3.13.
A livello di kernel viene fornito solo un'interfaccia generale, indipendente dal protocollo specifico e che fornisce funzioni di base per l'estrazione dei dati dai pacchetti, l'esecuzione di operazioni sui dati e la gestione del flusso.
La logica di filtraggio e i gestori specifici per i protocolli vengono compilati in bytecode nello spazio utente, dopodiché questo bytecode viene caricato nel kernel tramite l'interfaccia Netlink e viene eseguito in una macchina virtuale speciale, 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 analisi delle regole e la logica di funzionamento con i protocolli nello spazio utente.
Novità principali:
- Supporto per IPsec, che consente di effettuare il mapping degli indirizzi dei tunnel legato al pacchetto, all'ID della richiesta di IPsec e al tag SPI (Security Parameter Index). Ad esempio,
… ipsec in ip saddr 192.168.1.0/24
… ipsec in spi 1-65536È anche possibile verificare il passaggio del percorso attraverso un tunnel IPsec. Ad esempio, per bloccare il traffico non tramite IPsec:
… filter output rt ipsec missing drop
- Supporto per il protocollo IGMP (Internet Group Management Protocol). Ad esempio, per scartare le richieste IGMP in ingresso relative all'appartenenza a un gruppo, è possibile utilizzare la regola
nft add rule netdev foo bar igmp type membership-query counter drop
- Possibilità di utilizzare variabili per definire le catene di transizione (jump / goto). Ad esempio:
define dest = ber
add rule ip foo bar jump $dest - Supporto per le 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 mappare l'indirizzo ARP del mittente all'indirizzo IPv4 del sistema target. Ad esempio, per aumentare il contatore dei pacchetti ARP inviati dall'indirizzo 192.168.2.1, è possibile utilizzare la regola:
table arp x {
chain y {
type filter hook input priority filter; policy accept;
arp saddr ip 192.168.2.1 counter packets 1 bytes 46
}
} - Supporto per il forwarding trasparente delle richieste tramite proxy (tproxy). Ad esempio, per reindirizzare le richieste sulla porta 80 verso il proxy sulla porta 8080:
tabella ip x {
chain y {
type filter hook prerouting priority -150; policy accept;
tcp dport 80 tproxy to :8080
}
} - Supporto per la marcatura dei socket con la possibilità di ricevere ulteriormente il contrassegno impostato tramite setsockopt() in modalità SO_MARK. Ad esempio:
table inet x {
chain y {
type filter hook prerouting priority -150; policy accept;
tcp dport 8080 mark set socket mark
}
} - Supporto per la specifica di nomi testuali di priorità per le catene. Ad esempio:
nft add chain ip x raw { type filter hook prerouting priority raw; }
nft add chain ip x filter { type filter hook prerouting priority filter; }
nft add chain ip x filter_later { type filter hook prerouting priority filter + 10; } - Supporto per i contrassegni SELinux (Secmark). Ad esempio, per definire il contrassegno «sshtag» associato al contesto SELinux si può eseguire:
nft add secmark inet filter sshtag «system_u:object_r:ssh_server_packet_t:s0»
E quindi utilizzare questo contrassegno nelle regole:
nft add rule inet filter input tcp dport 22 meta secmark set «sshtag»
nft add map inet filter secmapping { type 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 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 {
chain y {
…
tcp dport «ssh»
}
} - Possibilità di verificare il tipo di interfaccia di rete. Ad esempio:
add rule inet raw prerouting meta iifkind «vrf» accept
- Migliorato supporto per l'aggiornamento dinamico del contenuto dei set tramite specifica esplicita del flag «dynamic». Ad esempio, per aggiornare il set «s» aggiungendo l'indirizzo sorgente e resettando la registrazione in caso di assenza 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 impostare una condizione separata per l'attivazione del timeout. Ad esempio, per ridefinire il timeout predefinito 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 per NAT per la famiglia inet:
table inet nat {
…
ip6 daddr dead::2::1 dnat to dead:2::99
} - Strumenti di output migliorati per la gestione degli errori a causa di 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 nomi di interfaccia nei set (sets):
set sc {
type inet_service . ifname
elements = { «ssh» . «eth0» }
} - Sintassi delle regole flowtable aggiornata:
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 - Migliorato il supporto per JSON.
Fonte: opennet.ru
