vydání paketového filtru , vyvíjející se jako náhrada za iptables, ip6tables, arptables a ebtables díky unifikaci rozhraní pro filtrování paketů pro IPv4, IPv6, ARP a síťové mosty. Balíček nftables obsahuje komponenty paketového filtr pro uživatelský prostor, zatímco na úrovni jádra zajišťuje práci subsystém nf_tables, který je součástí jádra Linux od verze 3.13. Nezbytné změny pro verzi nftables 0.9.5 jsou zahrnuty v jádře .
Na úrovni jádra je poskytováno pouze obecné rozhraní, které není závislé na konkrétním protokolu a poskytuje základní funkce pro extrakci dat z paketů, provádění operací s daty a řízení toku. Pravidla filtrování a specifické zpracovávače protokolů jsou přímo kompilovány do bajtkódu v uživatelském prostoru, po čemž je tento bajtkód nahrán do jádra pomocí rozhraní Netlink a prováděn v jádře ve speciálním virtuálním stroji, který připomíná BPF (Berkeley Packet Filters). Tento přístup výrazně zkracuje velikost kódu filtrování běžícího na úrovni jádra a přenáší všechny funkce zpracování pravidel a logiku práce s protokoly do uživatelského prostoru.
Hlavní novinky:
- Byla přidána podpora pro počítadla paketů a provozu vázaných na prvky souboru. Počítadla se aktivují pomocí klíčového slova „counter“:
tabulka ip x {
set y {
typeof ip saddr
counter
prvky = { 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
}
} - Pro nastavení počátečních hodnot počitadla, například pro obnovení minulých počitadla po restartu, lze použít příkaz „nft -f“:
# cat ruleset.nft
tabulka 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 }
}chain z {
type filter hook output priority filter; policy accept;
ip daddr @y
}
}
# nft -f ruleset.nft
# nft list ruleset
tabulka 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 }
}chain z {
type filter hook output priority filter; policy accept;
ip daddr @y
}
} - Podpora počitadla byla také přidána do flowtable:
tabulka ip foo {
flowtable bar {
hook ingress priority -100
devices = { eth0, eth1 }
counter
}chain forward {
type filter hook forward priority filter;
flow add @bar counter
}
}Seznam počitadla lze zobrazit příkazem „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 - V sadách pro spojení (konkatenaci, určené vazby adres a portů, usnadňující přiřazování) byla zajištěna možnost použití direktivy „typeof“, která určuje typ dat prvků pro složené části prvků souboru:
tabulka ip foo {
set whitelist {
typeof ip saddr . tcp dport
elements = { 192.168.10.35 . 80, 192.168.10.101 . 80 }
}řetězec bar {
typ filtru hook prerouting priorita filter; politika drop;
ip daddr . tcp dport @whitelist accept
}
} - Direktiva typeof je nyní také aplikovatelná pro spojení v mapových seznamích:
tabulka ip foo {
map addr2mark {
typeof ip saddr . tcp dport : meta mark
elements = { 192.168.10.35 . 80 : 0x00000001,
192.168.10.135 . 80 : 0x00000002 }
}řetězec bar {
typ filtru hook prerouting priorita filter; politika drop;
meta mark set ip daddr . tcp dport map @addr2mark accept
}
} - Byla přidána podpora spojení s rozsahy v anonymních (nepojmenovaných) seznamech:
# 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 - Byla poskytnuta možnost zahození paketů s příznaky 802.1q (VLAN) při zpracování síťových mostů:
# nft add rule bridge foo bar ether type vlan reject with tcp reset
- Byla přidána podpora pro přiřazení podle identifikátoru TCP spojení (conntrack ID). Pro určení conntrack ID lze použít volbu „—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
Zdroj: opennet.ru
