На рівні ядра надається лише загальний інтерфейс, який залежить від конкретного протоколу і надає базові функції вилучення даних із пакетів, виконання операцій із даними та управління потоком. Безпосередньо логіка фільтрації та специфічні для протоколів обробники компілюються в байткод у просторі користувача, після чого даний байткод завантажується в ядро за допомогою інтерфейсу Netlink та виконується у спеціальній віртуальній машині, що нагадує BPF (Berkeley Packet Filters). Подібний підхід дозволяє значно скоротити розмір коду фільтрації, що працює на рівні ядра і винести всі функції аналізу правил і логіки роботи з протоколами в простір користувача.
Основні нововведення:
- Підтримка зіставлення пакетів за часом. Можна визначити як діапазони часу та дат, у яких спрацьовуватиме правило, так і налаштувати спрацьовування в окремі дні тижня. Також додано нову опцію «-T» для виведення епохального часу в секундах.
meta time "2019-12-24 16:00" - "2020-01-02 7:00"
meta hour "17:00" - "19:00"
meta day "Fri" - Підтримка відновлення та збереження міток SELinux (secmark).
ct secmark set meta secmark
meta secmark set ct secmark - Підтримка map-списків synproxy, що дозволяють визначати більше одного правила на бекенд.
table ip foo {
synproxy https-synproxy {
mss 1460
wscale 7
timestamp sack-perm
}synproxy other-synproxy {
mss 1460
wscale 5
}chain pre {
type filter hook prerouting priority raw; policy accept;
tcp dport 8888 tcp flags syn notrack
}chain bar {
type filter hook forward priority filter; policy accept;
ct state invalid,untracked synproxy name ip saddr map { 192.168.1.0/24 : "https-synproxy", 192.168.2.0/24 : "other-synproxy" }
}
} - Можливість динамічного видалення елементів set-наборів із правил обробки пакетів.
nft add rule … delete @set5 { ip6 saddr . ip6 daddr }
- Підтримка зіставлення VLAN по ідентифікатору та протоколу, визначених у метаданих інтерфейсу мережного моста;
meta ibrpvid 100
meta ibrvproto vlan - Опція "-t" ("-terse") для виключення елементів set-наборів при відображенні правил. Під час виконання «nft -t list ruleset» буде виведено:
table ip x {
set y {
type ipv4_addr
}
}А при "nft list ruleset"
table ip x {
set y {
type ipv4_addr
elements = { 192.168.10.2, 192.168.20.1,
192.168.4.4, 192.168.2.34}
}
} - Можливість вказівки більше одного пристрою в ланцюжках netdev (працює лише з ядром 5.5) для поєднання типових правил фільтрації.
add table netdev x
add chain netdev xy { \
type filter hook ingress devices = { eth0, eth1 } priority 0;
} - Можливість додавання описів типів даних.
# nft describe ipv4_addr
datatype ipv4_addr (IPv4 address) (basetype integer), 32 bits - Можливість складання CLI-інтерфейсу з бібліотекою linenoise замість libreadline.
./configure —with-cli=linenoise
Джерело: opennet.ru