пускане на пакетния филтър , развиващ се в качеството на замяна на iptables, ip6table, arptables и ebtables чрез унификация на интерфейсите за филтриране на пакети за IPv4, IPv6, ARP и мрежови мостове. Пакетът nftables включва компоненти на пакетния филтър, работещи в потребителското пространство, докато в ядрото работата се осъществява от подсистемата nf_tables, която е част от ядрото на Linux от версия 3.13. Необходимите за работа променливи за nftables 0.9.5 са включени в ядрото. .
На ниво ядро се предоставя единствено общ интерфейс, независим от конкретен протокол и осигуряващ базови функции за извличане на данни от пакети, извършване на операции с данни и управление на потока. Правилата за филтриране и специфичните за протокол обработчици се компилират в байт код в пространството на потребителя, след което този байт код се зарежда в ядрото чрез интерфейса Netlink и се изпълнява в ядрото в специализирана виртуална машина, наподобяваща BPF (Berkeley Packet Filters). Този подход позволява значително да се намали размерът на кода за филтриране, работещ в ядрото, и да се прехвърлят всички функции за анализ на правила и логиката на работа с протоколите в пространството на потребителя.
Основни нововъведения:
- В наборите е добавена поддръжка на броячи на пакети и трафик, свързани с елементите на набора. Броячите се активират с ключовата дума «counter»:
таблица ip x {
set y {
typeof ip saddr
counter
elements = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
}верига z {
type filter hook output priority filter; policy accept;
ip daddr @y
}
} - За задаване на начални стойности на броячите, например, за възстановяване на предишни броячи след рестартиране, в набора може да се използва командата «nft -f»:
# cat ruleset.nft
таблица ip x {
set y {
typeof ip saddr
counter
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 }
}верига z {
type filter hook output priority filter; policy accept;
ip daddr @y
}
}
# nft -f ruleset.nft
# nft list ruleset
таблица ip x {
set y {
typeof ip saddr
counter
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 }
}верига 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 }
counter
}chain forward {
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
