Публикувана версия на пакетния филтър nftables 1.0.6, която обединява интерфейсите за филтриране на пакети за IPv4, IPv6, ARP и мрежови мостове (наместо iptables, ip6tables, arptables и ebtables). Пакетът 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 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 в: 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 «На входния трафик, в който се доверяваме» 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 в: 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
