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

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

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

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

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

  • У set-спісы дададзена падтрымка элемента-маскі «*», які спрацоўвае для любых пакетаў, якія не падпадаюць пад іншыя элементы, вызначаныя ў наборы. table x { map blocklist { type ipv4_addr : verdict flags interval elements = { 192.168.0.0/16 : accept, 10.0.0.0/8 : accept, * : drop } } chain y { type filter hook prerouting priority 0; policy accept; ip saddr vmap @blocklist } }
  • Дана магчымасць вызначэння зменных з каманднага радка пры дапамозе опцыі «—define». # cat test.nft table netdev x {chain y{type filter hook ingress devices = $dev priority 0; policy drop; } } # nft -define dev=»{ eth0, eth1 }» -f test.nft
  • У map-спісах дазволена ўжыванне пастаянных (stateful) выразаў: table inet filter {map portmap{type inet_service: verdict counter elements = {22 counter packets 0 bytes 0: jump ssh_input, * counter packets } chain wan_input { tcp dport vmap @portmap } chain prerouting { type filter hook prerouting priority raw; policy accept; iif vmap { "lo": jump wan_input}}}
  • Дададзена каманда «list hooks» для вываду спісу апрацоўшчыкаў зададзенага сямейства пакетаў: # nft list hooks ip device eth0 0000000010 chain ip ab [nf_tables] +0000000300 chain inet mz [nf_tables] } hook forward { -0000000100 selinux_ipv0000000300_forward 0000000225 chain ip ac [nf_tables] } hook out hook postrouting { +4 selinux_ipv0000000000_postroute } }
  • У блоках «queue» можна камбінаваць выразы jhash, symhash і numgen для размеркавання пакетаў па чэргах у прасторы карыстача. … queue to symhash mod 65536 … queue flags bypass numgen inc mod 65536 … queue to jhash oif . meta mark mod 32 "queue" таксама можна спалучаць з map-спісамі для выбару чаргі ў прасторы карыстача на аснове адвольных ключоў. … queue flags bypass да матры name { "eth0" : 0, "ppp0" : 2, "eth1" : 2 }
  • Дадзеная магчымасць расчынення зменных, улучальных set-спіс, у некалькі map-ов. define interfaces = { eth0, eth1 } table ip x { chain y { type filter hook input priority 0; policy accept; iifname vmap { lo : accept, $interfaces : drop } } } # nft -f x.nft # nft list policy accept; iifname vmap { "lo": accept, "eth0": drop, "eth0": drop}}}
  • Дазволена камбінаванне vmap-ов (verdict map) з інтэрваламі: # nft add rule xy tcp dport . ip saddr vmap {1025-65535. 192.168.10.2 : accept }
  • Спрошчаны сінтаксіс супастаўленняў для NAT. Дазволена ўказанне дыяпазонаў адрасоў: … snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } ці відавочных IP-адрасоў і партоў: … dnat to ip saddr map { 10.141.11.4. 192.168.2.3} ці камбінацыі дыяпазонаў IP і партоў: … dnat to ip saddr . tcp dport map {80. 192.168.1.2: 80-10.141.10.2. 10.141.10.5-8888}

Крыніца: opennet.ru

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