Публикувано издание на пакетния филтър nftables 1.0.5, унифициращ интерфейсите за филтриране на пакети за IPv4, IPv6, ARP и мрежови мостове (намерението му е да замени iptables, ip6tables, arptables и ebtables). Паралелно с това е публикувана и изданието на придружаващата библиотека libnftnl 1.2.3, предоставяща нискоуровнев API за взаимодействие с подсистемата nf_tables.
В пакет nftables влизат компоненти на пакетния филтър, работещи в пространството на потребителя, докато на ниво ядро, работата се осигурява от подсистемата nf_tables, включена в ядрото на Linux, започвайки от версия 3.13. На ниво ядро се предоставя само общ интерфейс, независим от конкретен протокол, който предлага основни функции за извличане на данни от пакети, извършване на операции с данни и управление на потока.
Правилата за филтриране и специфичните за протоколите обработчици се компилират в байткод в пространството на потребителя, след което този байткод се зарежда в ядрото чрез интерфейса Netlink и се изпълнява в ядрото в специален, наподобяващ BPF (Berkeley Packet Filters). Подобен подход позволява значително да се намали размерът на кода за филтриране, работещ в ядрото, и да се изнесат всички функции за разбиране на правилата и логиката за работа с протоколите в пространството на потребителя. виртуална машина,което наподобява BPF (Berkeley Packet Filters). Подобен подход позволява значително да се намали размерът на кода за филтриране, работещ в ядрото, и да се изнесат всички функции за разбиране на правилата и логиката на работа с протоколите в пространството на потребителя.
Основни промени:
- В оптимизатора на правилата, извикван при указване на опция „-o/—optimize“, са решени проблемите с обединението на правила, списъци map и set. # 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 Обединяване: ruleset.nft:4:3-52: ip saddr 1.1.1.1 tcp dport 8000 snat to 4.4.4.4:80 ruleset.nft:5:3-52: ip saddr 2.2.2.2 tcp dport 8001 snat to 5.5.5.5:90 в: 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 }
- При обединяване на ethernet и vlan елементите е осигурено определяне на динамичен set списък, запълващ се на база параметрите на пътя на пакета. add table netdev x add chain netdev x y { type filter hook ingress device enp0s25 priority 0; } add set netdev x macset { typeof ether daddr . vlan id; flags dynamic,timeout; } add rule netdev x y update @macset { ether daddr . vlan id timeout 60s } add rule netdev x y ether saddr . vlan id { 0a:0b:0c:0d:0e:0f . 42, 0a:0b:0c:0d:0e:0f . 4095 } counter accept
- Настройката на правилата с map списъци, съдържащи маски в имената на интерфейсите, е наложена. table inet filter { chain INPUT { iifname vmap { «eth0» : jump input_lan, «wg*» : jump input_vpn } } chain input_lan {} chain input_vpn {} }
- Регресивните промени, водещи до неправилен лексически анализ на коректни правила, са отстранени.
- Решени са проблемите с бавната обработка и автоматичното обединение на големи списъци с елементи, определящи интервали от стойности.
- Отстранено е аварийното приключване при добавяне на елементи в некоректен set списък.
Източник: opennet.ru
