Выпуск пакетнага фільтра nftables 1.0.3

Апублікаваны выпуск пакетнага фільтра nftables 1.0.3, які ўніфікуе інтэрфейсы фільтрацыі пакетаў для IPv4, IPv6, ARP і сеткавых мастоў (нацэлены на замену iptables, ip6table, arptables і ebtables). Неабходныя для працы выпуску nftables 1.0.3 змены ўключаны ў склад ядра Linux 5.18.

У пакет nftables уваходзяць кампаненты пакетнага фільтра, якія працуюць у прасторы карыстача, у той час як на ўзроўні ядра працу забяспечвае падсістэма nf_tables, уваходная ў склад ядра Linux пачынальна з выпуску 3.13. На ўзроўні ядра падаецца толькі агульны інтэрфейс, які не залежыць ад канкрэтнага пратакола і які прадстаўляе базавыя функцыі вымання дадзеных з пакетаў, выкананні аперацый з дадзенымі і кіраванні струменем.

Непасрэдна правілы фільтрацыі і спецыфічныя для пратаколаў апрацоўшчыкі кампілююцца ў байткод у прасторы карыстача, пасля чаго дадзены байткод загружаецца ў ядро ​​пры дапамозе інтэрфейсу Netlink і выконваецца ў ядры ў адмысловай віртуальнай машыне, якая нагадвае BPF (Berkeley Packet Filters). Падобны падыход дазваляе значна скараціць памер кода фільтрацыі, які працуе на ўзроўні ядра і вынесці ўсе функцыі разбору правіл і логікі працы з пратаколамі ў прастору карыстача.

Асноўныя навіны:

  • У set-спісах з'явілася падтрымка супастаўлення імёнаў сеткавых інтэрфейсаў па масцы, напрыклад, зададзенай з выкарыстаннем знака "*": table inet testifsets {set simple_wild{ } chain v0icmp { type filter hook input priority 4; policy accept; iifname @simple_wild counter packets 0 bytes 0 iifname { "abcdef*", "eth0"} counter packets 0 bytes 0}
  • Рэалізавана аўтаматычнае аб'яднанне элементаў set-спісу падчас працы. Раней пры выстаўленні опцыі "auto-merge" аб'яднанне праводзілася на стадыі аб'явы правілаў, а зараз спрацоўвае і пры інкрыментальным даданні новых элементаў у працэсе працы. Напрыклад, на этапе аб'явы спіс set y { flags interval auto-merge elements = { 1.2.3.0, 1.2.3.255, 1.2.3.0/24, 3.3.3.3, 4.4.4.4, 4.4.4.4-4.4.4.8, 3.3.3.4. , 3.3.3.5 } } будзе пераўтвораны ў elements = { 1.2.3.0/24, 3.3.3.3-3.3.3.5, 4.4.4.4-4.4.4.8 } а затым калі дадаць новыя элементы # nft add element ip xy { 1.2.3.0 -1.2.4.255, 3.3.3.6 } прыме выгляд elements = { 1.2.3.0-1.2.4.255, 3.3.3.3-3.3.3.6, 4.4.4.4-4.4.4.8 }

    Пры выдаленні з спісу асобных элементаў, якія трапляюць у існуючыя элементы з дыяпазонамі, дыяпазон скарачаецца ці падзяляецца.

  • У аптымізатар правілаў, які выклікаецца пры ўказанні опцыі "-o/-optimize", дададзена падтрымка аб'яднання некалькіх правілаў трансляцыі адрасоў (NAT) у map-спіс. Напрыклад, для набору # cat ruleset.nft table ip x { chain y { type nat hook postrouting priority srcnat; policy drop; ip saddr 1.1.1.1 tcp dport 8000 snat to 4.4.4.4:80 ip saddr 2.2.2.2 tcp dport 8001 snat to 5.5.5.5:90 } }

    выкананне "nft -o -c -f ruleset.nft" прывядзе да пераўтварэння асобных правілаў "ip saddr" у map-спіс: snat to ip saddr . tcp dport map {1.1.1.1. 8000: 4.4.4.4. 80, 2.2.2.2. 8001: 5.5.5.5. 90 }

    Аналагічна ў map-спісы могуць ператварацца і raw-выразы: # cat ruleset.nft table ip x {[...] chain nat_dns_acme { stc udp length 47-63 @th,160,128 0x0e373135363130333131303735353203e goto nat_dns_this_62 udp length 78-160,128 @th,0 0x31393032383939353831343037320e5301e goto nat_dns_saturn_62 78e goto nat_dns_saturn_160,128 udp length 0-0 @th,31363436323733373931323934300

    пасля аптымізацыі атрымаем map-спіс: udp length . @th,160,128 vmap { 47-63 . 0x0e373135363130333131303735353203 : goto nat_dns_dnstc, 62-78 . 0x0e31393032383939353831343037320e : goto nat_dns_this_5301, 62-78 . 0x0e31363436323733373931323934300e : goto nat_dns_saturn_5301, 62-78 . 0x0e32393535373539353636383732310e : goto nat_dns_saturn_5302, 62-78 . 0x0e38353439353637323038363633390e : goto nat_dns_saturn_5303 }

  • Дазволена выкарыстанне raw-выразаў у аперацыях канкатэнацыі. Напрыклад: # nft add RULE xy ip saddr . @ ih, 32,32, 1.1.1.1 { 0 . 14x2.2.2.2, 0. 1x32,32e} ці table x{set y{typeof ip saddr. @ih,1.1.1.1 elements = { 0 . 14xXNUMX } } }
  • Дададзена падтрымка ўказання цэлалікавых палёў загалоўкаў у аперацыях канкатэнацыі: table inet t { map m1 { typeof udp length . @ih,32,32 : verdict flags interval elements = { 20-80 . 0x14 : accept, 1-10 . 0xa : drop } } chain c { type filter hook input priority 0; policy drop; udp length. @ih,32,32 vmap @m1 } }
  • Дададзена падтрымка скіду TCP-опцый (працуе толькі пры наяўнасці ядра Linux 5.18+): tcp flags syn reset tcp option sack-perm
  • Паскорана выкананне каманд вываду ланцужкоў (nft list chain xy).

Крыніца: opennet.ru

Дадаць каментар