ΠΠ·Π΄Π°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠΈΠ»ΡΡΡΠ° Π·Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ nftables 1.0.6 Π±Π΅ΡΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½ΠΎ, ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π°ΠΉΠΊΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈΡΠ΅ Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π·Π° IPv4, IPv6, ARP ΠΈ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ ΠΌΠΎΡΡΠΎΠ²Π΅ (Π½Π°ΡΠΎΡΠ΅Π½ΠΈ ΠΊΡΠΌ Π·Π°ΠΌΡΠ½Π° Π½Π° iptables, ip6table, arptables ΠΈ ebtables). ΠΠ°ΠΊΠ΅ΡΡΡ nftables Π²ΠΊΠ»ΡΡΠ²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π·Π° ΡΠΈΠ»ΡΡΡ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ°Π±ΠΎΡΡΡ Π² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, Π΄ΠΎΠΊΠ°ΡΠΎ Π½ΠΈΠ²ΠΎΡΠΎ Π½Π° ΡΠ΄ΡΠΎΡΠΎ ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΎΡ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° nf_tables, ΠΊΠΎΡΡΠΎ Π΅ ΡΠ°ΡΡ ΠΎΡ ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux ΠΎΡ Π²Π΅ΡΡΠΈΡ 3.13. ΠΠ° Π½ΠΈΠ²ΠΎ ΡΠ΄ΡΠΎ ββΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΡΠ°ΠΌΠΎ ΠΎΠ±Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌ ΠΎΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ», ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ Π΄Π°Π½Π½ΠΈ ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠΎΡΠΎΠΊΠ°.
Π‘Π°ΠΌΠΈΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ ΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈΡΠ΅ Π·Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΎΡΠΈ ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Ρ Π² Π±Π°ΠΉΡ ΠΊΠΎΠ΄ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΡΠΎΠ·ΠΈ Π±Π°ΠΉΡ ΠΊΠΎΠ΄ ΡΠ΅ Π·Π°ΡΠ΅ΠΆΠ΄Π° Π² ΡΠ΄ΡΠΎΡΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Netlink ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π² ΡΠ΄ΡΠΎΡΠΎ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°, Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΡΠ²Π°ΡΠ° BPF (Berkeley Packet Filters). Π’ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΏΡΠ°Π²ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π½Π°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° ΡΠΈΠ»ΡΡΠΈΡΠ°ΡΠΈΡ ΠΊΠΎΠ΄, ΡΠ°Π±ΠΎΡΠ΅Ρ Π½Π° Π½ΠΈΠ²ΠΎ ΡΠ΄ΡΠΎ, ΠΈ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π·Π° Π°Π½Π°Π»ΠΈΠ· ΠΈ Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ Π² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ.
ΠΡΠ½ΠΎΠ²Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
- Π ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΎΡΠ° Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ°, ΠΈΠ·Π²ΠΈΠΊΠ°Π½ ΠΏΡΠΈ ΠΏΠΎΡΠΎΡΠ²Π°Π½Π΅ Π½Π° ΠΎΠΏΡΠΈΡΡΠ° "-o/--optimize", Π΅ Π½Π°ΡΡΡΠΎΠ΅Π½ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π° ΡΡΠ΅Π· ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°Π½Π΅ΡΠΎ ΠΈΠΌ ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½Π΅ΡΠΎ ΠΈΠΌ Π² ΡΠΏΠΈΡΡΡΠΈ Ρ ΠΊΠ°ΡΡΠΈ ΠΈ Π½Π°Π±ΠΎΡΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° ΡΠ° # cat ruleset.nft table ip x { chain y { type filter hook input priority filter; ΡΠΏΠ°Π΄ Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°ΡΠ°; meta iifname eth1 ip saddr 1.1.1.1 ip daddr 2.2.2.3 ΠΏΡΠΈΠ΅ΠΌΠ°Π½Π΅ Π½Π° meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.2.4 ΠΏΡΠΈΠ΅ΠΌΠ°Π½Π΅ Π½Π° meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.3.0/24 ΠΏΡΠΈΠ΅ΠΌΠ°Π½Π΅ Π½Π° meta iifname eth1 ip saddr 1.1.1.2 .2.2.4.0 ip daddr 2.2.4.10-2 accept meta iifname eth1.1.1.3 ip saddr 2.2.2.5 ip daddr 4 accept } } ΡΠ»Π΅Π΄ "nft -o -c -f ruleset.nft" ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½ Π² ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ: Π½Π°Π±ΠΎΡ ΠΎΡ ΠΏΡΠ°Π²ΠΈΠ»Π°. nft:17:74-1: ΠΌΠ΅ΡΠ° iifname eth1.1.1.1 ip saddr 2.2.2.3 ip daddr 5 ΠΏΡΠΈΠ΅ΠΌΠ° ΠΏΡΠ°Π²ΠΈΠ»Π°.nft:17:74-1: ΠΌΠ΅ΡΠ° iifname eth1.1.1.2 ip saddr 2.2.2.4 ip daddr 6 ΠΏΡΠΈΠ΅ΠΌΠ° ΠΏΡΠ°Π²ΠΈΠ»Π°.nft: 17:77-1: meta iifname eth1.1.1.2 ip saddr 2.2.3.0 ip daddr 24/7 ΠΏΡΠΈΠ΅ΠΌΠ° ruleset.nft:17:83-1: ΠΌΠ΅ΡΠ° iifname eth1.1.1.2 ip saddr 2.2.4.0 ip daddr 2.2.4.10-8 ΠΏΡΠΈΠ΅ΠΌΠ° ruleset.nft:17:74-2: meta iifname eth1.1.1.3 ip saddr 2.2.2.5 ip daddr 1 ΠΏΡΠΈΠ΅ΠΌ Π²: iifname . ip saddr. ip daddr {eth1.1.1.1. 2.2.2.3. 1, eth1.1.1.2. 2.2.2.4. 1, eth1.1.1.2. 2.2.3.0. 24/1, eth1.1.1.2 . 2.2.4.0. 2.2.4.10-2, eth1.1.1.3. 2.2.2.5. XNUMX } ΠΏΡΠΈΠ΅ΠΌΠ°ΠΌ
- ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΎΡΡΡ ΠΌΠΎΠΆΠ΅ ΡΡΡΠΎ ΡΠ°ΠΊΠ° Π΄Π° ΠΊΠΎΠ½Π΄Π΅Π½Π·ΠΈΡΠ° ΠΏΡΠ°Π²ΠΈΠ»Π°, ΠΊΠΎΠΈΡΠΎ Π²Π΅ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΏΡΠΎΡΡΠΈ ΡΠΏΠΈΡΡΡΠΈ Ρ Π½Π°Π±ΠΎΡΠΈ, Π² ΠΏΠΎ-ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½Π° ΡΠΎΡΠΌΠ°, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ: # cat ruleset.nft table ip filter { chain input { type filter hook input priority filter; ΡΠΏΠ°Π΄ Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°ΡΠ°; iifname "lo" ΠΏΡΠΈΠ΅ΠΌΠ°ΠΌ ct ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π΅Π½ΠΎ, ΡΠ²ΡΡΠ·Π°Π½ΠΎ ΠΏΡΠΈΠ΅ΠΌΠ°ΠΌ ΠΊΠΎΠΌΠ΅Π½ΡΠ°Ρ "Π ΡΡΠ°ΡΠΈΠΊΠ°, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΎΠΈΠ·Ρ ΠΎΠΆΠ΄Π°ΠΌΠ΅, Π½ΠΈΠ΅ Π²ΡΡΠ²Π°ΠΌΠ΅" iifname "enp0s31f6" ip saddr { 209.115.181.102, 216.197.228.230 } ip daddr 10.0.0.149 udp sport 123 udp dport 32768-65535 ΠΏΡΠΈΠ΅ΠΌΠ°ΠΌ iifname "enp0s31f6" ip saddr { 64.59.144.17, 64.59.150.133 } ip daddr 10.0.0.149 udp sport 53 udp dport 32768-65535 accept } } ΡΠ»Π΅Π΄ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° "nft -o -c -f ruleset.nft" ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ°Π½ ΡΠ°ΠΊΠ° : ruleset.nft:6:22-149: iifname "enp0s31f6" ip saddr { 209.115.181.102, 216.197.228.230 } ip daddr 10.0.0.149 udp sport 123 udp dport 32768-65535 ΠΏΡΠΈΠ΅ΠΌΠ΅ΡΠ΅ ruleset.nft:7:22 -143 0 : iifname "enp31s6f64.59.144.17" ip saddr { 64.59.150.133, 10.0.0.149 } ip daddr 53 udp sport 32768 udp dport 65535-0 ΠΏΡΠΈΠ΅ΠΌ Π²: iifname . ip saddr. ip daddr. udp ΡΠΏΠΎΡΡ. udp dport { enp31s6f209.115.181.102 . 10.0.0.149. 123. 32768 . 65535-0, enp31s6f216.197.228.230. 10.0.0.149. 123. 32768 . 65535-0, enp31s6f64.59.144.17. 10.0.0.149. 53. 32768 . 65535-0, enp31s6f64.59.150.133. 10.0.0.149. 53. 32768 . 65535-XNUMX } ΠΏΡΠΈΠ΅ΠΌΠ°ΠΌ
- Π Π°Π·ΡΠ΅ΡΠ΅Π½ Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π±Π°ΠΉΡ ΠΊΠΎΠ΄ Π·Π° ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΈ Π½Π° ΡΠ»ΠΈΠ²Π°Π½Π΅, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠΈΠΏΠΎΠ²Π΅ Ρ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ endian, ΠΊΠ°ΡΠΎ IPv4 (ΠΌΡΠ΅ΠΆΠΎΠ² endian) ΠΈ ΠΌΠ΅ΡΠ°ΠΌΠ°ΡΠΊΠΈΡΠΎΠ²ΠΊΠ° (system endian). ΡΠ°Π±Π»ΠΈΡΠ° 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 accept
- ΠΠΎΡΠΈΠ³ΠΈΡΠ°Π½ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΡΠ°Π·ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π° Π½Π° ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΈ: Π²ΠΌΡΠΊΠ½Π΅ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ xy tcp sport { 3478-3497, 16384-16387 } counter accept
- JSON API Π΅ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½, Π·Π° Π΄Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΈΠ·ΡΠ°Π·ΠΈ Π² ΡΠΏΠΈΡΡΡΠΈΡΠ΅ Ρ Π½Π°Π±ΠΎΡΠΈ ΠΈ ΠΊΠ°ΡΡΠΈ.
- Π ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡΡΠ° Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° Π½Π° nftables python, Π½Π°Π±ΠΎΡΠΈΡΠ΅ ΠΎΡ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π·Π°ΡΠ΅Π΄Π΅Π½ΠΈ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π² ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ("-c") ΠΈ Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½Π΅ Π½Π° Π²ΡΠ½ΡΠ½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°.
- ΠΠΎΠ±Π°Π²ΡΠ½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΎ Π² Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ΅ Π½Π° ΡΠ΅Ρ-ΡΠΏΠΈΡΡΡΠΈ.
- ΠΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΡΠΊΠ°ΠΆΠ΅ Π½ΡΠ»Π΅Π²Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ Π² ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° Π±Π°ΠΉΡΠΎΠ²Π΅ΡΠ΅.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru