Випуск пакетного фільтра 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 } 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 udp length 78-160,128 0e goto nat_dns_saturn_0 udp length 31363436323733373931323934300-5301 @th,62

    після оптимізації отримаємо 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 {type of ip saddr. @ ih, 1.1.1.1, 0 elements = {14. XNUMXxXNUMX } } }
  • Додано підтримку вказівки цілих полів заголовків в операціях конкатенації: table inet t { map m1 { typeof udp length . @ ih, 32,32, 20: verdict flags interval elements = {80-0. 14x1: accept, 10-0. 0xa : drop } } chain c { type filter hook input priority 32,32; policy drop; udp length. @ih,1 vmap @mXNUMX } }
  • Додано підтримку скидання TCP-опцій (працює лише за наявності ядра Linux 5.18+): tcp flags syn reset tcp option sack-perm
  • Прискорено виконання команд виведення ланцюжків (nft list chain xy).

Джерело: opennet.ru

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