De release van het pakketfilter nftables 1.0.0 is gepubliceerd, dat de interface voor pakketfiltering voor IPv4, IPv6, ARP en netwerken uniform maakt (gericht op vervanging van iptables, ip6tables, arptables en ebtables). De noodzakelijke wijzigingen voor de werking van de nftables 1.0.0 release zijn opgenomen in de Linux-kernel 5.13. De significante versieverandering is niet gerelateerd aan ingrijpende wijzigingen, maar is slechts een gevolg van de voortzetting van de nummering in decimale notatie (de vorige release was 0.9.9).
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 vernieuwingen:
- In de set-lijsten is ondersteuning voor het maskerelement ‘*’ toegevoegd, dat werkt voor alle pakketten die niet vallen onder andere elementen die in de set zijn gedefinieerd. table x { map blocklist { type ipv4_addr : verdict flags interval elements = { 192.168.0.0/16 : accept, 10.0.0.0/8 : accept, * : drop } } chain y { type filter hook prerouting priority 0; policy accept; ip saddr vmap @blocklist } }
- Er is een mogelijkheid geïntroduceerd om variabelen uit de opdrachtregel te definiëren met de optie ‘—define’. # cat test.nft table netdev x { chain y { type filter hook ingress devices = $dev priority 0; policy drop; } } # nft —define dev="{ eth0, eth1 }" -f test.nft
- In map-lijsten is het gebruik van constante (stateful) expressies toegestaan: table inet filter { map portmap { type inet_service : verdict counter elements = { 22 counter packets 0 bytes 0 : jump ssh_input, * counter packets 0 bytes 0 : drop } } chain ssh_input { } chain wan_input { tcp dport vmap @portmap } chain prerouting { type filter hook prerouting priority raw; policy accept; iif vmap { "lo" : jump wan_input } } }
- De opdracht ‘list hooks’ is toegevoegd om een lijst van handlers van de opgegeven pakkettenfamilie weer te geven: # nft list hooks ip device eth0 family ip { hook ingress { +0000000010 chain netdev x y [nf_tables] +0000000300 chain inet m w [nf_tables] } hook input { -0000000100 chain ip a b [nf_tables] +0000000300 chain inet m z [nf_tables] } hook forward { -0000000225 selinux_ipv4_forward 0000000000 chain ip a c [nf_tables] } hook output { -0000000225 selinux_ipv4_output } hook postrouting { +0000000225 selinux_ipv4_postroute } }
- In de 'queue'-blokken is het toegestaan om jhash, symhash en numgen uitdrukkingen te combineren om pakketten in gebruikersruimte over wachtrijen te verdelen. … queue to symhash mod 65536 … queue flags bypass to numgen inc mod 65536 … queue to jhash oif . meta mark mod 32 'queue' kan ook worden gecombineerd met map-lijsten om een wachtrij in gebruikersruimte te kiezen op basis van willekeurige sleutels. … queue flags bypass to oifname map { 'eth0' : 0, 'ppp0' : 2, 'eth1' : 2 }
- Er is een mogelijkheid toegevoegd om variabelen, inclusief een set-lijst, in meerdere maps te onthullen. define interfaces = { eth0, eth1 } table ip x { chain y { type filter hook input priority 0; policy accept; iifname vmap { lo : accept, $interfaces : drop } } } # nft -f x.nft # nft list ruleset table ip x { chain y { type filter hook input priority 0; policy accept; iifname vmap { 'lo' : accept, 'eth0' : drop, 'eth1' : drop } } }
- Het combineren van vmap (verdict map) met intervallen is toegestaan: # nft add rule x y tcp dport . ip saddr vmap { 1025-65535 . 192.168.10.2 : accept }
- De syntaxis voor NAT-mapping is vereenvoudigd. Het is toegestaan om bereikadressen op te geven: … snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } of expliciete IP-adressen en poorten: … dnat to ip saddr map { 10.141.11.4 : 192.168.2.3 . 80 } of combinaties van IP-bereiken en poorten: … dnat to ip saddr . tcp dport map { 192.168.1.2 . 80 : 10.141.10.2-10.141.10.5 . 8888-8999 }
Bron: opennet.ru
