На рівні ядра надається лише загальний інтерфейс, який залежить від конкретного протоколу і надає базові функції вилучення даних із пакетів, виконання операцій із даними та управління потоком. Безпосередньо правила фільтрації та специфічні для протоколів обробники компілюються в байткод у просторі користувача, після чого даний байткод завантажується в ядро за допомогою інтерфейсу Netlink і виконується в ядрі у спеціальній віртуальній машині, що нагадує BPF (Berkeley Packet Filters). Подібний підхід дозволяє значно скоротити розмір коду фільтрації, що працює на рівні ядра і винести всі функції аналізу правил і логіки роботи з протоколами в простір користувача.
Основні нововведення:
- Підтримка діапазонів у приєднаннях (concatenation, певні зв'язки адрес і портів, що спрощують зіставлення). Наприклад, для набору "whitelist", елементи якого є приєднанням, вказівка прапора "interval" буде вказувати на те, що набір може включати діапазони в приєднанні (для приєднання "ipv4_addr. ipv4_addr. inet_service" раніше можна було перераховувати точні збіги виду "192.168.10.35. 192.68.11.123», а тепер можна вказувати групи адрес «80-192.168.10.35-192.168.10.40
table ip foo {
set whitelist {
type ipv4_addr. ipv4_addr. inet_service
flags interval
elements = {192.168.10.35-192.168.10.40. 192.68.11.123-192.168.11.125. 80 }
}chain bar {
type filter hook prerouting priority filter; policy drop;
ip saddr. ip daddr. tcp dport @whitelist accept
}
} - У наборах і map-списках забезпечено можливість використання директиви «typeof», що визначає формат елемента при зіставленні.
Наприклад:table ip foo {
set whitelist {
typeof ip saddr
elements = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
}chain bar {
type filter hook prerouting priority filter; policy drop;
ip daddr @whitelist accept
}
}table ip foo {
map addr2mark {
typeof ip saddr: meta mark
elements = { 192.168.10.35 : 0x00000001, 192.168.10.135 : 0x00000002 }
}
} - Додано можливість використання приєднань у NAT-прив'язках, що дозволяє вказувати адресу та порт при визначенні NAT-перетворень на основі map-списків або іменованих наборів:
nft add rule ip nat pre dnat ip addr . port to ip saddr map { 1.1.1.1 : 2.2.2.2 . 30 }
nft add map ip nat destinations { type ipv4_addr . inet_service: ipv4_addr. inet_service \\; }
nft add rule ip nat pre dnat ip addr . port to ip saddr. tcp dport map @destinations - Підтримка апаратного прискорення з винесенням деяких операцій фільтрації на плечі картки. Прискорення включається через утиліту ethtool ("ethtool -K eth0 hw-tc-offload on"), після чого активується в nftables для основного ланцюжка за допомогою прапора "offload". При використанні ядра Linux 5.6 підтримується апаратне прискорення для зіставлення полів заголовка та перевірки вхідного інтерфейсу у поєднанні з прийомом, відкиданням, дублюванням (dup) та перенаправленням (fwd) пакетів. У прикладі нижче операції відкидання пакетів, що надходять від адреси 192.168.30.20, виконуються на рівні мережевої карти, без передачі пакетів ядру:
# cat file.nft
table netdev x {
chain y {
type filter hook ingress device eth0 priority 10; flags offload;
ip saddr 192.168.30.20 drop
}
}
# nft -f file.nft - Поліпшено інформування місця помилки в правилах.
# nft delete rule ip yz handle 7
Error: Примітка.
delete rule ip yz handle 7
^# nft delete rule ip xx handle 7
Error: Примітка.
delete rule ip xx handle 7
^# nft delete table twst
Error: No such file or directory; did you mean table 'test' in family ip?
delete table twst
^^^^У першому прикладі показано, що таблиця «y» відсутня у системі, у другому, що відсутня обробник «7», а третьому, що виводиться підказка про друкарську помилку при наборі імені таблиці.
- Додано підтримку перевірки slave-інтерфейсу через вказівку «meta sdif» або «meta sdifname»:
… meta sdifname vrf1 …
- Додано підтримку операції зсуву вправо або вліво. Наприклад, для зсуву існуючої мітки пакета вліво на 1 біт і установки меншого біта в 1:
… meta mark set meta mark lshift 1 or 0x1 …
- Реалізовано опцію «-V» для відображення розширеної інформації про версію.
# nft -V
nftables v0.9.4 (Jive at Five)
cli: readline
json: yes
minigmp: no
libxtables: yes - Опції командного рядка обов'язково повинні вказуватися перед командами. Наприклад, потрібно вказувати nft -a list ruleset, а запуск nft list ruleset -a приведе до виведення помилки.
Джерело: opennet.ru