Uscita del filtro a pacchetto nftables 0.9.1

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

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster