nftables packet filter versione 0.9.4

pubblicato rilascio del filtro dei pacchetti nftables 0.9.4, sviluppato in sostituzione di iptables, ip6table, arptables ed ebtables unificando le interfacce di filtraggio dei pacchetti per IPv4, IPv6, ARP e bridge di rete. Il pacchetto nftables include componenti di filtro dei pacchetti eseguiti nello spazio utente, mentre il lavoro a livello di kernel è fornito dal sottosistema nf_tables, che fa parte del kernel Linux sin dalla versione 3.13. Le modifiche necessarie affinché la versione 0.9.4 di nftables funzioni sono incluse nel futuro ramo del kernel Linux 5.6.

Il livello del kernel fornisce solo un'interfaccia generica indipendente dal protocollo che fornisce funzioni di base per estrarre dati dai pacchetti, eseguire operazioni sui dati e controllo del flusso. Le regole di filtraggio e i gestori specifici del protocollo vengono compilati in bytecode nello spazio utente, dopodiché questo bytecode viene caricato nel kernel utilizzando l'interfaccia Netlink ed eseguito nel kernel in una speciale macchina virtuale che ricorda BPF (Berkeley Packet Filters). Questo approccio consente di ridurre in modo significativo la dimensione del codice di filtraggio in esecuzione a livello di kernel e di spostare tutte le funzioni di analisi delle regole e della logica per lavorare con i protocolli nello spazio utente.

Principali innovazioni:

  • Supporto per intervalli nelle connessioni (concatenazione, alcuni pacchetti di indirizzi e porte che semplificano il confronto). Ad esempio, per un set "whitelist" i cui elementi sono un allegato, specificando il flag "intervallo" indicherà che il set può includere intervalli nell'allegato (per l'allegato "ipv4_addr . ipv4_addr . inet_service" era in precedenza possibile elencare esatti corrispondenze del formato "192.168.10.35", e ora puoi specificare gruppi di indirizzi "192.68.11.123-80-192.168.10.35"):

    tavolo ip foo {
    imposta la lista bianca {
    digitare indirizzo_ipv4 . indirizzo_ipv4 inet_service
    intervallo di flag
    elementi = { 192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125. 80}
    }

    barra della catena {
    tipo filtro hook prerouting filtro priorità; calo della politica;
    ip saddr. ip papà. tcp dport @whitelist accetta
    }
    }

  • Negli insiemi e negli elenchi di mappe è possibile utilizzare la direttiva “typeof”, che determina il formato dell'elemento durante la corrispondenza.
    Per esempio:

    tavolo ip foo {
    imposta la lista bianca {
    tipo di ip saddr
    elementi = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
    }

    barra della catena {
    tipo filtro hook prerouting filtro priorità; calo della politica;
    ip daddr @whitelist accetta
    }
    }

    tavolo ip foo {
    indirizzo mappa2mark {
    tipo di ip saddr: meta mark
    elementi = { 192.168.10.35 : 0x00000001, 192.168.10.135 : 0x00000002 }
    }
    }

  • Aggiunta la possibilità di utilizzare join nei collegamenti NAT, che consente di specificare un indirizzo e una porta quando si definiscono trasformazioni NAT basate su elenchi di mappe o insiemi denominati:

    nft aggiungi regola ip nat pre dnat ip addr . mappa port to ip saddr { 1.1.1.1 : 2.2.2.2 . trenta}

    nft aggiungi mappa destinazioni ip nat {tipo ipv4_addr. inet_service: ipv4_addr. inet_servizio \\; }
    nft aggiungi regola ip nat pre dnat ip addr . porta su ip saddr. tcp dport mappa @destinazioni

  • Supporto all'accelerazione hardware con alcune operazioni di filtraggio effettuate dalla scheda di rete. L'accelerazione viene abilitata tramite l'utility ethtool (“ethtool -K eth0 hw-tc-offload on”), dopodiché viene attivata in nftables per la catena principale utilizzando il flag “offload”. Quando si utilizza il kernel Linux 5.6, l'accelerazione hardware è supportata per la corrispondenza dei campi di intestazione e l'ispezione dell'interfaccia in entrata in combinazione con la ricezione, lo scarto, la duplicazione (dup) e l'inoltro (fwd) dei pacchetti. Nell'esempio seguente le operazioni di scarto dei pacchetti provenienti dall'indirizzo 192.168.30.20 vengono eseguite a livello di scheda di rete, senza passare i pacchetti al kernel:

    #filecat.nft
    tabella netdev x {
    catena y {
    tipo filtro dispositivo di ingresso hook eth0 priorità 10; scarico dei flag;
    ip saddr 192.168.30.20 drop
    }
    }
    # nft -f file.nft

  • Informazioni migliorate sulla posizione di un errore nelle regole.

    # nft elimina la regola ip yz handle 7
    Errore: impossibile elaborare la regola: file o directory non presenti
    elimina la regola ip yz handle 7
    ^

    # nft elimina la regola ip xx handle 7
    Errore: impossibile elaborare la regola: file o directory non presenti
    elimina la regola ip xx handle 7
    ^

    # nft cancella la tabella twst
    Errore: nessun file o directory di questo tipo; intendevi la tabella "test" nell'ip della famiglia?
    elimina la tabella twist
    ^^^^

    Il primo esempio mostra che la tabella "y" non è nel sistema, il secondo che manca il gestore "7" e il terzo che viene visualizzato un errore di battitura quando si digita il nome della tabella.

  • Aggiunto supporto per il controllo dell'interfaccia slave specificando "meta sdif" o "meta sdifname":

    ... meta nomesdif vrf1 ...

  • Aggiunto supporto per le operazioni di spostamento a destra o a sinistra. Ad esempio, per spostare l'etichetta di un pacchetto esistente a sinistra di 1 bit e impostare il bit minore su 1:

    … meta mark imposta meta mark lshift 1 o 0x1 …

  • Opzione "-V" implementata per visualizzare informazioni estese sulla versione.

    #nft-V
    nftables v0.9.4 (Jive alle cinque)
    cli:readline
    json: sì
    minigmp:no
    libxtables: sì

  • Le opzioni della riga di comando ora devono essere specificate prima dei comandi. Ad esempio, è necessario specificare "nft -a list ruleset" e l'esecuzione di "nft list ruleset -a" genererà un errore.

    Fonte: opennet.ru

Aggiungi un commento