Публикувана е версия на пакетния филтър nftables 1.0.7, която унифицира интерфейсите за филтриране на пакети за IPv4, IPv6, ARP и мрежови мостове (намерена да замени iptables, ip6tables, arptables и ebtables). В пакетa nftables са включени компоненти на пакетния филтър, работещи в пространството на потребителя, докато на ядрото работи подсистемата nf_tables, която е част от ядрото на Linux от версия 3.13. На ядрено ниво се предоставя само общ интерфейс, независим от конкретния протокол, който предлага основни функции за извличане на данни от пакети, извършване на операции с данни и управление на потока.
Правилата за филтриране и специфичните за протоколите обработчици се компилират в байткод в пространството на потребителя, след което този байткод се зарежда в ядрото чрез интерфейса Netlink и се изпълнява в ядрото в специален, наподобяващ BPF (Berkeley Packet Filters). Подобен подход позволява значително да се намали размерът на кода за филтриране, работещ в ядрото, и да се изнесат всички функции за разбиране на правилата и логиката за работа с протоколите в пространството на потребителя. виртуална машина,което наподобява BPF (Berkeley Packet Filters). Подобен подход позволява значително да се намали размерът на кода за филтриране, работещ в ядрото, и да се изнесат всички функции за разбиране на правилата и логиката на работа с протоколите в пространството на потребителя.
Основни промени:
- За системи с ядро Linux 6.2+ е добавена поддръжка за съпоставяне на протоколи vxlan, geneve, gre и gretap, което позволява използването на прости изрази за проверка на заглавията в инкапсулирани пакети. Например, за проверка на IP адреси в заглавието на вложения пакет от VxLAN, вече можете да използвате правила (без необходимост от предварително декопиране на заглавието VxLAN и свързване на филтъра към интерфейса vxlan0): … udp dport 4789 vxlan ip protocol udp … udp dport 4789 vxlan ip saddr 1.2.3.0/24 … udp dport 4789 vxlan ip saddr . vxlan ip daddr { 1.2.3.4 . 4.3.2.1 }
- Внедрена е поддръжка за автоматично обединяване на остатъци след частично изтриване на елемент от set-списъка, което позволява премахване на елемент или част от диапазон от съществуващ диапазон (по-рано диапазонът можеше да бъде премахнат само изцяло). Например, след премахването на елемент 25 от set-списъка с диапазони 24-30 и 40-50 в списъка ще останат 24, 26-30 и 40-50. Поправки, необходими за функционирането на автоматичното обединяване, ще бъдат предложени в коригиращи версии на стабилни клони на ядрото 5.10+. # nft list ruleset table ip x { set y { typeof tcp dport flags interval auto-merge elements = { 24-30, 40-50 } } } # nft delete element ip x y { 25 } # nft list ruleset table ip x { set y { typeof tcp dport flags interval auto-merge elements = { 24, 26-30, 40-50 } } }
- Разрешено е използването на контактни данни и диапазони при мапинг на транслация на адреси (NAT). table ip nat { chain prerouting { type nat hook prerouting priority dstnat; policy accept; dnat to ip daddr . tcp dport map { 10.1.1.136 . 80 : 1.1.2.69 . 1024, 10.1.1.10-10.1.1.20 . 8888-8889 : 1.1.2.69 . 2048-2049 } persistent } }
- Добавена поддръжка на израза «last», който позволява да се определи времето на последната употреба на елемент от правило или set-списък. Поддръжката е налична от ядрото на Linux 5.14. table ip x { set y { typeof ip daddr . tcp dport size 65535 flags dynamic,timeout last timeout 1h } chain z { type filter hook output priority filter; policy accept; update @y { ip daddr . tcp dport } } } # nft list set ip x y table ip x { set y { typeof ip daddr . tcp dport size 65535 flags dynamic,timeout last timeout 1h elements = { 172.217.17.14 . 443 last used 1s591ms timeout 1h expires 59m58s409ms, 172.67.69.19 . 443 last used 4s636ms timeout 1h expires 59m55s364ms, 142.250.201.72 . 443 last used 4s748ms timeout 1h expires 59m55s252ms, 172.67.70.134 . 443 last used 4s688ms timeout 1h expires 59m55s312ms, 35.241.9.150 . 443 last used 5s204ms timeout 1h expires 59m54s796ms, 138.201.122.174 . 443 last used 4s537ms timeout 1h expires 59m55s463ms, 34.160.144.191 . 443 last used 5s205ms timeout 1h expires 59m54s795ms, 130.211.23.194 . 443 last used 4s436ms timeout 1h expires 59m55s564ms } } }
- Добавена възможност за определяне на квоти в set-списъци. Например, за определяне на квота за трафик за всеки целеви IP адрес, можете да посочите: table netdev x { set y { typeof ip daddr size 65535 quota over 10000 mbytes } chain y { type filter hook egress device «eth0» priority filter; policy accept; ip daddr @y drop } } # nft add element inet x y { 8.8.8.8 } # ping -c 2 8.8.8.8 # nft list ruleset table netdev x { set y { type ipv4_addr size 65535 quota over 10000 mbytes elements = { 8.8.8.8 quota over 10000 mbytes used 196 bytes } } chain y { type filter hook egress device «eth0» priority filter; policy accept; ip daddr @y drop } }
- Разрешено е използването на константи в set-списъци. Например, при използване като ключ за списъка на адреса на дестинацията и идентификатора на VLAN можете директно да посочите номера на VLAN (daddr . 123): table netdev t { set s { typeof ether saddr . vlan id size 2048 flags dynamic,timeout timeout 1m } chain c { type filter hook ingress device eth0 priority 0; policy accept; ether type != 8021q update @s { ether daddr . 123 } counter } }
- Добавена е нова команда «destroy» за безусловно премахване на обекти (в отличие от командата delete не генерира ENOENT при опит за изтриване на не съществуващ обект). За работа е необходимо ядрото на Linux поне версия 6.3-rc. destroy table ip filter
Източник: opennet.ru
