เบเบฒเบ™เบ›เปˆเบญเบเบ•เบปเบงเบเบญเบ‡ packet nftables 1.0.0 เป„เบ”เป‰เบ–เบทเบเบˆเบฑเบ”เบžเบตเบกเบกเบฒ, unifying packet filtering interfaces เบชเปเบฒเบฅเบฑเบš IPv4, IPv6, ARP เปเบฅเบฐเบ‚เบปเบงเป€เบ„เบทเบญเบ‚เปˆเบฒเบ (เบกเบตเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เป€เบžเบทเปˆเบญเบ—เบปเบ”เปเบ—เบ™ iptables, ip6table, arptables เปเบฅเบฐ ebtables). เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เปˆเบญเบ nftables 1.0.0 เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเปเบกเปˆเบ™เบฅเบงเบกเบขเบนเปˆเปƒเบ™ Linux 5.13 kernel. เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เปƒเบ™เบˆเปเบฒเบ™เบงเบ™เบฎเบธเปˆเบ™เบšเปเปˆเป„เบ”เป‰เบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เปƒเบ”เป†, เปเบ•เปˆเบžเบฝเบ‡เปเบ•เปˆเป€เบ›เบฑเบ™เบœเบปเบ™เบกเบฒเบˆเบฒเบเบเบฒเบ™เบชเบทเบšเบ•เปเปˆเบ—เบตเปˆเบชเบญเบ”เบ„เปˆเบญเบ‡เบ‚เบญเบ‡เบ•เบปเบงเป€เบฅเบเปƒเบ™เบซเบกเบฒเบเป€เบฅเบเบ—เบปเบ”เบชเบฐเบ™เบดเบเบปเบก (เบเบฒเบ™เบ›เปˆเบญเบเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเปเบกเปˆเบ™ 0.9.9).

เบŠเบธเบ” nftables เบ›เบฐเบเบญเบšเบกเบตเบญเบปเบ‡เบ›เบฐเบเบญเบšเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบขเบนเปˆเปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปƒเบ™เบฅเบฐเบ”เบฑเบš kernel เปเบกเปˆเบ™เบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เป‚เบ”เบเบฅเบฐเบšเบปเบšเบเปˆเบญเบ nf_tables, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡ Linux kernel เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบเบฒเบ™เบ›เปˆเบญเบ 3.13. เบฅเบฐเบ”เบฑเบš kernel เบชเบฐเบซเบ™เบญเบ‡เบžเบฝเบ‡เปเบ•เปˆเบชเปˆเบงเบ™เบ•เบดเบ”เบ•เปเปˆเปเบšเบšเป€เบญเบเบฐเบฅเบฒเบ”เบ‚เบญเบ‡เป‚เบ›เป‚เบ•เบ„เบญเบ™เบ—เบปเปˆเบงเป„เบ›เบ—เบตเปˆเบชเบฐเบซเบ™เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบžเบทเป‰เบ™เบ–เบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบฐเบเบฑเบ”เบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเปเบžเบฑเบเป€เบเบฑเบ”, เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เปเบฅเบฐเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เป„เบซเบผ.

เบเบปเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เปเบฅเบฐเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบชเบฐเป€เบžเบฒเบฐเบ‚เบญเบ‡เป‚เบ›เป‚เบ•เบ„เบญเบ™เป„เบ”เป‰เบ–เบทเบเบฅเบงเบšเบฅเบงเบกเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ bytecode เปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ bytecode เบ™เบตเป‰เบ–เบทเบเป‚เบซเบฅเบ”เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ kernel เป‚เบ”เบเปƒเบŠเป‰เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš Netlink เปเบฅเบฐเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™ kernel เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡ virtual เบžเบดเป€เบชเบ”เบ—เบตเปˆเบฅเบฐเบ™เบถเบเป€เบ–เบดเบ‡ BPF (Berkeley Packet Filters). เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบซเบผเบธเบ”เบฅเบปเบ‡เบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบฅเบฐเบ”เบฑเบšเปเบเปˆเบ™เปเบฅเบฐเบเป‰เบฒเบเบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบเบปเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™เปเบเบเปเบฅเบฐเป€เบซเบ”เบœเบปเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเป‚เบ›เป‚เบ•เบ„เบญเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰.

เบ™เบฐเบงเบฑเบ”เบ•เบฐเบเปเบฒเบ•เบปเป‰เบ™เบ•เป:

  • เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ "*" เบญเบปเบ‡เบ›เบฐเบเบญเบšเบซเบ™เป‰เบฒเบเบฒเบเป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™เบฅเบฒเบเบเบฒเบ™เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰, เป€เบŠเบดเปˆเบ‡เบ–เบทเบเบเบฐเบ•เบธเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบŠเบธเบ”เปƒเบ”เป†เบ—เบตเปˆเบšเปเปˆเบ•เบปเบเบขเบนเปˆเบžเบฒเบเปƒเบ•เป‰เบญเบปเบ‡เบ›เบฐเบเบญเบšเบญเบทเปˆเบ™เป†เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เปƒเบ™เบŠเบธเบ”. เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ x { map blocklist { type ipv4_addr : verdict flags interval elements = { 192.168.0.0/16 : accept, 10.0.0.0/8 : accept, * : drop } } chain y { type filter hook prerouting priority 0; เบ™เบฐเป‚เบเบšเบฒเบเบเบญเบกเบฎเบฑเบš; ip saddr vmap @blocklist } }
  • เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบเปเบฒเบ™เบปเบ”เบ•เบปเบงเปเบ›เบˆเบฒเบเป€เบชเบฑเป‰เบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเป€เบฅเบทเบญเบ "--define". # cat test.nft เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ netdev x { chain y { type filter hook ingress devices = $dev priority 0; เบ™เบฐเป‚เบเบšเบฒเบเบซเบผเบธเบ”เบฅเบปเบ‡; } } # nft โ€”define dev="{ eth0, eth1 }" -f test.nft
  • เปƒเบ™เบฅเบฒเบเบเบฒเบ™เปเบœเบ™เบ—เบตเปˆ, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเบ„เบปเบ‡เบ—เบตเปˆ (เบชเบฐเบ–เบฒเบ™เบฐ) เปเบกเปˆเบ™เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰: เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ inet filter { map portmap { type inet_service : verdict counter elements = { 22 counter packets 0 bytes 0 : jump ssh_input, * counter packets 0 bytes 0 : drop } } chain ssh_input { } chain wan_input { tcp dport vmap @portmap } chain prerouting { type filter hook prerouting priority raw; เบ™เบฐเป‚เบเบšเบฒเบเบเบญเบกเบฎเบฑเบš; iif vmap { "lo" : jump wan_input } } }
  • เป€เบžเบตเปˆเบกเบ„เบณเบชเบฑเปˆเบ‡ "list hooks" เป€เบžเบทเปˆเบญเบชเบฐเปเบ”เบ‡เบฅเบฒเบเบŠเบทเปˆเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบชเบณเบฅเบฑเบšเบ„เบญเบšเบ„เบปเบงเปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเปƒเบซเป‰เป„เบงเป‰: # nft list hooks ip เบญเบธเบ›เบฐเบเบญเบ™ eth0 family ip { hook ingress { +0000000010 chain netdev xy [nf_tables] +0000000300 chain inet mw [nf_tables] } hook ingress { -0000000100 chain ip ab [nf_tables] +0000000300 chain inet mz [nf_tables] } hook forward { -0000000225 selinux_ipv4_forward 0000000000 chain ip ac [nf_tables 0000000225] 4_output } hook postrouting { +0000000225 4 selinux_ipvXNUMX_postroute } }
  • เบ•เบฑเบ™เบ„เบดเบงเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เปƒเบŠเป‰ jhash, symhash, เปเบฅเบฐ numgen เบฎเปˆเบงเบกเบเบฑเบ™เป€เบžเบทเปˆเบญเปเบˆเบเบขเบฒเบเปเบžเบฑเบเป€เบเบฑเบ”เป„เบ›เบซเบฒเบ„เบดเบงเปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰. โ€ฆ เบ„เบดเบงเป€เบžเบทเปˆเบญ symhash mod 65536 โ€ฆ เบ„เบดเบงเบ—เบธเบ‡เบ‚เป‰เบฒเบกเป„เบ›เบซเบฒ numgen inc mod 65536 โ€ฆ เบ„เบดเบงเป„เบ›เบซเบฒ jhash oif . meta mark mod 32 "queue" เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ–เบทเบเบฅเบงเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบšเบฅเบฒเบเบเบฒเบ™เปเบœเบ™เบ—เบตเปˆเป€เบžเบทเปˆเบญเป€เบฅเบทเบญเบเปเบ–เบงเปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบ›เบธเปˆเบกเบ—เบตเปˆเบกเบฑเบ. ... เบ—เบธเบ‡เปเบ–เบงเบ‚เป‰เบฒเบกเป„เบ›เบซเบฒเปเบœเบ™เบ—เบตเปˆ oifname { "eth0" : 0, "ppp0" : 2, "eth1" : 2 }
  • เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบ‚เบฐเบซเบเบฒเบเบ•เบปเบงเปเบ›เบ—เบตเปˆเบ›เบฐเบเบญเบšเบกเบตเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เปเบœเบ™เบ—เบตเปˆเบซเบผเบฒเบ. เบเปเบฒเบ™เบปเบ”เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš = { eth0, eth1 } เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ ip x { chain y { type filter hook input priority 0; เบ™เบฐเป‚เบเบšเบฒเบเบเบญเบกเบฎเบฑเบš; iifname vmap { lo : accept, $interfaces : drop } } } # nft -f x.nft # nft list ruleset table ip x { chain y { type filter hook input priority 0; เบ™เบฐเป‚เบเบšเบฒเบเบเบญเบกเบฎเบฑเบš; iifname vmap { "lo" : เบเบญเบกเบฎเบฑเบš, "eth0" : drop, "eth1" : drop } } }
  • เบเบฒเบ™เบชเบปเบกเบ—เบปเบš vmaps (เปเบœเบ™เบ—เบตเปˆเบ„เปเบฒเบ•เบฑเบ”เบชเบดเบ™) เปƒเบ™เป„เบฅเบเบฐเบซเปˆเบฒเบ‡เปเบกเปˆเบ™เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰: # nft เป€เบžเบตเปˆเบกเบเบปเบ”เบฅเบฐเบšเบฝเบš xy tcp dport . ip saddr vmap { 1025-65535 . 192.168.10.2 : เบเบญเบกเบฎเบฑเบš }
  • syntax เบ‡เปˆเบฒเบเบชเปเบฒเบฅเบฑเบšเปเบœเบ™เบ—เบตเปˆ NAT. เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบฅเบฐเบšเบธเป„เบฅเบเบฐเบ—เบตเปˆเบขเบนเปˆ: ... snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } เบซเบผเบท เบ—เบตเปˆเบขเบนเปˆ IP เบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™ เปเบฅเบฐเบžเบญเบ”: ... dnat เบซเบฒ ip saddr เปเบœเบ™เบ—เบตเปˆ { 10.141.11.4 : . 192.168.2.3 } เบซเบผเบทเบเบฒเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบ‚เบญเบ‡เบŠเปˆเบงเบ‡ IP เปเบฅเบฐเบžเบญเบ”: ... dnat เบเบฑเบš ip saddr . tcp เปเบœเบ™เบ—เบตเปˆ dport { 80 . 192.168.1.2: 80-10.141.10.2. 10.141.10.5-8888 }

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: opennet.ru

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™