De release van de nftables-pakketfilter 1.1.6 is gepubliceerd, die de filtering interfaces voor IPv4, IPv6, ARP en netwerkbruggen standaardiseert (gericht op de vervanging van iptables, ip6tables, arptables en ebtables). Tegelijkertijd is de bijbehorende bibliotheek libnftnl 1.3.1 uitgebracht, die een laag-niveau API biedt voor interactie met het nf_tables subsysteem.
De nftables-pakket bevat gebruikersruimte componenten van de pakketfilter, terwijl op kernniveau het nf_tables subsysteem de werking verzorgt, dat deel uitmaakt van de Linux-kernel sinds versie 3.13. Op kernniveau wordt slechts een algemene interface geboden, niet afhankelijk van een specifiek protocol en die basisfunctionaliteiten biedt voor het extraheren van gegevens uit pakketten, het uitvoeren van gegevensbewerkingen en het beheren van stromingen.
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:
- Volledige ondersteuning is geboden voor sjablonen van lichte tunnels, zoals vxlan, geneve en erspan: table netdev global { tunnel t1 { id 10 ip saddr 192.168.2.10 ip daddr 192.168.2.11 sport 1025 dport 20020 ttl 1 erspan { version 1 index 2 } } tunnel t2 { id 10 ip saddr 192.168.3.10 ip daddr 192.168.3.11 sport 1025 dport 21021 ttl 1 erspan { version 1 index 2 } } chain in { type filter hook ingress device veth0 priority 0; tunnel name ip saddr map { 10.141.10.12 : "t1", 10.141.10.13 : "t2" } fwd to erspan1 } } Voordat je de regels laadt, moet je het netwerkinterface erspan1 creëren: ip link add dev erspan1 type erspan external
- Ondersteuning voor maskers in namen van netwerkinterfaces is toegevoegd aan netdev-handlers. Bijvoorbeeld, om een basischain toe te voegen aan de filter voor binnenkomend verkeer voor alle vlan-apparaten, kan het volgende worden opgegeven: table netdev t { chain c { type filter hook ingress devices = { «vlan*», «veth0» } priority filter; policy accept; } }
- Op systemen met de Linux-kernel 6.18+ is ondersteuning voor de overdracht van L2-frames naar de netwerkbruginterfaces voor lokale verwerking geïmplementeerd. Bijvoorbeeld, om alle Ethernet-frames voor het MAC-adres de:ad:00:00:be:ef naar de IP-stack te sturen, kan het volgende worden opgegeven: table bridge global { chain pre { type filter hook prerouting priority 0; policy accept; ether daddr de:ad:00:00:be:ef meta pkttype set host ether daddr set meta ibrhwaddr accept } }
- Een nieuwe infrastructuur voor fuzzing-testen is toegevoegd met behulp van het afl++ (american fuzzy lop++) gereedschap, dat kan worden ingeschakeld tijdens de bouwfase via ‘./configure —with-fuzzer’.
Bron: opennet.ru
