Vydání balíkového filtru nftables 1.0.3

Byl zveřejněn vydání filtrovacího balíku nftables 1.0.3, který unifikuje rozhraní pro filtrování paketů pro IPv4, IPv6, ARP a síťové mosty (s cílem nahradit iptables, ip6tables, arptables a ebtables). Nezbytné změny pro fungování vydání nftables 1.0.3 jsou zahrnuty v jádru Linux 5.18.

Balíček nftables obsahuje prvky filtrování paketů pracující v uživatelském prostoru, zatímco na úrovni jádra zajišťuje provoz subsystém nf_tables, který je součástí jádra Linux od verze 3.13. Na úrovni jádra je poskytováno pouze obecné rozhraní, které nezávisí na konkrétním protokolu a poskytuje základní funkce pro extrakci dat z paketů, provádění operací s daty a řízení toku.

Samotná pravidla filtrování a specifické zpracovatele protokolů se kompilují do bytecode v uživatelském prostoru, poté je tento bytecode načten do jádra pomocí rozhraní Netlink a vykonává se v jádře v specializované virtuálním strojipodobě jako BPF (Berkeley Packet Filters). Tento přístup výrazně snižuje velikost kódu filtrování, který funguje na úrovni jádra a přesouvá všechny funkce analýzy pravidel a logiky práce s protokoly do uživatelského prostoru.

Hlavní novinky:

  • V set-seznamech byla přidána podpora pro přiřazování názvů síťových rozhraní podle masky, například zadané pomocí symbolu „*“: table inet testifsets { set simple_wild { type ifname flags interval elements = { „abcdef*“, „othername“, „ppp0“ } } chain v4icmp { type filter hook input priority 0; policy accept; iifname @simple_wild counter packets 0 bytes 0 iifname { „abcdef*“, „eth0“ } counter packets 0 bytes 0 } }
  • Bylo implementováno automatické slučování překrývajících se prvků set-seznamu za běhu. Dříve se při nastavování volby „auto-merge“ slučování provádělo při deklaraci pravidel, nyní se spouští také při inkrementálním přidávání nových prvků během běhu. Například při deklaraci bude seznam set y { flags interval auto-merge elements = { 1.2.3.0, 1.2.3.255, 1.2.3.0/24, 3.3.3.3, 4.4.4.4, 4.4.4.4-4.4.4.8, 3.3.3.4, 3.3.3.5 } } převeden na elements = { 1.2.3.0/24, 3.3.3.3-3.3.3.5, 4.4.4.4-4.4.4.8 } a pokud přidáte nové prvky # nft add element ip x y { 1.2.3.0-1.2.4.255, 3.3.3.6 } bude vypadat jako elements = { 1.2.3.0-1.2.4.255, 3.3.3.3-3.3.3.6, 4.4.4.4-4.4.4.8 }

    Při odstraňování jednotlivých prvků ze seznamu, které spadají do existujících prvků s rozsahy, se rozsah zkracuje nebo dělí.

  • Do optimalizátoru pravidel, který se vyvolává při uvedení volby „-o/—optimize“, byla přidána podpora pro slučování několika pravidel pro překládání adres (NAT) do map-seznamu. Například pro sadu # cat ruleset.nft table ip x { chain y { type nat hook postrouting priority srcnat; policy drop; ip saddr 1.1.1.1 tcp dport 8000 snat to 4.4.4.4:80 ip saddr 2.2.2.2 tcp dport 8001 snat to 5.5.5.5:90 } }

    provádění „nft -o -c -f ruleset.nft“ povede k převodu jednotlivých pravidel „ip saddr“ do map-seznamu: snat to ip saddr . tcp dport map { 1.1.1.1 . 8000 : 4.4.4.4 . 80, 2.2.2.2 . 8001 : 5.5.5.5 . 90 }

    Podobně mohou být raw výrazy převedeny na mapy: # cat ruleset.nft table ip x { […] chain nat_dns_acme { udp length 47-63 @th,160,128 0x0e373135363130333131303735353203 goto nat_dns_dnstc udp length 62-78 @th,160,128 0x0e31393032383939353831343037320e goto nat_dns_this_5301 udp length 62-78 @th,160,128 0x0e31363436323733373931323934300e goto nat_dns_saturn_5301 udp length 62-78 @th,160,128 0x0e32393535373539353636383732310e goto nat_dns_saturn_5302 udp length 62-78 @th,160,128 0x0e38353439353637323038363633390e goto nat_dns_saturn_5303 drop } }

    Po optimalizaci získáme mapu: udp length . @th,160,128 vmap { 47-63 . 0x0e373135363130333131303735353203 : goto nat_dns_dnstc, 62-78 . 0x0e31393032383939353831343037320e : goto nat_dns_this_5301, 62-78 . 0x0e31363436323733373931323934300e : goto nat_dns_saturn_5301, 62-78 . 0x0e32393535373539353636383732310e : goto nat_dns_saturn_5302, 62-78 . 0x0e38353439353637323038363633390e : goto nat_dns_saturn_5303 }

  • Použití raw výrazů je povoleno v operacích spojování. Například: # nft add rule x y ip saddr . @ih,32,32 { 1.1.1.1 . 0x14, 2.2.2.2 . 0x1e } nebo table x { set y { typeof ip saddr . @ih,32,32 elements = { 1.1.1.1 . 0x14 } } }
  • Byla přidána podpora pro uvedení celých čísel v hlavičkových polích v operacích spojování: table inet t { map m1 { typeof udp length . @ih,32,32 : verdict flags interval elements = { 20-80 . 0x14 : accept, 1-10 . 0xa : drop } } chain c { type filter hook input priority 0; policy drop; udp length . @ih,32,32 vmap @m1 } }
  • Byla přidána podpora pro resetování TCP možností (funguje pouze na jádře Linux 5.18+): tcp flags syn reset tcp option sack-perm
  • Bylo zrychleno provádění příkazů pro výpis řetězců („nft list chain x y“).

Zdroj: opennet.ru

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster