ΠΠ·Π΄Π°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠΈΠ»ΡΡΡΠ° Π·Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ nftables 1.0.0 Π±Π΅ΡΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½ΠΎ, ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π°ΠΉΠΊΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈΡΠ΅ Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π·Π° IPv4, IPv6, ARP ΠΈ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ ΠΌΠΎΡΡΠΎΠ²Π΅ (Π½Π°ΡΠΎΡΠ΅Π½ΠΈ ΠΊΡΠΌ Π·Π°ΠΌΡΠ½Π° Π½Π° iptables, ip6table, arptables ΠΈ ebtables). ΠΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ΡΠΎ nftables 1.0.0, ΡΠ° Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈ Π² ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux 5.13. ΠΠ½Π°ΡΠΈΡΠ΅Π»Π½Π° ΠΏΡΠΎΠΌΡΠ½Π° Π² Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° Π²Π΅ΡΡΠΈΡΡΠ° Π½Π΅ Π΅ ΡΠ²ΡΡΠ·Π°Π½Π° Ρ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΡΡΠ½Π΄Π°ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, Π° Π΅ ΡΠ°ΠΌΠΎ ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ ΠΎΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΠΎ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠΌΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π² Π΄Π΅ΡΠ΅ΡΠΈΡΠ½Π° ΡΠΈΡΡΠ΅ΠΌΠ° (ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π±Π΅ΡΠ΅ 0.9.9).
ΠΠ°ΠΊΠ΅ΡΡΡ nftables Π²ΠΊΠ»ΡΡΠ²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π·Π° ΡΠΈΠ»ΡΡΡ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ°Π±ΠΎΡΡΡ Π² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, Π΄ΠΎΠΊΠ°ΡΠΎ Π½ΠΈΠ²ΠΎΡΠΎ Π½Π° ΡΠ΄ΡΠΎΡΠΎ ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΎΡ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° nf_tables, ΠΊΠΎΡΡΠΎ Π΅ ΡΠ°ΡΡ ΠΎΡ ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux ΠΎΡ Π²Π΅ΡΡΠΈΡ 3.13. ΠΠ° Π½ΠΈΠ²ΠΎ ΡΠ΄ΡΠΎ ββΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΡΠ°ΠΌΠΎ ΠΎΠ±Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌ ΠΎΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ», ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ Π΄Π°Π½Π½ΠΈ ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠΎΡΠΎΠΊΠ°.
Π‘Π°ΠΌΠΈΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ ΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈΡΠ΅ Π·Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΎΡΠΈ ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Ρ Π² Π±Π°ΠΉΡ ΠΊΠΎΠ΄ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΡΠΎΠ·ΠΈ Π±Π°ΠΉΡ ΠΊΠΎΠ΄ ΡΠ΅ Π·Π°ΡΠ΅ΠΆΠ΄Π° Π² ΡΠ΄ΡΠΎΡΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Netlink ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π² ΡΠ΄ΡΠΎΡΠΎ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°, Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΡΠ²Π°ΡΠ° 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 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 } } Π²Π΅ΡΠΈΠ³Π° ssh_input { } Π²Π΅ΡΠΈΠ³Π° wan_input { tcp dport vmap @portmap } Π²Π΅ΡΠΈΠ³Π° prerouting { type filter hook prerouting priority raw; ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° ΠΏΡΠΈΠ΅ΠΌΠ°; iif vmap { "lo": ΡΠΊΠΎΠΊ wan_input } } }
- ΠΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° "list hooks" Π·Π° ΠΏΠΎΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° ΡΠΏΠΈΡΡΠΊ Ρ ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΎΡΠΈ Π·Π° Π΄Π°Π΄Π΅Π½ΠΎ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠΈ: # nft list hooks ip device eth0 family ip { hook ingress { +0000000010 chain netdev xy [nf_tables] +0000000300 chain inet mw [nf_tables] } hook input { -0000000100 Π²Π΅ΡΠΈΠ³Π° ip ab [nf_tables] +0000000300 Π²Π΅ΡΠΈΠ³Π° inet mz [nf_tables] } ΠΊΡΠΊΠ° Π½Π°ΠΏΡΠ΅Π΄ { -0000000225 selinux_ipv4_forward 0000000000 Π²Π΅ΡΠΈΠ³Π° ip ac [nf_tables] } ΠΊΡΠΊΠ° ΠΈΠ·Ρ ΠΎΠ΄ { -0000000225 selinux_ipv4_ ΠΈΠ·Ρ ΠΎΠ΄ } 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 map { "eth0" : 0, "ppp0" : 2, "eth1" : 2 }
- ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΡΠ°Π·ΡΠΈΡΡΡ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, ΠΊΠΎΠΈΡΠΎ Π²ΠΊΠ»ΡΡΠ²Π°Ρ Π½Π°Π±ΠΎΡ ΠΎΡ ΡΠΏΠΈΡΡΠΊ Π² Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΊΠ°ΡΡΠΈ. Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΠΉΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ = { eth0, eth1 } ΡΠ°Π±Π»ΠΈΡΠ° ip x { Π²Π΅ΡΠΈΠ³Π° y { ΡΠΈΠΏ ΡΠΈΠ»ΡΡΡ ΠΊΡΠΊΠ° Π²Ρ ΠΎΠ΄Π΅Π½ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ 0; ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° ΠΏΡΠΈΠ΅ΠΌΠ°; iifname vmap { lo : accept, $interfaces : drop } } } # nft -f x.nft # nft list table set ΠΏΡΠ°Π²ΠΈΠ»Π° ip x { chain y { type filter hook input priority 0; ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° ΠΏΡΠΈΠ΅ΠΌΠ°; iifname vmap { "lo" : ΠΏΡΠΈΠ΅ΠΌΠ°Π½Π΅, "eth0" : ΠΏΡΡΠΊΠ°Π½Π΅, "eth1" : ΠΏΡΡΠΊΠ°Π½Π΅ } } }
- Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΎ Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° 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 ΠΊΡΠΌ ip saddr . tcp dport map { 192.168.1.2 . 80: 10.141.10.2-10.141.10.5. 8888-8999 }
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru