nftables packet filter versione 0.9.1

Dopo un anno di sviluppo presentata rilascio del filtro dei pacchetti nftables 0.9.1, 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.

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.
La logica di filtraggio stessa 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 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 IPsec, che consente la corrispondenza degli indirizzi del tunnel in base al pacchetto, all'ID della richiesta IPsec e al tag SPI (Security Parametro Index). Per esempio,

    ... ipsec nell'ip saddr 192.168.1.0/24
    ... ipsec in spi 1-65536

    È anche possibile verificare se un percorso passa attraverso un tunnel IPsec. Ad esempio, per bloccare il traffico non tramite IPSec:

    … filtro uscita rt ipsec goccia mancante

  • Supporto per IGMP (Internet Group Management Protocol). Ad esempio, puoi utilizzare una regola per ignorare le richieste di appartenenza al gruppo IGMP in arrivo

    nft aggiungi regola netdev foo bar igmp tipo membership-query counter drop

  • Possibilità di utilizzare variabili per definire catene di transizione (salto/goto). Per esempio:

    definire dest = ber
    aggiungi regola ip foo bar salta $dest

  • Supporto per maschere per identificare i sistemi operativi (OS Fingerprint) in base ai 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 salta la mappa dei nomi { "Linux": 0x1,
    "Finestre": 0x2,
    "Mac OS": 0x3,
    "sconosciuto": 0x0 }
    ... osf ttl salta la versione "Linux:4.20"

  • Possibilità di far 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 si può utilizzare la seguente regola:

    tabella arp x {
    catena y {
    tipo filtro hook filtro priorità ingresso; la politica accetta;
    arp saddr ip 192.168.2.1 contatore pacchetti 1 byte 46
    }
    }

  • Supporto per l'inoltro trasparente delle richieste tramite un proxy (tproxy). Ad esempio, per reindirizzare le chiamate dalla porta 80 alla porta proxy 8080:

    tabella ip x {
    catena y {
    tipo filtro hook prerouting priorità -150; la politica accetta;
    tcp dport 80 tproxy su:8080
    }
    }

  • Supporto per la marcatura dei socket con la possibilità di ottenere ulteriormente il set mark tramite setsockopt() in modalità SO_MARK. Per esempio:

    tabella inet x {
    catena y {
    tipo filtro hook prerouting priorità -150; la politica accetta;
    tcp dport 8080 contrassegno impostato presa contrassegno
    }
    }

  • Supporto per specificare i nomi dei testi di priorità per le catene. Per esempio:

    nft aggiungi catena ip x raw { tipo filtro hook prerouting priorità raw; }
    nft aggiungi catena ip x filtro { tipo filtro hook filtro priorità prerouting; }
    nft add chain ip x filter_later { tipo filtro hook prerouting filtro priorità + 10; }

  • Supporto per i tag SELinux (Secmark). Ad esempio, per definire il tag "sshtag" in un contesto SELinux, puoi eseguire:

    nft aggiungi secmark inet filter sshtag "system_u:object_r:ssh_server_packet_t:s0"

    E poi usa questa etichetta nelle regole:

    nft aggiungi regola inet filter input tcp dport 22 meta secmark set “sshtag”

    nft aggiungi mappa inet filter secmapping { type inet_service: secmark; }
    nft aggiungi elemento inet filter secmapping { 22 : "sshtag" }
    nft aggiungi regola filtro inet input meta secmark imposta tcp dport map @secmapping

  • Possibilità di specificare le porte assegnate ai protocolli in forma di testo, come sono definite nel file /etc/services. Per esempio:

    nft aggiungi regola xy tcp dport "ssh"
    set di regole dell'elenco nft -l
    tavolo x {
    catena y {
    ...
    tcp porta "ssh"
    }
    }

  • Possibilità di verificare il tipo di interfaccia di rete. Per esempio:

    aggiungi regola inet raw prerouting meta iifkind "vrf" accetta

  • Supporto migliorato per l'aggiornamento dinamico del contenuto dei set specificando esplicitamente il flag "dinamico". Ad esempio, per aggiornare impostare "s" per aggiungere l'indirizzo di origine e reimpostare la voce se non ci sono pacchetti per 30 secondi:

    aggiungi la tabella x
    aggiungi set xs { digita ipv4_addr; taglia 128; timeout 30s; bandiere dinamiche; }
    aggiungi catena xy { tipo filtro hook priorità ingresso 0; }
    aggiungi regola xy aggiorna @s { ip saddr }

  • Possibilità di impostare una condizione di timeout separata. Ad esempio, per sovrascrivere il timeout predefinito per i pacchetti in arrivo sulla porta 8888, è possibile specificare:

    filtro ip della tabella {
    ct timeout aggressivo-tcp {
    protocollo tcp;
    l3proto ip;
    policy = {stabilito: 100, close_wait: 4, chiudi: 4}
    }
    output a catena {
    ...
    tcp dport 8888 ct timeout impostato "aggressive-tcp"
    }
    }

  • Supporto NAT per la famiglia inet:

    tabella inet nat {
    ...
    ip6 daddr dead::2::1 dnat to dead:2::99
    }

  • Segnalazione errori di battitura migliorata:

    nft aggiungi test del filtro a catena

    Errore: nessun file o directory di questo tipo; intendevi la tabella "filtro" nell'ip della famiglia?
    aggiungere il test del filtro a catena
    ^^^^^^

  • Possibilità di specificare i nomi delle interfacce in set:

    imposta sc {
    digitare inet_service . ifnome
    elementi = { "ssh" . "eth0" }
    }

  • Sintassi aggiornata delle regole della tabella di flusso:

    nft aggiungi tabella x
    nft add flowtable x ft { hook ingresso priorità 0; dispositivi = { eth0, wlan0 }; }
    ...
    nft aggiungi regola x inoltra protocollo IP { tcp, udp } flusso aggiungi @ft

  • Supporto JSON migliorato.

Fonte: opennet.ru

Aggiungi un commento