На рівні ядра надається лише загальний інтерфейс, який залежить від конкретного протоколу і надає базові функції вилучення даних із пакетів, виконання операцій із даними та управління потоком. Безпосередньо правила фільтрації та специфічні для протоколів обробники компілюються в байткод у просторі користувача, після чого даний байткод завантажується в ядро за допомогою інтерфейсу Netlink і виконується в ядрі у спеціальній віртуальній машині, що нагадує BPF (Berkeley Packet Filters). Подібний підхід дозволяє значно скоротити розмір коду фільтрації, що працює на рівні ядра і винести всі функції аналізу правил і логіки роботи з протоколами в простір користувача.
Основні нововведення:
- До наборів додано підтримку лічильників пакетів та трафіку, прив'язаних до елементів набору. Лічильники включаються за допомогою ключового слова «counter»:
table ip x {
set y {
typeof ip saddr
протидія
elements = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
}chain z {
type filter hook output priority filter; policy accept;
ip daddr @y
}
} - Для встановлення початкових значень лічильників, наприклад, для відновлення минулих лічильників після перезапуску набору можна використовувати команду «nft -f»:
# cat ruleset.nft
table ip x {
set y {
typeof ip saddr
протидія
elements = { 192.168.10.35 counter packets 1 bytes 84, 192.168.10.101 \
counter p 192.168.10.135 counter packets 0 bytes 0 }
}chain z {
type filter hook output priority filter; policy accept;
ip daddr @y
}
}
# nft -f ruleset.nft
# nft list ruleset
table ip x {
set y {
typeof ip saddr
протидія
elements = { 192.168.10.35 counter packets 1 bytes 84, 192.168.10.101 \
counter p 192.168.10.135 counter packets 0 bytes 0 }
}chain z {
type filter hook output priority filter; policy accept;
ip daddr @y
}
} - Підтримка лічильників також додана у flowtable:
table ip foo {
flowtable bar {
hook ingress priority -100
devices = { eth0, eth1 }
протидія
}ланцюг вперед {
type filter hook forward priority filter;
flow add @bar counter
}
}Подивитися список лічильників можна командною «conntrack-L»:
tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47278 dport=5201 packets=9 bytes=608 \
src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47278 packets=8 bytes=428 [OFFLOAD] mark=0 \
secctx=null use=2 tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47280 dport=5201 \
packets=1005763 bytes=44075714753 src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47280 \
packets=967505 bytes=50310268 [OFFLOAD] mark=0 secctx=null use=2 - У наборах для приєднань (concatenation, певні зв'язки адрес і портів, що спрощують зіставлення) забезпечена можливість використання директиви «typeof», що визначає тип даних елементів для складових елементів набору:
table ip foo {
set whitelist {
typeof ip saddr. tcp dport
elements = {192.168.10.35. 80, 192.168.10.101. 80 }
}chain bar {
type filter hook prerouting priority filter; policy drop;
ip daddr. tcp dport @whitelist accept
}
} - Директива typeof тепер також застосовна для приєднань у map-списках:
table ip foo {
map addr2mark {
typeof ip saddr. tcp dport: meta mark
elements = {192.168.10.35. 80: 0x00000001,
192.168.10.135. 80: 0x00000002 }
}chain bar {
type filter hook prerouting priority filter; policy drop;
meta mark set ip daddr. tcp dport map @addr2mark accept
}
} - Додано підтримку приєднань з діапазонами в анонімних (неіменованих) наборах:
# nft add rule inet filter input ip daddr. tcp dport \
{10.0.0.0/8. 10-23, 192.168.1.1-192.168.3.8. 80-443} accept - Надано можливість відкидання пакетів з прапорами 802.1q (VLAN) при обробці мережевих мостів:
# nft add rule bridge foo bar ether type vlan reject with tcp reset
- Додано підтримку зіставлення по ідентифікатору TCP-сеансу (conntrack ID). Для визначення conntrack ID можна використовувати опцію «output id»:
# conntrack -L -output id
udp 17 18 src=192.168.2.118 dst=192.168.2.1 sport=36424 dport=53 packets=2 \
bytes=122 src=192.168.2.1 dst=192.168.2.118 sport=53 dport=36424 packets=2 bytes=320 \
[ASSURED] mark=0 use=1 id=2779986232# nft add rule foo bar ct id 2779986232 counter
Джерело: opennet.ru