Опубліковано випуск пакетного фільтра nftables 1.0.7, що уніфікує інтерфейси фільтрації пакетів для IPv4, IPv6, ARP та мережевих мостів (націлений на заміну iptables, ip6table, arptables та ebtables). У пакет nftables входять компоненти пакетного фільтра, що працюють у просторі користувача, у той час як на рівні ядра роботу забезпечує підсистема nf_tables, що входить до складу ядра Linux, починаючи з випуску 3.13. На рівні ядра надається лише загальний інтерфейс, який залежить від конкретного протоколу і надає базові функції вилучення даних із пакетів, виконання операцій із даними та управління потоком.
Безпосередньо правила фільтрації та специфічні для протоколів обробники компілюються в байткод у просторі користувача, після чого даний байткод завантажується в ядро за допомогою інтерфейсу Netlink та виконується в ядрі у спеціальній віртуальній машині, що нагадує 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. 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 xy { 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 xy table ip x { set y { typeof ip daddr . tcp dport size 65535 flags dynamic,timeout last timeout 1h elements = { 172.217.17.14 . 443 останній використаний 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 останній використаний 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 xy { 8.8.8.8 } # ping -c 2 8.8.8.8 # nft list 4 quota over 65535 mbytes used 10000 bytes } } chain y { type filter hook egress device «eth8.8.8.8» 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