Опубліковано випуск пакетного фільтра nftables 1.0.6, що уніфікує інтерфейси фільтрації пакетів для IPv4, IPv6, ARP та мережевих мостів (націлений на заміну iptables, ip6table, arptables та ebtables). У пакет nftables входять компоненти пакетного фільтра, що працюють у просторі користувача, у той час як на рівні ядра роботу забезпечує підсистема nf_tables, що входить до складу ядра Linux, починаючи з випуску 3.13. На рівні ядра надається лише загальний інтерфейс, який залежить від конкретного протоколу і надає базові функції вилучення даних із пакетів, виконання операцій із даними та управління потоком.
Безпосередньо правила фільтрації та специфічні для протоколів обробники компілюються в байткод у просторі користувача, після чого даний байткод завантажується в ядро за допомогою інтерфейсу Netlink та виконується в ядрі у спеціальній віртуальній машині, що нагадує BPF (Berkeley Packet Filters). Подібний підхід дозволяє значно скоротити розмір коду фільтрації, що працює на рівні ядра і винести всі функції аналізу правил і логіки роботи з протоколами в простір користувача.
Основні зміни:
- В оптимізаторі правил, що викликається при вказівці опції «-o/—optimize», налагоджено автоматичне пакування правил через їх об'єднання та перетворення на map- та set-списки. Наприклад, правила # cat ruleset.nft table ip x {chain y { type filter hook input priority filter; policy drop; meta iifname eth1 ip saddr 1.1.1.1 ip daddr 2.2.2.3 accept meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.2.4 accept meta iifname eth1 ip saddr 1.1.1.2 ip 2.2.3.0 . 24 .1 ip daddr 1.1.1.2-2.2.4.0 accept meta iifname eth2.2.4.10 ip saddr 2 ip daddr 1.1.1.3 accept } } після виконання "nft -o -c -f ruleset.nft" будуть перетворені наступним чином: nft:2.2.2.5:4-17: meta iifname eth74 ip saddr 1 ip daddr 1.1.1.1 accept ruleset.nft:2.2.2.3:5-17: meta iifname eth74 ip saddr 1 ip daddr 1.1.1.2. 2.2.2.4:6-17: meta iifname eth77 ip saddr 1 ip daddr 1.1.1.2/2.2.3.0 accept ruleset.nft:24:7-17: meta iifname eth83 ip saddr 1 ip daddr 1.1.1.2. ruleset.nft:2.2.4.0:2.2.4.10-8: meta iifname eth17 ip saddr 74 ip daddr 2 accept into: iifname . ip saddr. ip daddr {eth1.1.1.3. 2.2.2.5. 1, eth1.1.1.1. 2.2.2.3. 1, eth1.1.1.2. 2.2.2.4. 1/1.1.1.2, eth2.2.3.0. 24. 1-1.1.1.2, eth2.2.4.0. 2.2.4.10. 2 } accept
- Оптимізатор також може перетворювати на більш компактну форму правила, в яких вже використовуються прості set-списки, наприклад правила: # cat ruleset.nft table ip filter { chain input { type filter hook input priority filter; policy drop; iifname «lo» accept ct state established,related accept comment «In traffic we originate, we trust» iifname «enp0s31f6» ip saddr {209.115.181.102, 216.197.228.230 10.0.0.149-123 accept iifname «enp32768s65535f0» ip saddr { 31, 6 } ip daddr 64.59.144.17 ruleset.nft:64.59.150.133:10.0.0.149-53: iifname "enp32768s65535f6" ip saddr { 22, 149 } ip daddr 0 udp sport 31 -6: iifname "enp209.115.181.102s216.197.228.230f10.0.0.149" ip saddr { 123, 32768 } ip daddr 65535 udp sport 7 udp dport 22-143 accept into: iifname . ip saddr. ip daddr. udp sport. udp dport {enp0s31f6. 64.59.144.17. 64.59.150.133. 10.0.0.149 . 53-32768, enp65535s0f31. 6. 209.115.181.102. 10.0.0.149 . 123-32768, enp65535s0f31. 6. 216.197.228.230. 10.0.0.149 . 123-32768, enp65535s0f31. 6. 64.59.144.17. 10.0.0.149 . 53-32768 } accept
- Вирішено проблему з генерацією байткоду для злиття інтервалів, у яких застосовуються типи з різним порядком байтів, наприклад IPv4 (мережевий байт) і meta mark (системний порядок байтів). table ip x {map w{typeof ip saddr. meta mark: verdict flags interval counter elements = {127.0.0.1-127.0.0.4. 0x123434-0xb00122: accept, 192.168.0.10-192.168.1.20. 0x0000aa00-0x0000aaff : accept, } } chain k { type filter hook input priority filter; policy drop; ip saddr. meta mark vmap @w } }
- Налагоджено зіставлення рідкісних протоколів під час використання raw-виразів, наприклад: meta l4proto 91 @th,400,16 0x0 accept
- Вирішені проблеми з включенням правил з інтервалами: counter accept
- Покращено API JSON, в якому з'явилася підтримка виразів у set- та map-списках.
- У розширеннях до python-бібліотеки nftables дозволено завантаження наборів правил обробки в режимі перевірки («-c») і додано підтримку зовнішнього визначення змінних.
- У елементах set-списків дозволено додавання коментарів.
- У Byte Ratelimit дозволено вказівки нульового значення.
Джерело: opennet.ru