ΠΠ±ΡΠ°Π²Π΅Π½ΠΎ Π΅ ΠΎΠ±ΡΠ°Π²ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΈΡΠ΅ ΡΠΈΠ»ΡΡΠΈ nftables 1.0.6, ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π°ΡΡΠΈ Π³ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡΠΈΡΠ΅ Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ Π·Π° IPv4, IPv6, ARP ΠΈ ΠΌΡΠ΅ΠΆΠ½ΠΈ ΠΌΠΎΡΡΠΎΠ²ΠΈ (Π½Π°ΠΌΠ΅Π½Π΅ΡΠΈ Π΄Π° Π³ΠΈ Π·Π°ΠΌΠ΅Π½Π°Ρ iptables, ip6table, arptables ΠΈ ebtables). ΠΠ°ΠΊΠ΅ΡΠΎΡ nftables Π²ΠΊΠ»ΡΡΡΠ²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π·Π° ΡΠΈΠ»ΡΠ΅Ρ Π·Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΊΠΎΠΈ ΡΠ°Π±ΠΎΡΠ°Ρ Π²ΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΡΠΎΡ, Π΄ΠΎΠ΄Π΅ΠΊΠ° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° Π½ΠΈΠ²ΠΎ Π½Π° ΡΠ°Π΄ΡΠΎΡΠΎ Π΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½Π° ΠΎΠ΄ ΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΠΎΡ nf_tables, ΠΊΠΎΡ Π΅ Π΄Π΅Π» ΠΎΠ΄ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ ΠΠΈΠ½ΡΠΊΡ ΠΎΠ΄ ΠΎΠ±ΡΠ°Π²ΡΠ²Π°ΡΠ΅ΡΠΎ 3.13. ΠΠΈΠ²ΠΎΡΠΎ Π½Π° ΡΠ°Π΄ΡΠΎΡΠΎ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° ΡΠ°ΠΌΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠΊΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠ΅Π½ ΠΎΠ΄ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΠΊΠΎΡ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΠΈΠ·Π²Π»Π΅ΠΊΡΠ²Π°ΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΎΠ΄ ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΠΎ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π° Π½Π° ΠΏΡΠΎΡΠΎΠΊΠΎΡ.
Π‘Π°ΠΌΠΈΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°ΡΠ΅ ΠΈ ΡΠ°ΠΊΡΠ²Π°ΡΠΈΡΠ΅ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π·Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΡ ΡΠ΅ ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π°Ρ Π²ΠΎ Π±Π°ΡΡΠ΅ΠΊΠΎΠ΄ Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ ΠΏΡΠΎΡΡΠΎΡ, ΠΏΠΎ ΡΡΠΎ ΠΎΠ²ΠΎΡ Π±Π°ΡΡΠ΅ΠΊΠΎΠ΄ ΡΠ΅ Π²ΡΠΈΡΡΠ²Π° Π²ΠΎ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡΠΎΡ Π½Π° Netlink ΠΈ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π²ΠΎ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Π²ΠΎ ΡΠΏΠ΅ΡΠΈΡΠ°Π»Π½Π° Π²ΠΈΡΡΡΠ΅Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° ΡΡΠΎ Π»ΠΈΡΠΈ Π½Π° BPF (Berkeley Packet Filters). ΠΠ²ΠΎΡ ΠΏΡΠΈΡΡΠ°ΠΏ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ°Π»ΠΈ Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°ΡΠ° Π½Π° ΠΊΠΎΠ΄ΠΎΡ Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°ΡΠ΅ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠΈ Π½Π° Π½ΠΈΠ²ΠΎ Π½Π° ΡΠ°Π΄ΡΠΎΡΠΎ ΠΈ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ°Ρ ΡΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π·Π° ΠΏΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΈ Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ° ΡΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ Π²ΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΡΠΎΡ.
ΠΠ»Π°Π²Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
- ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΎΡ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π°, ΠΏΠΎΠ²ΠΈΠΊΠ°Π½ ΠΊΠΎΠ³Π° Π΅ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½Π° ΠΎΠΏΡΠΈΡΠ°ΡΠ° β-o/-optimizeβ, ΠΈΠΌΠ° Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΎ ΠΏΠ°ΠΊΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° ΡΠΎ Π½ΠΈΠ²Π½ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°ΡΠ΅ ΠΈ ΠΏΡΠ΅ΡΠ²ΠΎΡΠ°ΡΠ΅ Π²ΠΎ ΡΠΏΠΈΡΠΎΡΠΈ ΡΠΎ ΠΌΠ°ΠΏΠΈ ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠ°Π²ΠΈΠ»Π° # cat ruleset.nft ΡΠ°Π±Π΅Π»Π° ip x { chain y { type filter hook Π²Π»Π΅Π·Π΅Π½ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ΅Π½ ΡΠΈΠ»ΡΠ΅Ρ; ΠΏΠ°Π΄ Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°ΡΠ°; ΠΌΠ΅ΡΠ° iifname eth1 ip saddr 1.1.1.1 ip daddr 2.2.2.3 ΠΏΡΠΈΡΠ°ΡΠΈ ΠΌΠ΅ΡΠ° iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.2.4 ΠΏΡΠΈΡΠ°ΡΠΈ ΠΌΠ΅ΡΠ° iifname eth1 ip saddr 1.1.1.2. ip saddr 2.2.3.0 .24 ip daddr 1-1.1.1.2 ΠΏΡΠΈΡΠ°ΡΠΈ ΠΌΠ΅ΡΠ° iifname eth2.2.4.0 ip saddr 2.2.4.10 ip daddr 2 ΠΏΡΠΈΡΠ°ΡΠΈ } } ΠΏΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° βnft -o -c -f ruleset.nftβ ΡΠ΅ ΡΠ΅ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°Π°Ρ Π²ΠΎ ΡΠ»Π΅Π΄Π½ΠΈΠ²Π΅ nft:1.1.1.3:2.2.2.5-4: meta iifname eth17 ip saddr 74 ip daddr 1 ΠΏΡΠΈΡΠ°ΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°.nft:1.1.1.1:2.2.2.3-5: meta iifname eth17 ip saddr 74 ip daddr.1. : 1.1.1.2:2.2.2.4-6: meta iifname eth17 ip saddr 77 ip daddr 1/1.1.1.2 ΠΏΡΠΈΡΠ°ΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°.nft:2.2.3.0:24-7: meta iifname eth17 ip saddr 83 ip daddr 1/1.1.1.2. ΠΏΡΠΈΡΠ°ΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°.nft:2.2.4.0:2.2.4.10-8: ΠΌΠ΅ΡΠ° iifname eth17 ip saddr 74 ip daddr 2 ΠΏΡΠΈΡΠ°ΡΠΈ Π²ΠΎ: iifname . ip saddr. ip daddr { eth1.1.1.3. 2.2.2.5. 1, eth1.1.1.1. 2.2.2.3. 1, eth1.1.1.2. 2.2.2.4. 1/1.1.1.2, eth2.2.3.0. 24. 1-1.1.1.2, eth2.2.4.0. 2.2.4.10. 2 } ΠΏΡΠΈΡΠ°ΡΠΈ
- ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΎΡΠΎΡ ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΈ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ° ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° ΠΊΠΎΠΈ Π²Π΅ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΈ ΡΠΏΠΈΡΠΎΡΠΈ ΡΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° Π²ΠΎ ΠΏΠΎΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½Π° ΡΠΎΡΠΌΠ°, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ°: # cat ruleset.nft ΡΠ°Π±Π΅Π»Π° ip ΡΠΈΠ»ΡΠ΅Ρ { chain input { type filter hook Π²Π»Π΅Π·Π΅Π½ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ΅Π½ ΡΠΈΠ»ΡΠ΅Ρ; ΠΏΠ°Π΄ Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°ΡΠ°; iifname βΠ΅Π²Π΅β ΠΏΡΠΈΡΠ°ΡΠΈ ct ΡΠΎΡΡΠΎΡΠ±Π°, ΠΏΠΎΠ²ΡΠ·Π°Π½Π° ΠΏΡΠΈΡΠ°ΡΠΈ ΠΊΠΎΠΌΠ΅Π½ΡΠ°Ρ βΠΠΎ ΡΠΎΠΎΠ±ΡΠ°ΡΠ°ΡΠΎΡ Π½ΠΈΠ΅ ΠΏΠΎΡΠ΅ΠΊΠ½ΡΠ²Π°ΠΌΠ΅, Π²Π΅ΡΡΠ²Π°ΠΌΠ΅β iifname βenp0s31f6β ip saddr { 209.115.181.102, 216.197.228.230 } ip daddr 10.0.0.149ud123p .32768 ΠΏΡΠΈΡΠ°ΡΠΈ iifname "enp65535s0f31" ip saddr { 6, 64.59.144.17 } ip daddr 64.59.150.133 udp sport 10.0.0.149 udp dport 53-32768 ΠΏΡΠΈΡΠ°ΡΠ΅ΡΠ΅ Π³ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° -exeftnc} Ρ : ruleset.nft:65535:6-22: iifname "enp149s0f31" ip saddr {6, 209.115.181.102 } ip daddr 216.197.228.230 udp sport 10.0.0.149ft :123-32768 65535 : iifname "enp7s22f143" ip saddr { 0, 31 } ip daddr 6 udp sport 64.59.144.17 udp dport 64.59.150.133-10.0.0.149 ΠΏΡΠΈΡΠ°ΡΠΈ Π²ΠΎ: ip saddr. ΠΠ ΡΠ°ΡΠΎ. Π£ΠΠ ΡΠΏΠΎΡΡ. udp dport {enp53s32768f65535. 0. 31. 6. 209.115.181.102-10.0.0.149, enp123s32768f65535. 0. 31. 6. 216.197.228.230-10.0.0.149, enp123s32768f65535. 0. 31. 6. 64.59.144.17-10.0.0.149, enp53s32768f65535. 0. 31. 6. 64.59.150.133-10.0.0.149 } ΠΏΡΠΈΡΠ°ΡΠΈ
- Π Π΅ΡΠ΅Π½ Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΡ ΡΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ Π±Π°ΡΡΠ΅ΠΊΠΎΠ΄ Π·Π° ΡΠΏΠΎΡΡΠ²Π°ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΈ ΠΊΠΎΠΈ ΠΊΠΎΡΠΈΡΡΠ°Ρ ΡΠΈΠΏΠΎΠ²ΠΈ ΡΠΎ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ ΡΠ΅Π΄ΠΎΡΠ»Π΅Π΄ Π½Π° Π±Π°ΡΡΠΈ, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π΅ IPv4 (ΡΠ΅Π΄ΠΎΡΠ»Π΅Π΄ Π½Π° ΠΌΡΠ΅ΠΆΠ½ΠΈ Π±Π°ΡΡΠΈ) ΠΈ ΠΌΠ΅ΡΠ°-ΠΎΠ·Π½Π°ΠΊΠ° (ΡΠ΅Π΄ΠΎΡΠ»Π΅Π΄ Π½Π° ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ Π±Π°ΡΡΠΈ). ΡΠ°Π±Π΅Π»Π° ip x { map w { typeof ip saddr . ΠΌΠ΅ΡΠ° ΠΎΠ·Π½Π°ΠΊΠ°: ΠΏΡΠ΅ΡΡΠ΄Π° ΠΎΠ·Π½Π°ΡΡΠ²Π° ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» Π±ΡΠΎΡΠ°Ρ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ = {127.0.0.1-127.0.0.4. 0x123434-0xb00122: ΠΏΡΠΈΡΠ°ΡΠΈ, 192.168.0.10-192.168.1.20. 0x0000aa00-0x0000aaff : ΠΏΡΠΈΡΠ°ΡΠΈ, } } ΡΠΈΠ½ΡΠΈΡ k { ΡΠΈΠΏ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ΅Π½ ΡΠΈΠ»ΡΠ΅Ρ Π·Π° Π²Π»Π΅Π· Π½Π° ΠΊΡΠΊΠ° Π·Π° ΡΠΈΠ»ΡΠ΅Ρ; ΠΏΠ°Π΄ Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°ΡΠ°; ip saddr. ΠΌΠ΅ΡΠ° ΠΎΠ·Π½Π°ΠΊΠ° vmap @w } }
- ΠΠΎΠ΄ΠΎΠ±ΡΠ΅Π½Π° ΡΠΏΠΎΡΠ΅Π΄Π±Π° Π½Π° ΡΠ΅ΡΠΊΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ ΠΊΠΎΠ³Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ ΡΡΡΠΎΠ²ΠΈ ΠΈΠ·ΡΠ°Π·ΠΈ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ: meta l4proto 91 @th,400,16 0x0 ΠΏΡΠΈΡΠ°ΡΠΈ
- ΠΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ ΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π·Π° ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π°ΡΠ΅ Π²ΠΎ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΈ ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈ: Π²ΠΌΠ΅ΡΠ½Π΅ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ xy tcp sport { 3478-3497, 16384-16387 } Π±ΡΠΎΡΠ°Ρ ΠΏΡΠΈΡΠ°ΡΠΈ
- JSON API Π΅ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ Π·Π° Π΄Π° Π²ΠΊΠ»ΡΡΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΊΠ° Π·Π° ΠΈΠ·ΡΠ°Π·ΠΈ Π²ΠΎ ΡΠΏΠΈΡΠΎΡΠΈ ΡΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΈ ΠΌΠ°ΠΏΠΈ.
- ΠΠΊΡΡΠ΅Π½Π·ΠΈΠΈ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° nftables python ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π°Π°Ρ Π²ΡΠΈΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π²ΠΎ ΡΠ΅ΠΆΠΈΠΌ Π½Π° Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡΠ° (β-cβ) ΠΈ Π΄ΠΎΠ΄Π°Π²Π°Π°Ρ ΠΏΠΎΠ΄Π΄ΡΡΠΊΠ° Π·Π° Π½Π°Π΄Π²ΠΎΡΠ΅ΡΠ½Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΡΠ° Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ.
- ΠΠΎΠ΄Π°Π²Π°ΡΠ΅ΡΠΎ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ Π΅ Π΄ΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΎ Π²ΠΎ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ΅ Π½Π° ΡΠΏΠΈΡΠΎΠΊΠΎΡ ΡΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°.
- ΠΠ³ΡΠ°Π½ΠΈΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΡΡΠ°ΠΏΠΊΠ°ΡΠ° Π½Π° Π±Π°ΡΡΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° ΠΎΠ΄ΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° Π½ΡΠ»ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡ.
ΠΠ·Π²ΠΎΡ: opennet.ru