lansarea filtrului de pachete nftables 0.9.1

După un an de dezvoltare prezentat eliberarea filtrului de pachete nftables 0.9.1, dezvoltându-se ca înlocuitor pentru iptables, ip6table, arptables și ebtables prin unificarea interfețelor de filtrare a pachetelor pentru IPv4, IPv6, ARP și punți de rețea. Pachetul nftables include componente de filtru de pachete care rulează în spațiul utilizatorului, în timp ce munca la nivel de kernel este asigurată de subsistemul nf_tables, care a făcut parte din nucleul Linux încă de la lansarea 3.13.

Nivelul nucleului oferă doar o interfață generică independentă de protocol, care oferă funcții de bază pentru extragerea datelor din pachete, efectuarea operațiunilor de date și controlul fluxului.
Logica de filtrare în sine și handlerele specifice protocolului sunt compilate în bytecode în spațiul utilizatorului, după care acest bytecode este încărcat în nucleu folosind interfața Netlink și executat într-o mașină virtuală specială care amintește de BPF (Berkeley Packet Filters). Această abordare vă permite să reduceți semnificativ dimensiunea codului de filtrare care rulează la nivel de kernel și să mutați toate funcțiile de analiză a regulilor și a logicii pentru lucrul cu protocoale în spațiul utilizatorului.

Principalele inovații:

  • Suport IPsec, permițând potrivirea adreselor de tunel pe baza pachetului, a ID-ului cererii IPsec și a etichetei SPI (Security Parameter Index). De exemplu,

    ... ipsec în ip saddr 192.168.1.0/24
    ... ipsec în spi 1-65536

    De asemenea, este posibil să verificați dacă o rută trece printr-un tunel IPsec. De exemplu, pentru a bloca traficul nu prin IPSec:

    … ieșire filtru rt ipsec picătură lipsă

  • Suport pentru IGMP (Internet Group Management Protocol). De exemplu, puteți folosi o regulă pentru a renunța la solicitările de membru IGMP primite

    nft add regula netdev foo bar tip igmp abonament-interogare drop drop

  • Posibilitatea utilizării variabilelor pentru definirea lanțurilor de tranziție (jump/goto). De exemplu:

    define dest = ber
    add regula ip foo bar jump $dest

  • Suport pentru măști pentru identificarea sistemelor de operare (OS Fingerprint) pe baza valorilor TTL din antet. De exemplu, pentru a marca pachetele pe baza sistemului de operare al expeditorului, puteți utiliza comanda:

    ... meta mark set osf ttl skip name map { "Linux" : 0x1,
    „Windows”: 0x2,
    „MacOS”: 0x3,
    „necunoscut”: 0x0}
    ... osf ttl omite versiunea „Linux:4.20”

  • Abilitatea de a potrivi adresa ARP a expeditorului și adresa IPv4 a sistemului țintă. De exemplu, pentru a crește contorul de pachete ARP trimise de la adresa 192.168.2.1, puteți folosi următoarea regulă:

    table arp x {
    lanț y {
    tip filtru cârlig intrare filtru prioritar; acceptarea politicii;
    arp saddr ip 192.168.2.1 contor pachete 1 octet 46
    }
    }

  • Suport pentru transmiterea transparentă a cererilor printr-un proxy (tproxy). De exemplu, pentru a redirecționa apelurile către portul 80 către portul proxy 8080:

    ip tabel x {
    lanț y {
    tip filtru cârlig prioritate prerouting -150; acceptarea politicii;
    tcp dport 80 tproxy la :8080
    }
    }

  • Suport pentru marcarea soclurilor cu posibilitatea de a obține în continuare marcajul setat prin setsockopt() în modul SO_MARK. De exemplu:

    tabel inet x {
    lanț y {
    tip filtru cârlig prioritate prerouting -150; acceptarea politicii;
    tcp dport 8080 mark set socket mark
    }
    }

  • Suport pentru specificarea numelor de text prioritare pentru lanțuri. De exemplu:

    nft add chain ip x raw { tip filter hook prerouting priority raw; }
    nft add chain ip x filter { type filter hook prerouting priority filter; }
    nft add chain ip x filter_later { tip filter hook prerouting priority filter + 10; }

  • Suport pentru etichetele SELinux (Secmark). De exemplu, pentru a defini eticheta „sshtag” într-un context SELinux, puteți rula:

    nft adăugați filtru secmark inet sshtag „system_u:object_r:ssh_server_packet_t:s0”

    Și apoi folosiți această etichetă în reguli:

    nft adăugare regulă inet filter input tcp dport 22 meta secmark set „sshtag”

    nft add map inet filter secmapping { type inet_service : secmark; }
    nft adăugați element inet filter secmapping { 22: "sshtag" }
    nft adăuga regulă inet filter input meta secmark set tcp dport map @secmapping

  • Abilitatea de a specifica porturile alocate protocoalelor sub formă de text, așa cum sunt definite în fișierul /etc/services. De exemplu:

    nft adăugați regula x y tcp dport „ssh”
    set de reguli lista nft -l
    masa x {
    lanț y {
    ...
    tcp dport "ssh"
    }
    }

  • Abilitatea de a verifica tipul de interfață de rețea. De exemplu:

    adăugați regula inet raw prerouting meta iifkind "vrf" accept

  • Suport îmbunătățit pentru actualizarea dinamică a conținutului seturilor prin specificarea explicită a semnalizatorului „dinamic”. De exemplu, pentru a actualiza setul „s” pentru a adăuga adresa sursă și pentru a reseta intrarea dacă nu există pachete timp de 30 de secunde:

    adăugați tabelul x
    add set x s { tip ipv4_addr; marimea 128; timeout 30s; steaguri dinamice; }
    add chain x y { tip filter hook priority input 0; }
    adăugați regula x y actualizați @s { ip saddr }

  • Posibilitatea de a seta o condiție de timeout separată. De exemplu, pentru a anula timpul de expirare implicit pentru pachetele care sosesc pe portul 8888, puteți specifica:

    filtru ip tabel {
    ct timeout agresiv-tcp {
    protocol tcp;
    l3proto ip;
    politică = {stabilite: 100, close_wait: 4, close: 4}
    }
    ieșire în lanț {
    ...
    tcp dport 8888 ct timeout set "agresiv-tcp"
    }
    }

  • Suport NAT pentru familia inet:

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

  • Raportare îmbunătățită a erorilor de scriere:

    nft adăugați testul filtrului de lanț

    Eroare: Nu există un astfel de fișier sau director; ai vrut să spui tabelul „filtru” în ip de familie?
    adăugați testul filtrului cu lanț
    ^^^^^^

  • Posibilitatea de a specifica numele interfeței în seturi:

    set sc {
    tastați inet_service . ifname
    elemente = { "ssh" . "eth0" }
    }

  • Sintaxă actualizată a regulilor flowtable:

    nft adaugă tabelul x
    nft add flowtable x ft { hook ingress priority 0; dispozitive = { eth0, wlan0 }; }
    ...
    nft add rule x forward ip protocol { tcp, udp } flow add @ft

  • Suport JSON îmbunătățit.

Sursa: opennet.ru

Adauga un comentariu