Byla zveřejněna verze balíčkového filtru nftables 1.1.0, která unifikuje rozhraní pro filtrování paketů pro IPv4, IPv6, ARP a síťové mosty (cílí na nahrazení iptables, ip6tables, arptables a ebtables). Významná změna verze není spojena s žádnými zásadními změnami, ale je pouze důsledkem pokračování číslování v desítkové soustavě (minulá verze byla 1.0.9). Současně byla zveřejněna verze související knihovny libnftnl 1.2.7, která poskytuje nízkoúrovňové API pro interakci se subsystémem nf_tables.
Balíček nftables obsahuje prvky filtrování paketů pracující v uživatelském prostoru, zatímco na úrovni jádra zajišťuje provoz subsystém nf_tables, který je součástí jádra Linux od verze 3.13. Na úrovni jádra je poskytováno pouze obecné rozhraní, které nezávisí na konkrétním protokolu a poskytuje základní funkce pro extrakci dat z paketů, provádění operací s daty a řízení toku.
Samotná pravidla filtrování a specifické zpracovatele protokolů se kompilují do bytecode v uživatelském prostoru, poté je tento bytecode načten do jádra pomocí rozhraní Netlink a vykonává se v jádře v specializované virtuálním strojipodobě jako BPF (Berkeley Packet Filters). Tento přístup výrazně snižuje velikost kódu filtrování, který funguje na úrovni jádra a přesouvá všechny funkce analýzy pravidel a logiky práce s protokoly do uživatelského prostoru.
Hlavní změny:
- Do mapových výrazů byla přidána podpora proměnných: define dst_map = { ::1234 : 5678 } table ip6 nat { map dst_map { typeof ip6 daddr : tcp dport; elements = $dst_map } chain prerouting { ip6 nexthdr tcp redirect to ip6 daddr map @dst_map } }
- Byla přidána podpora pro VLAN: ip saddr 10.1.1.1 icmp type echo-request vlan id set 321 # payload ether type 8021ad vlan id 10 vlan type 8021q vlan id 100 vlan type ip accept
- Pro výrazy 'log' byl zaveden nový řetězcový preprocessor s podporou proměnných: define message='test' log prefix 'my $message'
- Při výpočtu hodnoty výrazu 'meta hour' byla implementována podpora pro záporné offsety v časovém pásmu zadaném pomocí proměnné prostředí TZ: TZ=UTC-4 nft add rule x y meta hour '22:00'
- Bylo zajištěno převedení pořadí bajtů při používání výrazů ct a meta, stejně jako při používání operací sloučení a určení rozsahů v set-atzích. map mapv6 { typeof ip6 dscp : meta mark; } meta mark set ip6 dscp map @map1 bude získán bajtkód: [ payload load 2b @ network header + 0 => reg 1 ] [ bitwise reg 1 = ( reg 1 & 0x0000c00f ) ^ 0x00000000 ] [ byteorder reg 1 = ntoh(reg 1, 2, 2) ] [ bitwise reg 1 = ( reg 1 > 0x00000006 ) ] [ lookup reg 1 set mapv6 dreg 1 ] [ meta set mark with reg 1 ]
- Byla obnovena podpora příkazu 'replace rule'. replace rule ip t1 c1 handle 3 'jhash ip protocol . ip saddr mod 170 vmap { 0-94 : goto wan1, 95-169 : goto wan2, 170-269 }'
- Byla obnovena možnost přidávat síťová zařízení do existujících flowtable: create flowtable inet filter f1 { hook ingress priority 0; counter } add flowtable inet filter f1 { devices = { dummy1 } ; }
- Byly vyřešeny problémy při používání příkazu 'create set': define ip-block-4 = { 1.1.1.1 } create set netdev filter ip-block-4-test { type ipv4_addr flags interval auto-merge elements = $ip-block-4 }
- Byly vyřešeny problémy při používání číselného vyjádření možností tcp: tcp option 254
- Byly vyřešeny problémy při používání výrazů meta a ct s mapovými sety: meta mark set vlan id map { 1 : 0x00000001, 4095 : 0x00004095 }
- Ve výrazech payload a concat není povoleno uvádět data o velikosti větší než 512 bytů.
- Při provádění příkazu „nft describe“ byl implementován účet hodnot z konfigurací group, rt_mark a rt_realms umístěných v adresářích /etc/iproute2/ a /use/share/iproute2/. # nft describe meta rtclassid meta expression, datatype realm (routing realm) (basetype integer), 32 bits předdefinované symbolické konstanty z /etc/iproute2/rt_realms (v desítkovém formátu): cosmos 0 Odsouzení prohlášení s rozsahem meta mark set 0-100
- Byla zrychlena operace výstupu seznamu tabulek. Byla implementována podpora volby -t/—terse pro zrychlení příkazů „list table“ a „list set“.
- Bylo zajištěno převádění výrazů meter na dynamické set-sady: add rule t c tcp dport 80 meter m size 128 { ip saddr timeout 2s limit rate 10/second } bude převedeno na set m { type ipv4_addr size 128 flags dynamic,timeout } tcp dport 80 update @m { ip saddr timeout 2s limit rate 10/second burst 5 packets }
- Do zobrazení ve formátu JSON byla přidána podpora pro objekty synproxy a map-sady se sloučenými daty.
- V set-sadách definovaných ve formátu JSON byla implementována podpora příznaku auto-merge.
- Při použití zobrazení ve formátu JSON je povoleno uvádět více zařízení v bloku „chain“.
- Při použití voleb -f/—filename bylo zajištěno zpracování cest vzhledem k adresáři aktuálního souboru.
- Při použití voleb -I/—include se nyní procházení cest ve výchozím nastavení provádí od konce seznamu.
- Byla doladěna práce s volbami -o/—optimize na výrazy obsahující počitadla hodnot: # nft -c -o -f ruleset.nft Slučování: ruleset.nft:5:17-45: ct state invalid counter drop ruleset.nft :6:17-59: ct state established,related counter accept do: ct state vmap { invalid counter : drop, established counter : accept, related counter : accept } Slučování: ruleset.nft:7:17-43: tcp dport 80 counter accept ruleset.nft:8:17-44: tcp dport 123 counter accept do: tcp dport { 80, 123 } counter accept Slučování: ruleset.nft:9:17-64: ip saddr 1.1.1.1 ip daddr 2.2.2.2 counter accept ruleset.nft:10:17-62: ip saddr 1.1.1.2 ip daddr 3.3.3.3 counter drop do: ip saddr . ip daddr vmap { 1.1.1.1 . 2.2.2.2 counter : accept, 1.1.1.2 . 3.3.3.3 counter : drop }
- Byla obnovena kompatibilita s dumpy prvku set, vytvořenými v nftables před verzí 0.9.8.
Zdroj: opennet.ru
