ืžื”ื“ื•ืจืช ืžืกื ืŸ ืžื ื•ืช nftables 1.0.0

ืคื•ืจืกื ื”ืฉื—ืจื•ืจ ืฉืœ ืžืกื ืŸ ืžื ื•ืช nftables 1.0.0, ื”ืžืื—ื“ ืžืžืฉืงื™ ืกื™ื ื•ืŸ ืžื ื•ืช ืขื‘ื•ืจ IPv4, IPv6, ARP ื•ื’ืฉืจื™ ืจืฉืช (ืฉืžื˜ืจืชื ืœื”ื—ืœื™ืฃ iptables, ip6table, arptables ื•-ebtables). ื”ืฉื™ื ื•ื™ื™ื ื”ื ื“ืจืฉื™ื ื›ื“ื™ ืฉื”ื’ืจืกื” ืฉืœ nftables 1.0.0 ืชืขื‘ื•ื“ ื›ืœื•ืœื™ื ื‘ืœื™ื‘ืช Linux 5.13. ืฉื™ื ื•ื™ ืžืฉืžืขื•ืชื™ ื‘ืžืกืคืจ ื”ื’ืจืกื” ืื™ื ื• ืงืฉื•ืจ ืœืฉื™ื ื•ื™ื™ื ืžื”ื•ืชื™ื™ื ื›ืœืฉื”ื, ืืœื ื”ื•ื ืจืง ืชื•ืฆืื” ืฉืœ ื”ืžืฉืš ืขืงื‘ื™ ืฉืœ ืžืกืคื•ืจ ื‘ืกื™ืžื•ืŸ ืขืฉืจื•ื ื™ (ื”ื’ืจืกื” ื”ืงื•ื“ืžืช ื”ื™ื™ืชื” 0.9.9).

ื—ื‘ื™ืœืช nftables ื›ื•ืœืœืช ืจื›ื™ื‘ื™ ืžืกื ืŸ ืžื ื•ืช ื”ืคื•ืขืœื™ื ื‘ื—ืœืœ ื”ืžืฉืชืžืฉ, ื‘ืขื•ื“ ืฉื”ืขื‘ื•ื“ื” ื‘ืจืžืช ื”ืœื™ื‘ื” ืžืกื•ืคืงืช ืขืœ ื™ื“ื™ ืชืช-ื”ืžืขืจื›ืช nf_tables, ืฉื”ื™ื™ืชื” ื—ืœืง ืžืœื™ื‘ืช ืœื™ื ื•ืงืก ืžืื– ื’ืจืกื” 3.13. ืจืžืช ื”ืงืจื ืœ ืžืกืคืงืช ืจืง ืžืžืฉืง ื’ื ืจื™ ื‘ืœืชื™ ืชืœื•ื™ ื‘ืคืจื•ื˜ื•ืงื•ืœ ื”ืžืกืคืง ืคื•ื ืงืฆื™ื•ืช ื‘ืกื™ืกื™ื•ืช ืœื—ื™ืœื•ืฅ ื ืชื•ื ื™ื ืžืžื ื•ืช, ื‘ื™ืฆื•ืข ืคืขื•ืœื•ืช ื ืชื•ื ื™ื ื•ื‘ืงืจืช ื–ืจื™ืžื”.

ื›ืœืœื™ ื”ืกื™ื ื•ืŸ ืขืฆืžื ื•ื”ืžื˜ืคืœื™ื ื”ืกืคืฆื™ืคื™ื™ื ืœืคืจื•ื˜ื•ืงื•ืœ ืžื•ืจื›ื‘ื™ื ืœืชื•ืš bytecode ืฉืœ ืžืจื—ื‘ ื”ืžืฉืชืžืฉ, ื•ืœืื—ืจ ืžื›ืŸ ืงื•ื“ ื‘ื™ืช ื–ื” ื ื˜ืขืŸ ืœืชื•ืš ื”ืœื™ื‘ื” ื‘ืืžืฆืขื•ืช ืžืžืฉืง Netlink ื•ืžื‘ื•ืฆืข ื‘ืงืจื ืœ ื‘ืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช ืžื™ื•ื—ื“ืช ื”ื“ื•ืžื” ืœ-BPF (Berkeley Packet Filters). ื’ื™ืฉื” ื–ื• ืžืืคืฉืจืช ืœื”ืงื˜ื™ืŸ ืžืฉืžืขื•ืชื™ืช ืืช ื’ื•ื“ืœ ืงื•ื“ ื”ืกื™ื ื•ืŸ ื”ืคื•ืขืœ ื‘ืจืžืช ื”ืงืจื ืœ ื•ืœื”ืขื‘ื™ืจ ืืช ื›ืœ ื”ืคื•ื ืงืฆื™ื•ืช ืฉืœ ื—ื•ืงื™ ื”ื ื™ืชื•ื— ื•ื”ื”ื™ื’ื™ื•ืŸ ืฉืœ ืขื‘ื•ื“ื” ืขื ืคืจื•ื˜ื•ืงื•ืœื™ื ืœืžืจื—ื‘ ื”ืžืฉืชืžืฉ.

ื—ื™ื“ื•ืฉื™ื ืขื™ืงืจื™ื™ื:

  • ืชืžื™ื›ื” ื‘ืืœืžื ื˜ ื”ืžืกื›ื” "*" ื ื•ืกืคื” ืœืจืฉื™ืžื•ืช ืกื˜, ื”ืžื•ืคืขืœื•ืช ืขื‘ื•ืจ ื›ืœ ื—ื‘ื™ืœื” ืฉืื™ื ื” ื ื•ืคืœืช ืชื—ืช ืจื›ื™ื‘ื™ื ืื—ืจื™ื ืฉื”ื•ื’ื“ืจื• ื‘ืกื˜. table 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 table netdev x { chain y { type filter hook ingress devices = $dev priority 0; ื™ืจื™ื“ืช ืžื“ื™ื ื™ื•ืช; } } # nft โ€”define dev="{ eth0, eth1 }" -f test.nft
  • ื‘ืจืฉื™ืžื•ืช ืžืคื•ืช, ื”ืฉื™ืžื•ืฉ ื‘ื‘ื™ื˜ื•ื™ื™ื ืงื‘ื•ืขื™ื (ืžืฆื‘ื™ื™ื) ืžื•ืชืจ: table 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 device eth0 family ip { hook ingress { +0000000010 chain netdev xy [nf_tables] +0000000300 chain inet mw input [nf_tables] } { -0000000100 chain ip ab [nf_tables] +0000000300 chain inet mz [nf_tables] } ื”ื•ืง ืงื“ื™ืžื” { -0000000225 selinux_ipv4_forward 0000000000 chain inet mz [nf_tables] } ื”ื•ืง ืงื“ื™ืžื” { -0000000225 selinux_ipv4_forward 0000000225 chain ip-ac [nf_4_XNUMX chain ip-ac [nf_XNUMX_XNUMX chain] XNUMX_output } hook postrouting { +XNUMX XNUMX selinux_ipvXNUMX_postroute } }
  • ื‘ืœื•ืงื™ื ื‘ืชื•ืจ ืžืืคืฉืจื™ื ืœืฉืœื‘ ื‘ื™ื˜ื•ื™ื™ jhash, symhash ื•-numgen ื›ื“ื™ ืœื”ืคื™ืฅ ืžื ื•ืช ืœืชื•ืจื™ื ื‘ื—ืœืœ ื”ืžืฉืชืžืฉ. โ€ฆ ืชื•ืจ ืœ-symhash mod 65536 โ€ฆ ื“ื’ืœื™ ืชื•ืจ ืขื•ืงืคื™ื ืœ-numgen inc mod 65536 โ€ฆ ืชื•ืจ ืœ-jhash oif . meta mark mod 32 "ืชื•ืจ" ื ื™ืชืŸ ื’ื ืœืฉืœื‘ ืขื ืจืฉื™ืžื•ืช ืžืคื•ืช ืœื‘ื—ื™ืจืช ืชื•ืจ ื‘ืžืจื—ื‘ ื”ืžืฉืชืžืฉ ืขืœ ืกืžืš ืžืคืชื—ื•ืช ืฉืจื™ืจื•ืชื™ื™ื. ... ื“ื’ืœื™ ืชื•ืจ ืขื•ืงืคื™ื ืœืžืคืช oifname { "eth0" : 0, "ppp0" : 2, "eth1" : 2 }
  • ืืคืฉืจ ืœื”ืจื—ื™ื‘ ืžืฉืชื ื™ื ื”ื›ื•ืœืœื™ื ืจืฉื™ืžืช ืกื˜ ืœืžืกืคืจ ืžืคื•ืช. ื”ื’ื“ืจืช ืžืžืฉืงื™ื = โ€‹โ€‹{ eth0, eth1 } table ip x { chain y { type filter hook priority input 0; ืงื‘ืœืช ืžื“ื™ื ื™ื•ืช; iifname vmap { lo : accept, $interfaces : drop } } } # nft -f x.nft # nft list set rulet table ip x { chain y { type filter hook input priority 0; ืงื‘ืœืช ืžื“ื™ื ื™ื•ืช; iifname vmap { "lo" : accept, "eth0": drop, "eth1": drop } }
  • ืฉื™ืœื•ื‘ ืฉืœ vmaps (ืžืคืช ืคืกืง ื“ื™ืŸ) ื‘ืžืจื•ื•ื—ื™ื ืžื•ืชืจ: # nft add rule xy tcp dport . ip saddr vmap {1025-65535. 192.168.10.2 : ืงื‘ืœ }
  • ืชื—ื‘ื™ืจ ืคืฉื•ื˜ ืขื‘ื•ืจ ืžื™ืคื•ื™ื™ NAT. ืžื•ืชืจ ืœืฆื™ื™ืŸ ื˜ื•ื•ื—ื™ ื›ืชื•ื‘ื•ืช: ... snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } ืื• ื›ืชื•ื‘ื•ืช IP ืžืคื•ืจืฉื•ืช ื•ื™ืฆื™ืื•ืช: ... dnat to ip saddr map { 10.141.11.4 : 192.168.2.3. . 80 } ืื• ืฉื™ืœื•ื‘ื™ื ืฉืœ ื˜ื•ื•ื—ื™ IP ื•ื™ืฆื™ืื•ืช: ... dnat to ip saddr . tcp dport map {192.168.1.2. 80: 10.141.10.2-10.141.10.5. 8888-8999 }

ืžืงื•ืจ: OpenNet.ru

ื”ื•ืกืคืช ืชื’ื•ื‘ื”