На ўзроўні ядра падаецца толькі агульны інтэрфейс, які не залежыць ад канкрэтнага пратакола і які прадстаўляе базавыя функцыі вымання дадзеных з пакетаў, выкананні аперацый з дадзенымі і кіраванні струменем. Непасрэдна правілы фільтрацыі і спецыфічныя для пратаколаў апрацоўшчыкі кампілююцца ў байткод у прасторы карыстача, пасля чаго дадзены байткод загружаецца ў ядро пры дапамозе інтэрфейсу 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-192.68.11.123. 192.168.11.125-80»
table ip foo {
set whitelist {
тып 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 RU 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 RU 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: Выкарыстоўваецца ня process rule: Няма such file або directory
delete rule ip yz handle 7
^# nft delete rule ip xx handle 7
Error: Выкарыстоўваецца ня process rule: Няма such file або directory
delete rule ip xx handle 7
^# nft delete table twst
Error: Няма such file або 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