ΠΠ±ΡΠ²Π΅Π½ Π΅ Π²ΡΠΏΡΡΠΊ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΈΡ ΡΠΈΠ»ΡΡΡ nftables 1.0.2, ΠΊΠΎΠΉΡΠΎ ΡΠ½ΠΈΡΠΈΡΠΈΡΠ° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈΡΠ΅ Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π·Π° IPv4, IPv6, ARP ΠΈ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ ΠΌΠΎΡΡΠΎΠ²Π΅ (Π½Π°ΠΌΠ΅ΡΠ΅Π½ Π΄Π° Π·Π°ΠΌΠ΅Π½ΠΈ iptables, ip6table, arptables ΠΈ ebtables). ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ Π·Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° nftables 1.0.2 ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΠ° Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈ Π² ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux 5.17-rc.
Π ΠΏΠ°ΠΊΠ΅Ρa nftables Π²Π»ΠΈΠ·Π°Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΈΡ ΡΠΈΠ»ΡΡΡ, ΡΠ°Π±ΠΎΡΠ΅ΡΠΈ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, Π΄ΠΎΠΊΠ°ΡΠΎ Π½Π° Π½ΠΈΠ²ΠΎ ΡΠ΄ΡΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π΅ ΠΎΡΠΈΠ³ΡΡΠ΅Π½Π° ΠΎΡ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° nf_tables, ΠΊΠΎΡΡΠΎ Π΅ ΡΠ°ΡΡ ΠΎΡ ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux ΠΎΡ Π²Π΅ΡΡΠΈΡ 3.13. ΠΠ° Π½ΠΈΠ²ΠΎ ΡΠ΄ΡΠΎ ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΡΠ°ΠΌΠΎ ΠΎΠ±Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌ ΠΎΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ», ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ Π΄Π°Π½Π½ΠΈ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΡΠΎΠΊΠ°.
ΠΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ ΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈΡΠ΅ Π·Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Ρ Π² Π±Π°ΠΉΡΠΊΠΎΠ΄ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΡΠΎΠ·ΠΈ Π±Π°ΠΉΡΠΊΠΎΠ΄ ΡΠ΅ Π·Π°ΡΠ΅ΠΆΠ΄Π° Π² ΡΠ΄ΡΠΎΡΠΎ ΡΡΠ΅Π· ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Netlink ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π² ΡΠ΄ΡΠΎΡΠΎ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°, Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΡΠ²Π°ΡΠ° BPF (Berkeley Packet Filters). ΠΠΎΠ΄ΠΎΠ±Π΅Π½ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ°Π»ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΡΡ Π½Π° ΠΊΠΎΠ΄Π° Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅, ΠΊΠΎΠΉΡΠΎ ΡΠ°Π±ΠΎΡΠΈ Π½Π° Π½ΠΈΠ²ΠΎ ΡΠ΄ΡΠΎ, ΠΊΠ°ΡΠΎ Π²ΡΠΈΡΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° ΠΈ Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈΡΠ΅ ΡΠ΅ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Ρ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ.
ΠΡΠ½ΠΎΠ²Π½ΠΈ Π½ΠΎΠ²ΠΎΠ²ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ:
- ΠΠΎΠ±Π°Π²Π΅Π½ Π΅ ΡΠ΅ΠΆΠΈΠΌ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ°, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ° Ρ Π½ΠΎΠ²Π°ΡΠ° ΠΎΠΏΡΠΈΡ β-oβ (ββoptimizeβ), ΠΊΠΎΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ° Ρ ΠΎΠΏΡΠΈΡΡΠ° ββcheckβ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π² ΡΠ°ΠΉΠ»Π° Ρ Π½Π°Π±ΠΎΡ ΠΎΡ ΠΏΡΠ°Π²ΠΈΠ»Π° Π±Π΅Π· Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅. ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ°: meta iifname eth1 ip saddr 1.1.1.1 ip daddr 2.2.2.3 accept meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.2.5 accept ip saddr 1.1.1.1 ip daddr 2.2.2.2 accept ip saddr 2.2.2.2 ip daddr 3.3.3.3 drop
ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΎΠ±Π΅Π΄ΠΈΠ½Π΅Π½ΠΈ Π² meta iifname . ip saddr . ip daddr { eth1 . 1.1.1.1 . 2.2.2.3, eth1 . 1.1.1.2 . 2.2.2.5 } accept ip saddr . ip daddr vmap { 1.1.1.1 . 2.2.2.2 : accept, 2.2.2.2 . 3.3.3.3 : drop }
ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠΏΠΎΡΡΠ΅Π±Π°: # nft -c -o -f ruleset.test ΠΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π°Π½Π΅: ruleset.nft:16:3-37: ip daddr 192.168.0.1 counter accept ruleset.nft:17:3-37: ip daddr 192.168.0.2 counter accept ruleset.nft:18:3-37: ip daddr 192.168.0.3 counter accept Π²: ip daddr { 192.168.0.1, 192.168.0.2, 192.168.0.3 } counter packets 0 bytes 0 accept
- Π set-ΡΠΏΠΈΡΡΠΈΡΠ΅ Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° ip ΠΈ tcp ΠΎΠΏΡΠΈΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π½Π° sctp chunk-ΠΎΠ²Π΅: set s5 { typeof ip option ra value elements = { 1, 1024 } } set s7 { typeof sctp chunk init num-inbound-streams elements = { 1, 4 } } chain c5 { ip option ra value @s5 accept } chain c7 { sctp chunk init num-inbound-streams @s7 accept }
- ΠΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° TCP ΠΎΠΏΡΠΈΠΈ fastopen, md5sig ΠΈ mptcp.
- ΠΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π² ΡΡΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡ Π½Π° ΠΏΠΎΠ΄ΡΠΈΠΏ mp-tcp: tcp option mptcp subtype 1
- Π£ΡΡΠ²ΡΡΡΠ΅Π½ΡΡΠ²Π°Π½ Π΅ ΠΊΠΎΠ΄ΡΡ Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅, ΡΠ°Π±ΠΎΡΠ΅Ρ Π½Π° ΡΡΡΠ°Π½Π°ΡΠ° Π½Π° ΡΠ΄ΡΠΎΡΠΎ.
- ΠΠ° flowtable Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° ΠΏΡΠ»Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° JSON ΡΠΎΡΠΌΠ°Ρ.
- ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Β«rejectΒ» Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈΡΠ΅ ΠΏΠΎ ΡΡΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ Π½Π° Ethernet ΠΊΠ°Π΄ΡΠΈ. ether saddr aa:bb:cc:dd:ee:ff ip daddr 192.168.0.1 reject
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru
