ΠΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ Π²ΡΠΏΡΡΠΊ ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠ»ΡΡΡΠ° nftables 1.0.3, ΡΠ½ΠΈΡΠΈΡΠΈΡΡΡΡΠ΅Π³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Π΄Π»Ρ IPv4, IPv6, ARP ΠΈ ΡΠ΅ΡΠ΅Π²ΡΡ ΠΌΠΎΡΡΠΎΠ² (Π½Π°ΡΠ΅Π»Π΅Π½ Π½Π° Π·Π°ΠΌΠ΅Π½Ρ iptables, ip6table, arptables ΠΈ ebtables). ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Π²ΡΠΏΡΡΠΊΠ° nftables 1.0.3 ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²ΠΊΠ»ΡΡΠ΅Π½Ρ Π² ΡΠΎΡΡΠ°Π² ΡΠ΄ΡΠ° Linux 5.18.
Paket nftables kalebu komponen filter paket sing mlaku ing ruang pangguna, dene karya tingkat kernel diwenehake dening subsistem nf_tables, sing wis dadi bagian saka kernel Linux wiwit dirilis 3.13. Tingkat kernel mung nyedhiyakake antarmuka bebas protokol umum sing nyedhiyakake fungsi dhasar kanggo ngekstrak data saka paket, nindakake operasi data, lan kontrol aliran.
Aturan nyaring dhewe lan panangan khusus protokol dikompilasi menyang bytecode spasi pangguna, sawise bytecode iki dimuat menyang kernel nggunakake antarmuka Netlink lan dieksekusi ing kernel ing mesin virtual khusus sing meh padha karo BPF (Berkeley Packet Filters). Pendekatan iki ndadekake bisa nyuda ukuran kode nyaring sing mlaku ing tingkat kernel lan mindhah kabeh fungsi aturan parsing lan logika nggarap protokol menyang ruang pangguna.
Inovasi utama:
- Π set-ΡΠΏΠΈΡΠΊΠ°Ρ ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈΠΌΡΠ½ ΡΠ΅ΡΠ΅Π²ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² ΠΏΠΎ ΠΌΠ°ΡΠΊΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΈΠΌΠ²ΠΎΠ»Π° Β«*Β»: 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 } }
- Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΠ°ΡΡΠΈΡ
ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² set-ΡΠΏΠΈΡΠΊΠ° Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ. Π Π°Π½Π΅Π΅ ΠΏΡΠΈ Π²ΡΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ ΠΎΠΏΡΠΈΠΈ Β«auto-mergeΒ» ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠ»ΠΎΡΡ Π½Π° ΡΡΠ°Π΄ΠΈΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΏΡΠ°Π²ΠΈΠ», Π° ΡΠ΅ΠΏΠ΅ΡΡ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΈ ΠΏΡΠΈ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΡΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ°Π±ΠΎΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΡΠΏΠΈΡΠΎΠΊ 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 } } Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅Π²ΡΠ°ΡΡΠ½ Π² elements = { 1.2.3.0/24, 3.3.3.3-3.3.3.5, 4.4.4.4-4.4.4.8 } Π° Π·Π°ΡΠ΅ΠΌ Π΅ΡΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ # nft add element ip x y { 1.2.3.0-1.2.4.255, 3.3.3.6 } ΠΏΡΠΈΠΌΠ΅Ρ Π²ΠΈΠ΄ 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 }
ΠΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΏΠΎΠΏΠ°Π΄Π°ΡΡΠΈΡ Π² ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Ρ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°ΠΌΠΈ, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΡΠΎΠΊΡΠ°ΡΠ°Π΅ΡΡΡ ΠΈΠ»ΠΈ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΡΡΡ.
- Π ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΎΡ ΠΏΡΠ°Π²ΠΈΠ», Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΠΉ ΠΏΡΠΈ ΡΠΊΠ°Π·Π°Π½ΠΈΠΈ ΠΎΠΏΡΠΈΠΈ Β«-o/βoptimizeΒ», Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΠΏΡΠ°Π²ΠΈΠ» ΡΡΠ°Π½ΡΠ»ΡΡΠΈΠΈ Π°Π΄ΡΠ΅ΡΠΎΠ² (NAT) Π² map-ΡΠΏΠΈΡΠΎΠΊ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ Π½Π°Π±ΠΎΡΠ° # 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 } }
Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Β«nft -o -c -f ruleset.nftΒ» ΠΏΡΠΈΠ²Π΅Π΄ΡΡ ΠΊ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π·Π΄Π΅Π»ΡΠ½ΡΡ ΠΏΡΠ°Π²ΠΈΠ» Β«ip saddrΒ» Π² map-ΡΠΏΠΈΡΠΎΠΊ: 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 }
ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π² map-ΡΠΏΠΈΡΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²ΡΠ²Π°ΡΡΡΡ ΠΈ raw-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ: # 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 } }
ΠΏΠΎΡΠ»Π΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΡΠΈΠΌ map-cΠΏΠΈΡΠΎΠΊ: 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 }
- Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ raw-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡ ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½Π°ΡΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ: # nft add rule x y ip saddr . @ih,32,32 { 1.1.1.1 . 0x14, 2.2.2.2 . 0x1e } ΠΈΠ»ΠΈ table x { set y { typeof ip saddr . @ih,32,32 elements = { 1.1.1.1 . 0x14 } } }
- ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΠΏΠΎΠ»Π΅ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡ ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½Π°ΡΠΈΠΈ: 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 } }
- ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ±ΡΠΎΡΠ° TCP-ΠΎΠΏΡΠΈΠΉ (ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ ΡΠ΄ΡΠ° Linux 5.18+): tcp flags syn reset tcp option sack-perm
- Π£ΡΠΊΠΎΡΠ΅Π½ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ Π²ΡΠ²ΠΎΠ΄Π° ΡΠ΅ΠΏΠΎΡΠ΅ΠΊ (Β«nft list chain x yΒ»).
Source: opennet.ru