Megjelent az nftables 1.0.3 verziója, amely egységesíti a csomagszűrési interfészeket IPv4, IPv6, ARP és hálózati hidak számára (célja az iptables, ip6tables, arptables és ebtables helyettesítése). Az nftables 1.0.3 működéséhez szükséges változtatások a Linux 5.18 kernel részét képezik.
Az nftables csomagba tartoznak a felhasználói térben működő csomagszűrő komponensek, míg a kernel szintjén az nf_tables alrendszer látja el a feladatot, amely a Linux kernel 3.13-as verziójától kezdve érhető el. A kernel szintjén csak egy általános interfész áll rendelkezésre, amely független a konkrét protokolltól, és alapvető funkciókat biztosít a csomagokból származó adatok kinyerésére, az adatokkal végzett műveletekre és az adatfolyam kezelésére.
Közvetlenül a szűrési szabályok és a protokollspecifikus kezelők felhasználói térben bájt kódba vannak fordítva, majd ezt a bájt kódot a Netlink interfész segítségével betöltik a kernelbe, ahol speciális környezetben végrehajtásra kerül. virtuális gépben, amely a BPF (Berkeley Packet Filters) eljárásra emlékeztet. Ez a megközelítés jelentősen csökkenti a kernel szinten működő szűrési kód méretét, miközben az összes szabályok parszolásával és a protokollokkal kapcsolatos logikával kapcsolatos funkciót a felhasználói térbe helyezi.
Főbb újítások:
- A set-listákban megjelent a hálózati interfészek nevének maszk alapján történő összehasonlításának támogatása, például a „*” szimbólummal megadva: 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 } }
- Megvalósult az átfedő elemek automatikus egyesítése a set-listában működés közben. Korábban az «auto-merge» opció beállításakor az egyesítés a szabályok deklarálásakor történt, most azonban az új elemek fokozatos hozzáadásánál is működik. Például a deklarációs szakaszban 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 } } átalakul elements = { 1.2.3.0/24, 3.3.3.3-3.3.3.5, 4.4.4.4-4.4.4.8 } majd ha új elemeket adunk hozzá # nft add element ip x y { 1.2.3.0-1.2.4.255, 3.3.3.6 } akkor így fog kinézni 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 }
Ha a listából egyes elemeket eltávolítanak, amelyek meglévő, tartományban lévő elemek közé kerülnek, a tartomány csökken vagy szétválik.
- Az optimalizáló, amelyet az «-o/—optimize» opció megadásakor hívnak meg, támogatja több NAT szabály egyesítését a map-listába. Például a készlet # 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 } }
A végrehajtás «nft -o -c -f ruleset.nft» átalakítja az elkülönült «ip saddr» szabályokat map-listává: 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 }
Hasonlóképpen a raw-kifejezések is átformálhatók map-listákká: # 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 } }
Az optimalizálás után map-listát kapunk: 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 }
- Engedélyezett a raw-kifejezések használata konkatenálási műveletekben. Például: # nft add rule x y ip saddr . @ih,32,32 { 1.1.1.1 . 0x14, 2.2.2.2 . 0x1e } vagy table x { set y { typeof ip saddr . @ih,32,32 elements = { 1.1.1.1 . 0x14 } } }
- Hozzáadva a támogatás a teljes számú fejlécek megadásához a konkatenációs műveletekben: 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 } }
- Hozzáadva a TCP-opciók visszaállításának támogatása (csak Linux 5.18+ kernel esetén működik): tcp flags syn reset tcp option sack-perm
- Felgyorsítva a láncok listázására szolgáló parancsok végrehajtása („nft list chain x y”).
Forrás: opennet.ru
