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 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

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