ΠΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ Π²ΡΠΏΡΡΠΊ ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠ»ΡΡΡΠ° nftables 0.9.9, ΡΠ½ΠΈΡΠΈΡΠΈΡΡΡΡΠ΅Π³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Π΄Π»Ρ IPv4, IPv6, ARP ΠΈ ΡΠ΅ΡΠ΅Π²ΡΡ ΠΌΠΎΡΡΠΎΠ² (Π½Π°ΡΠ΅Π»Π΅Π½ Π½Π° Π·Π°ΠΌΠ΅Π½Ρ iptables, ip6table, arptables ΠΈ ebtables). ΠΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ Π²ΡΠΏΡΡΠΊ ΡΠΎΠΏΡΡΡΡΠ²ΡΡΡΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ libnftnl 1.2.0, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΠ΅ΠΉ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΉ API Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ nf_tables. ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Π²ΡΠΏΡΡΠΊΠ° nftables 0.9.9 ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²ΠΊΠ»ΡΡΠ΅Π½Ρ Π² ΡΠΎΡΡΠ°Π² ΡΠ΄ΡΠ° Linux 5.13-rc1.
Kifurushi cha nftables ni pamoja na vipengee vya kichujio cha pakiti ambacho hutumika katika nafasi ya mtumiaji, wakati kazi ya kiwango cha kernel inatolewa na mfumo mdogo wa nf_tables, ambao umekuwa sehemu ya kernel ya Linux tangu kutolewa kwa 3.13. Kiwango cha kernel hutoa kiolesura cha kawaida kinachojitegemea cha itifaki ambacho hutoa kazi za kimsingi za kutoa data kutoka kwa pakiti, kutekeleza shughuli za data na udhibiti wa mtiririko.
Sheria za kuchuja na vidhibiti mahususi vya itifaki hukusanywa kuwa bytecode katika nafasi ya mtumiaji, baada ya hapo bytecode hii hupakiwa kwenye kerneli kwa kutumia kiolesura cha Netlink na kutekelezwa kwenye kernel katika mashine maalum ya pepe inayowakumbusha BPF (Berkeley Packet Filters). Njia hii hukuruhusu kupunguza kwa kiasi kikubwa saizi ya msimbo wa kuchuja unaoendesha kwenye kiwango cha kernel na kusonga kazi zote za kanuni na mantiki ya kufanya kazi na itifaki kwenye nafasi ya mtumiaji.
Ubunifu kuu:
- Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²ΡΠ½ΠΎΡΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ flowtable Π½Π° ΡΡΠΎΡΠΎΠ½Ρ ΡΠ΅ΡΠ΅Π²ΠΎΠ³ΠΎ Π°Π΄Π°ΠΏΡΠ΅ΡΠ°, Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌΠ°Ρ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠ»Π°Π³Π° βoffloadβ. Flowtable ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΡΠΈ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΏΡΠΎΡ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΡΠ΅ΠΏΠΎΡΠ΅ΠΊ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΠ°Π²ΠΈΠ» ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ°, Π° Π²ΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ Π² ΠΏΠΎΡΠΎΠΊΠ΅ ΠΏΡΠΎΠ±ΡΠ°ΡΡΠ²Π°ΡΡ Π½Π°ΠΏΡΡΠΌΡΡ. table ip global { flowtable f { hook ingress priority filter + 1 devices = { lan3, lan0, wan } flags offload } chain forward { type filter hook forward priority filter; policy accept; ip protocol { tcp, udp } flow add @f } chain post { type nat hook postrouting priority filter; policy accept; oifname Β«wanΒ» masquerade } }
- ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»Π΅Π½ΠΈΡ ΠΊ ΡΠ°Π±Π»ΠΈΡΠ΅ ΡΠ»Π°Π³Π° Π΄Π»Ρ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΠΊ Π²Π»Π°Π΄Π΅Π»ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΡΠΊΡΠΊΠ»ΡΠ·ΠΈΠ²Π½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ. ΠΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΏΡΠΈΠ²ΡΠ·Π°Π½Π½Π°Ρ ΠΊ Π½Π΅ΠΌΡ ΡΠ°Π±Π»ΠΈΡΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΄Π°Π»ΡΠ΅ΡΡΡ. ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ Π² Π΄Π°ΠΌΠΏΠ΅ ΠΏΡΠ°Π²ΠΈΠ» Π² ΡΠΎΡΠΌΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡ: table ip x { # progname nft flags owner chain y { type filter hook input priority filter; policy accept; counter packets 1 bytes 309 } }
- ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ IEEE 802.1ad (VLAN stacking ΠΈΠ»ΠΈ QinQ), ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠ΅ΠΉ ΡΡΠ΅Π΄ΡΡΠ²Π° Π΄Π»Ρ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ΅Π³ΠΎΠ² VLAN Π² ΠΎΠ΄ΠΈΠ½ ΠΊΠ°Π΄Ρ Ethernet. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΈΠΏΠ° Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ Ethernet-ΠΊΠ°Π΄ΡΠ° 8021ad ΠΈ vlan id=342 ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ β¦ ether type 802.1ad vlan id 342 Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΡΠΈΠΏΠ° Ethernet-ΠΊΠ°Π΄ΡΠ° 8021ad/vlan id=1, Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ 802.1q/vlan id=2 ΠΈ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΉ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΡΡΠΈΠΈ IP-ΠΏΠ°ΠΊΠ΅ΡΠ°: β¦ ether type 8021ad vlan id 1 vlan type 8021q vlan id 2 vlan type ip counter
- ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠ½ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΠΈ cgroups v2. ΠΠ»ΡΡΠ΅Π²ΡΠΌ ΠΎΡΠ»ΠΈΡΠΈΠ΅ΠΌ cgroups v2 ΠΎΡ v1 ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΉ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΠΈ cgroups Π΄Π»Ρ Π²ΡΠ΅Ρ Π²ΠΈΠ΄ΠΎΠ² ΡΠ΅ΡΡΡΡΠΎΠ², Π²ΠΌΠ΅ΡΡΠΎ ΡΠ°Π·Π΄Π΅Π»ΡΠ½ΡΡ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΠΉ Π΄Π»Ρ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ² CPU, Π΄Π»Ρ ΡΠ΅Π³ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ Π΄Π»Ρ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π»ΠΈ ΠΏΡΠ΅Π΄ΠΎΠΊ ΡΠΎΠΊΠ΅ΡΠ° Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ cgroupv2 ΠΌΠ°ΡΠΊΠ΅ Β«system.sliceΒ» ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΡΡΠΊΡΠΈΡ: β¦ socket cgroupv2 level 1 Β«system.sliceΒ»
- ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΎΡΡΠ°Π²Π½ΡΡ ΡΠ°ΡΡΠ΅ΠΉ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² SCTP (Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ ΠΏΠΎΡΠ²ΠΈΡΡΡ Π² ΡΠ΄ΡΠ΅ Linux 5.14). ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π°Π»ΠΈΡΠΈΡ Π² ΠΏΠ°ΠΊΠ΅ΡΠ΅ chunk-Π° Ρ ΡΠΈΠΏΠΎΠΌ βdataβ ΠΈ ΠΏΠΎΠ»Π΅ΠΌ βtypeβ: β¦ sctp chunk data exists β¦ sctp chunk data type 0
- ΠΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π² Π΄Π²Π° ΡΠ°Π·Π° ΡΡΠΊΠΎΡΠ΅Π½ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΏΡΠ°Π²ΠΈΠ» ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠ»Π°Π³Π° Β«-fΒ». Π’Π°ΠΊΠΆΠ΅ ΡΡΠΊΠΎΡΠ΅Π½ Π²ΡΠ²ΠΎΠ΄Π° ΡΠΏΠΈΡΠΊΠ° ΠΏΡΠ°Π²ΠΈΠ».
- ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½Π°Ρ ΡΠΎΡΠΌΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π±ΠΈΡΠΎΠ² Π² ΡΠ»Π°Π³Π°Ρ . ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ, ΡΡΠΎ Π±ΠΈΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ snat ΠΈ dnat Π½Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ: β¦ ct status ! snat,dnat Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ, ΡΡΠΎ Π±ΠΈΡ syn ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π² Π±ΠΈΡΠΎΠ²ΠΎΠΉ ΠΌΠ°ΡΠΊΠ΅ syn,ack: β¦ tcp flags syn / syn,ack Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ, ΡΡΠΎ Π±ΠΈΡΡ fin ΠΈ rst Π½Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ Π² Π±ΠΈΡΠΎΠ²ΠΎΠΉ ΠΌΠ°ΡΠΊΠ΅ syn,ack,fin,rst: β¦ tcp flags != fin,rst / syn,ack,fin,rst
- Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° Β«verdictΒ» Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡΡ typeof Π΄Π»Ρ set/map: add map x m { typeof iifname . ip protocol . th dport : verdict ;}
Chanzo: opennet.ru