De release van de nftables-pakketfilterversie 1.0.6 is gepubliceerd, die de filtering interfaces voor IPv4, IPv6, ARP en netwerkmomenten uniformiseert (gericht op het vervangen van iptables, ip6tables, arptables en ebtables). Het nftables-pakket bevat componenten van de pakketfilter die in de gebruikersruimte werken, terwijl op kernniveau de nf_tables-subsysteem de werking verzorgt, onderdeel van de Linux-kernel sinds versie 3.13. Op kernniveau wordt alleen een algemene interface aangeboden die niet afhankelijk is van een specifiek protocol en basisfunctionaliteiten biedt voor het extraheren van gegevens uit pakketten, het uitvoeren van bewerkingen op de gegevens en het beheren van de datastroom.
Directe filtratieregels en protocolspecifieke verwerkers worden in bytecode gecompileerd in de gebruikersruimte, waarna deze bytecode via de Netlink-interface in de kern wordt geladen en in de kern wordt uitgevoerd in een speciale een virtuele machine, die doet denken aan BPF (Berkeley Packet Filters). Deze aanpak maakt het mogelijk om de grootte van de filtering code die op kernniveau draait aanzienlijk te verkleinen en alle functies voor het parseren van regels en de logica voor de werking met protocollen naar de gebruikersruimte te verplaatsen.
Belangrijkste wijzigingen:
- In de regeloptimalisator, die wordt aangeroepen met de optie "-o/--optimize", is automatische verpakkingen van regels via hun samenvoeging en omzetting naar map- en setlijsten geïmplementeerd. Bijvoorbeeld, de regels # cat ruleset.nft table ip x { chain y { type filter hook input priority filter; policy drop; meta iifname eth1 ip saddr 1.1.1.1 ip daddr 2.2.2.3 accept meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.2.4 accept meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.3.0/24 accept meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.4.0-2.2.4.10 accept meta iifname eth2 ip saddr 1.1.1.3 ip daddr 2.2.2.5 accept } } na uitvoering van "nft -o -c -f ruleset.nft" worden omgezet in de volgende vorm: ruleset.nft:4:17-74: meta iifname eth1 ip saddr 1.1.1.1 ip daddr 2.2.2.3 accept ruleset.nft:5:17-74: meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.2.4 accept ruleset.nft:6:17-77: meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.3.0/24 accept ruleset.nft:7:17-83: meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.4.0-2.2.4.10 accept ruleset.nft:8:17-74: meta iifname eth2 ip saddr 1.1.1.3 ip daddr 2.2.2.5 accept naar: iifname . ip saddr . ip daddr { eth1 . 1.1.1.1 . 2.2.2.3, eth1 . 1.1.1.2 . 2.2.2.4, eth1 . 1.1.1.2 . 2.2.3.0/24, eth1 . 1.1.1.2 . 2.2.4.0-2.2.4.10, eth2 . 1.1.1.3 . 2.2.2.5 } accept
- De optimizer kan ook regels, die al gebruik maken van eenvoudige set-lijsten, in een compactere vorm omzetten, bijvoorbeeld regels: # cat ruleset.nft table ip filter { chain input { type filter hook input priority filter; policy drop; iifname "lo" accept ct state established,related accept comment "In traffic we originate, we trust" iifname "enp0s31f6" ip saddr { 209.115.181.102, 216.197.228.230 } ip daddr 10.0.0.149 udp sport 123 udp dport 32768-65535 accept iifname "enp0s31f6" ip saddr { 64.59.144.17, 64.59.150.133 } ip daddr 10.0.0.149 udp sport 53 udp dport 32768-65535 accept } } na uitvoering van "nft -o -c -f ruleset.nft" worden ze als volgt verpakt: ruleset.nft:6:22-149: iifname "enp0s31f6" ip saddr { 209.115.181.102, 216.197.228.230 } ip daddr 10.0.0.149 udp sport 123 udp dport 32768-65535 accept ruleset.nft:7:22-143: iifname "enp0s31f6" ip saddr { 64.59.144.17, 64.59.150.133 } ip daddr 10.0.0.149 udp sport 53 udp dport 32768-65535 accept in: iifname . ip saddr . ip daddr . udp sport . udp dport { enp0s31f6 . 209.115.181.102 . 10.0.0.149 . 123 . 32768-65535, enp0s31f6 . 216.197.228.230 . 10.0.0.149 . 123 . 32768-65535, enp0s31f6 . 64.59.144.17 . 10.0.0.149 . 53 . 32768-65535, enp0s31f6 . 64.59.150.133 . 10.0.0.149 . 53 . 32768-65535 } accept
- Het probleem met het genereren van bytecode voor het samenvoegen van intervallen waar verschillende byte-ordens worden gebruikt, zoals IPv4 (netwerkbytevolgorde) en meta mark (systeembitevolgorde), is opgelost. table ip x { map w { typeof ip saddr . meta mark : verdict flags interval counter elements = { 127.0.0.1-127.0.0.4 . 0x123434-0xb00122 : accept, 192.168.0.10-192.168.1.20 . 0x0000aa00-0x0000aaff : accept, } } chain k { type filter hook input priority filter; policy drop; ip saddr . meta mark vmap @w } }
- Zeldzame protocollen zijn nu toegewezen bij het gebruik van raw-expressies, bijvoorbeeld: meta l4proto 91 @th,400,16 0x0 accept
- Problemen met het inschakelen van regels met intervallen zijn opgelost: insert rule x y tcp sport { 3478-3497, 16384-16387 } counter accept
- De JSON API is verbeterd, met ondersteuning voor expressies in set- en map-lijsten.
- In de extensies van de Python-bibliotheek nftables is het nu toegestaan om sets regels te laden voor verwerking in testmodus ("-c") en is ondersteuning voor externe definitie van variabelen toegevoegd.
- Het is nu toegestaan om opmerkingen toe te voegen in set-lijsten.
- In de byte ratelimit is het mogelijk om een nulwaarde op te geven.
Bron: opennet.ru
