пускане на пакетния филтър , развиваща се като заместител на iptables, ip6tables, arptables и ebtables чрез унифициране на интерфейсите за филтриране на пакети за IPv4, IPv6, ARP и мрежови мостове. В пакет nftables влизат компоненти на пакетния филтър, работещи в пространството на потребителя, докато на ниво ядро работата се осигурява от подсистемата nf_tables, която е част от ядрото на Linux от версия 3.13. Необходимите за работата на версията nftables 0.9.4 изменения са включени в бъдещото ядро. .
На ниво ядро се предоставя единствено общ интерфейс, независим от конкретен протокол и осигуряващ базови функции за извличане на данни от пакети, извършване на операции с данни и управление на потока. Правилата за филтриране и специфичните за протокол обработчици се компилират в байт код в пространството на потребителя, след което този байт код се зарежда в ядрото чрез интерфейса Netlink и се изпълнява в ядрото в специализирана виртуална машина, наподобяваща BPF (Berkeley Packet Filters). Този подход позволява значително да се намали размерът на кода за филтриране, работещ в ядрото, и да се прехвърлят всички функции за анализ на правила и логиката на работа с протоколите в пространството на потребителя.
Основни нововъведения:
- Подкрепа за диапазони в присъединенията (конкатенация, определени комбинации от адреси и портове, опростяващи съпоставянето). Например, за набор „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 {
type 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 rule 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 rule 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 y z handle 7
Error: Не може да се обработи правилото: Такъв файл или директория не съществуват
delete rule ip y z handle 7
^# nft delete rule ip x x handle 7
Error: Не може да се обработи правилото: Такъв файл или директория не съществуват
delete rule ip x x handle 7
^# nft delete table twst
Error: Такъв файл или директория не съществуват; имате предвид таблица 'test' в семейство 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
