Публикувана е версия на пакетния филтър nftables 1.0.6, която унифицира интерфейсите за пакетна филтрация за IPv4, IPv6, ARP и мрежови мостове (с намерение да замени iptables, ip6tables, 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 daddr 2.2.3.0/24 accept meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.4.0-2.2.4.10 accept meta iifname eth2 ip saddr 1.1.1.3 ip daddr 2.2.2.5 accept } } след изпълнението на „nft -o -c -f ruleset.nft“ ще бъдат преобразувани, както следва: ruleset.nft:4:17-74: meta iifname eth1 ip saddr 1.1.1.1 ip daddr 2.2.2.3 accept ruleset.nft:5:17-74: meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.2.4 accept ruleset.nft:6:17-77: meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.3.0/24 accept ruleset.nft:7:17-83: meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.4.0-2.2.4.10 accept ruleset.nft:8:17-74: meta iifname eth2 ip saddr 1.1.1.3 ip daddr 2.2.2.5 accept into: iifname . ip saddr . ip daddr { eth1 . 1.1.1.1 . 2.2.2.3, eth1 . 1.1.1.2 . 2.2.2.4, eth1 . 1.1.1.2 . 2.2.3.0/24, eth1 . 1.1.1.2 . 2.2.4.0-2.2.4.10, eth2 . 1.1.1.3 . 2.2.2.5 } 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 "On traffic we trust" iifname "enp0s31f6" ip saddr { 209.115.181.102, 216.197.228.230 } ip daddr 10.0.0.149 udp sport 123 udp dport 32768-65535 accept iifname "enp0s31f6" ip saddr { 64.59.144.17, 64.59.150.133 } ip daddr 10.0.0.149 udp sport 53 udp dport 32768-65535 accept } } след изпълнение на «nft -o -c -f ruleset.nft» ще бъдат опаковани по следния начин: ruleset.nft:6:22-149: iifname "enp0s31f6" ip saddr { 209.115.181.102, 216.197.228.230 } ip daddr 10.0.0.149 udp sport 123 udp dport 32768-65535 accept ruleset.nft:7:22-143: iifname "enp0s31f6" ip saddr { 64.59.144.17, 64.59.150.133 } ip daddr 10.0.0.149 udp sport 53 udp dport 32768-65535 accept into: iifname . ip saddr . ip daddr . udp sport . udp dport { enp0s31f6 . 209.115.181.102 . 10.0.0.149 . 123 . 32768-65535, enp0s31f6 . 216.197.228.230 . 10.0.0.149 . 123 . 32768-65535, enp0s31f6 . 64.59.144.17 . 10.0.0.149 . 53 . 32768-65535, enp0s31f6 . 64.59.150.133 . 10.0.0.149 . 53 . 32768-65535 } 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
- Проблемите с добавянето на правила с интервали са решени: insert rule x y tcp sport { 3478-3497, 16384-16387 } counter accept
- Подобрено е JSON API, което вече поддържа изрази в set- и map-списъци.
- В разширенията на python-библиотеката nftables е разрешено зареждането на набори от правила за обработка в режим на проверка („-c“) и е добавена поддръжка за външно определяне на променливи.
- В елементите на set-списъците е разрешено добавянето на коментари.
- В byte ratelimit е разрешено задаването на нулева стойност.
Източник: opennet.ru
