Нивото на ядрото предоставя само общ интерфейс, независим от протокола, който осигурява основни функции за извличане на данни от пакети, извършване на операции с данни и контрол на потока. Правилата за филтриране и манипулаторите, специфични за протокола, се компилират в байткод в потребителското пространство, след което този байткод се зарежда в ядрото с помощта на интерфейса Netlink и се изпълнява в ядрото в специална виртуална машина, напомняща BPF (Berkeley Packet Filters). Този подход ви позволява значително да намалите размера на филтриращия код, работещ на ниво ядро, и да преместите всички функции на правилата за анализ и логиката за работа с протоколи в потребителското пространство.
Основни иновации:
- Към наборите е добавена поддръжка за броячи на пакети и трафик, свързани с елементи на набор. Броячите се активират чрез ключовата дума „брояч“:
таблица ip x {
задайте y {
typeof ip saddr
противодействие на
елементи = {192.168.10.35, 192.168.10.101, 192.168.10.135}
}верига z {
тип филтър кука филтър за приоритет на изхода; политика приема;
ip daddr @y
}
} - За да зададете първоначалните стойности на броячите, например, за да възстановите предишни броячи след рестартиране, можете да използвате командата „nft -f“:
# cat ruleset.nft
таблица ip x {
задайте y {
typeof ip saddr
противодействие на
елементи = {192.168.10.35 брояч на пакети 1 байта 84, 192.168.10.101 \
брояч p 192.168.10.135 брояч пакети 0 байта 0 }
}верига z {
тип филтър кука филтър за приоритет на изхода; политика приема;
ip daddr @y
}
}
# nft -f набор от правила.nft
Набор от правила за списък #nft
таблица ip x {
задайте y {
typeof ip saddr
противодействие на
елементи = {192.168.10.35 брояч на пакети 1 байта 84, 192.168.10.101 \
брояч p 192.168.10.135 брояч пакети 0 байта 0 }
}верига z {
тип филтър кука филтър за приоритет на изхода; политика приема;
ip daddr @y
}
} - Поддръжката на контра също е добавена към таблицата на потока:
таблица ip foo {
лента с таблица на потока {
приоритет на влизане на кука -100
устройства = {eth0, eth1}
противодействие на
}верига напред {
тип филтър кука напред приоритетен филтър;
flow add @bar брояч
}
}Можете да видите списъка с броячи, като използвате командата “conntrack -L”:
tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47278 dport=5201 пакети=9 байта=608 \
src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47278 пакети=8 байта=428 [OFFLOAD] mark=0 \
secctx=null use=2 tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47280 dport=5201 \
пакети=1005763 байта=44075714753 src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47280 \
пакети=967505 байта=50310268 [ИЗКЛЮЧВАНЕ] маркировка=0 secctx=нулева употреба=2 - В комплекти за конкатенация (конкатенация, определени пакети от адреси и портове, които опростяват сравнението) е възможно да се използва директивата „typeof“, която определя типа данни на елементите за съставните части на елементите на набора:
таблица ip foo {
задаване на бял списък {
typeof ip saddr. tcp dport
елементи = { 192.168.10.35 . 80, 192.168.10.101. 80}
}верижен прът {
тип филтър кука филтър с приоритет за предварително насочване; спад на политиката;
ip daddr. tcp dport @whitelist приеме
}
} - Директивата typeof вече се прилага и за обединения в списъци с карти:
таблица ip foo {
map addr2mark {
typeof ip saddr. tcp dport : мета маркировка
елементи = { 192.168.10.35 . 80 : 0x00000001,
192.168.10.135. 80 : 0x00000002 }
}верижен прът {
тип филтър кука филтър с приоритет за предварително насочване; спад на политиката;
мета маркировка, зададена ip daddr. tcp dport map @addr2mark приемам
}
} - Добавена е поддръжка за обединяване на диапазони в анонимни (ненаименувани) комплекти:
# nft добавяне на правило inet филтър input ip daddr. tcp dport\
{ 10.0.0.0/8 . 10-23, 192.168.1.1-192.168.3.8. 80-443 } приемам - Осигурена е възможност за отхвърляне на пакети с 802.1q (VLAN) флагове при обработка на мрежови мостове:
# nft добавяне на правило мост foo bar ether тип vlan отказ с tcp нулиране
- Добавена е поддръжка за съвпадение по идентификатор на TCP сесия (conntrack ID). За да определите conntrack ID, можете да използвате опцията „--output id“:
# conntrack -L —изходен идентификатор
udp 17 18 src=192.168.2.118 dst=192.168.2.1 sport=36424 dport=53 пакета=2 \
байтове=122 src=192.168.2.1 dst=192.168.2.118 спорт=53 dport=36424 пакети=2 байта=320 \
[УВЕРЕН] mark=0 use=1 id=2779986232# nft добавяне на правило foo bar ct id 2779986232 брояч
Източник: opennet.ru