Випуск пакетного фільтра nftables 0.9.9

Опубліковано випуск пакетного фільтра 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.

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

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

Основні нововведення:

  • Реалізовано можливість винесення обробки 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 інкапсуляції IP-пакету: … ether type 2ad vlan id 8021 vlan type 1q vlan id 8021 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 xm { typeof iifname . ip protocol. th dport : verdict ;}

Джерело: opennet.ru

Додати коментар або відгук