lansarea filtrului de pachete nftables 0.9.4

publicat eliberarea filtrului de pachete nftables 0.9.4, 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. Modificările necesare pentru ca lansarea nftables 0.9.4 să funcționeze sunt incluse în viitoarea ramură a nucleului Linux 5.6.

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. Regulile de filtrare ș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 în kernel î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 pentru intervale în conexiuni (concatenare, anumite pachete de adrese și porturi care simplifică compararea). De exemplu, pentru un set „listă albă” ale cărui elemente sunt un atașament, specificarea indicatorului „interval” va indica faptul că setul poate include intervale în atașament (pentru atașamentul „ipv4_addr . ipv4_addr . inet_service” anterior era posibil să se listeze exacte se potrivesc cu forma „192.168.10.35. 192.68.11.123”, iar acum se pot specifica grupuri de adrese „80-192.168.10.35-192.168.10.40-192.68.11.123.

    table ip foo {
    setează lista albă {
    tastați ipv4_addr . adresa_ipv4. inet_service
    interval de steaguri
    elemente = { 192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125. 80}
    }

    bară de lanț {
    tip filter hook prerouting priority filter; scăderea politicii;
    ip saddr. ip daddr. tcp dport @whitelist accept
    }
    }

  • În seturi și liste de hărți, este posibil să se utilizeze directiva „typeof”, care determină formatul elementului la potrivire.
    De exemplu:

    table ip foo {
    setează lista albă {
    tip de ip saddr
    elemente = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
    }

    bară de lanț {
    tip filter hook prerouting priority filter; scăderea politicii;
    ip daddr @whitelist accept
    }
    }

    table ip foo {
    hartă addr2mark {
    tip de ip saddr: meta mark
    elemente = { 192.168.10.35 : 0x00000001, 192.168.10.135 : 0x00000002 }
    }
    }

  • S-a adăugat posibilitatea de a utiliza îmbinări în legăturile NAT, care vă permite să specificați o adresă și un port atunci când definiți transformări NAT bazate pe liste de hărți sau seturi denumite:

    nft add rule ip nat pre dnat ip addr . hartă port la ip saddr { 1.1.1.1 : 2.2.2.2 . treizeci}

    nft add map ip nat destinations { type ipv4_addr . inet_service: ipv4_addr. inet_service \\; }
    nft add rule ip nat pre dnat ip addr . port la ip saddr. tcp dport map @destinations

  • Suport pentru accelerarea hardware cu unele operațiuni de filtrare efectuate de placa de rețea. Accelerația este activată prin utilitarul ethtool („ethtool -K eth0 hw-tc-offload on”), după care este activată în nftables pentru lanțul principal folosind steag-ul „descărcare”. Când se utilizează nucleul Linux 5.6, accelerarea hardware este acceptată pentru potrivirea câmpului antet și inspecția interfeței de intrare în combinație cu primirea, eliminarea, duplicarea (dup) și redirecționarea (fwd) pachetelor. În exemplul de mai jos, operațiunile de eliminare a pachetelor care provin de la adresa 192.168.30.20 sunt efectuate la nivelul plăcii de rețea, fără a trece pachetele către kernel:

    # cat file.nft
    table netdev x {
    lanț y {
    tip filtru cârlig dispozitiv de intrare eth0 prioritate 10; descărcare steaguri;
    ip saddr 192.168.30.20 drop
    }
    }
    # nft -f fișier.nft

  • Informații îmbunătățite despre locația unei erori în reguli.

    # nft șterge regula ip yz handle 7
    Eroare: Nu s-a putut procesa regula: Nu există un astfel de fișier sau director
    ștergeți regula ip yz handle 7
    ^

    # nft șterge regula ip xx handle 7
    Eroare: Nu s-a putut procesa regula: Nu există un astfel de fișier sau director
    ștergeți regula ip xx handle 7
    ^

    # nft șterge tabelul twst
    Eroare: Nu există un astfel de fișier sau director; ai vrut să spui tabelul „test” în ip de familie?
    ștergeți tabelul twst
    ^^^^

    Primul exemplu arată că tabelul „y” nu este în sistem, al doilea că handlerul „7” lipsește, iar al treilea că este afișat un prompt de greșeală la introducerea numelui tabelului.

  • S-a adăugat suport pentru verificarea interfeței slave prin specificarea „meta sdif” sau „meta sdifname”:

    ... meta sdifname vrf1 ...

  • S-a adăugat suport pentru operațiunile de schimbare la dreapta sau la stânga. De exemplu, pentru a muta o etichetă de pachet existent la stânga cu 1 bit și pentru a seta bitul minor la 1:

    … meta marca set meta mark lshift 1 sau 0x1 …

  • Opțiunea „-V” implementată pentru a afișa informații despre versiunea extinsă.

    # nft -V
    nftables v0.9.4 (Jive at Five)
    cli:readline
    json: da
    minigmp: nu
    libxtables: da

  • Opțiunile liniei de comandă trebuie acum specificate înaintea comenzilor. De exemplu, trebuie să specificați „nft -a list ruleset”, iar rularea „nft list ruleset -a” va avea ca rezultat o eroare.

    Sursa: opennet.ru

Adauga un comentariu