nftables packet filter versione 0.9.5

pubblicato rilascio del filtro dei pacchetti nftables 0.9.5, 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 richieste per il funzionamento della versione 0.9.5 di nftables sono incluse nel kernel Linux 5.7.

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:

  • Ai set è stato aggiunto il supporto per i contatori di pacchetti e traffico associati agli elementi del set. I contatori vengono abilitati utilizzando la parola chiave “counter”:

    tabella ip x {
    imposta y {
    tipo di ip saddr
    contrastare
    elementi = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
    }

    catena z {
    tipo filtro hook filtro priorità uscita; la politica accetta;
    ip papà @y
    }
    }

  • Per impostare i valori iniziali dei contatori, ad esempio per ripristinare i contatori precedenti dopo un riavvio, è possibile utilizzare il comando “nft -f”:

    # set di regole del gatto.nft
    tabella ip x {
    imposta y {
    tipo di ip saddr
    contrastare
    elementi = { 192.168.10.35 contatore pacchetti 1 byte 84, 192.168.10.101 \
    contatore p 192.168.10.135 contatore pacchetti 0 byte 0 }
    }

    catena z {
    tipo filtro hook filtro priorità uscita; la politica accetta;
    ip papà @y
    }
    }
    # nft -f set di regole.nft
    Set di regole dell'elenco #nft
    tabella ip x {
    imposta y {
    tipo di ip saddr
    contrastare
    elementi = { 192.168.10.35 contatore pacchetti 1 byte 84, 192.168.10.101 \
    contatore p 192.168.10.135 contatore pacchetti 0 byte 0 }
    }

    catena z {
    tipo filtro hook filtro priorità uscita; la politica accetta;
    ip papà @y
    }
    }

  • È stato aggiunto anche il controsupporto alla flowtable:

    tavolo ip foo {
    barra della portata {
    priorità di ingresso del hook -100
    dispositivi = { eth0, eth1 }
    contrastare
    }

    catena in avanti {
    digitare il filtro agganciare il filtro di priorità in avanti;
    flusso aggiungi bancone @bar
    }
    }

    Puoi visualizzare l'elenco dei contatori utilizzando il comando “conntrack -L”:

    tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47278 dport=5201 pacchetti=9 byte=608 \
    src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47278 pacchetti=8 byte=428 [OFFLOAD] mark=0 \
    secctx=null use=2 tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47280 dport=5201 \
    pacchetti=1005763 byte=44075714753 src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47280 \
    pacchetti=967505 byte=50310268 [OFFLOAD] mark=0 secctx=null use=2

  • Negli insiemi per la concatenazione (concatenazione, alcuni bundle di indirizzi e porte che semplificano il confronto), è possibile utilizzare la direttiva "typeof", che determina il tipo di dati degli elementi per le parti costitutive degli elementi dell'insieme:

    tavolo ip foo {
    imposta la lista bianca {
    tipo di ip saddr. porta tcp
    elementi = { 192.168.10.35 . 80, 192.168.10.101. 80}
    }

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

  • La direttiva typeof ora si applica anche ai join negli elenchi di mappe:

    tavolo ip foo {
    indirizzo mappa2mark {
    tipo di ip saddr. tcp dport: metamark
    elementi = { 192.168.10.35 . 80: 0x00000001,
    192.168.10.135. 80 : 0x00000002 }
    }

    barra della catena {
    tipo filtro hook prerouting filtro priorità; calo della politica;
    meta mark imposta ip daddr . tcp dport map @addr2mark accetta
    }
    }

  • Aggiunto supporto per range join in set anonimi (senza nome):

    # nft aggiungi regola inet filter input ip daddr . porta tcp\
    { 10.0.0.0/8 . 10-23, 192.168.1.1-192.168.3.8. 80-443 } accetta

  • Viene fornita la possibilità di scartare i pacchetti con flag 802.1q (VLAN) durante l'elaborazione dei bridge di rete:

    # nft aggiunge rule bridge foo bar tipo ether rifiuto vlan con reset tcp

  • Aggiunto supporto per la corrispondenza tramite identificatore di sessione TCP (conntrack ID). Per determinare l'ID conntrack, puoi utilizzare l'opzione "--output id":

    # conntrack -L —id output
    udp 17 18 src=192.168.2.118 dst=192.168.2.1 sport=36424 dport=53 pacchetti=2 \
    byte=122 src=192.168.2.1 dst=192.168.2.118 sport=53 dport=36424 pacchetti=2 byte=320 \
    [ASSICURATO] mark=0 use=1 id=2779986232

    # nft aggiungi regola foo bar ct id 2779986232 contatore

Fonte: opennet.ru

Aggiungi un commento