uitgave van het pakketfilter , dat zich ontwikkelt als vervanging voor iptables, ip6tables, arptables en ebtables door de interfaces voor pakketfiltering voor IPv4, IPv6, ARP en netwerkbridges te uniformiseren. Het nftables-pakket bevat componenten voor pakketfiltering die in de gebruikersruimte werken, terwijl de kernel zorgt voor de nf_tables-subsystemen die deel uitmaken van de Linux-kernel sinds versie 3.13. De vereiste wijzigingen voor de release van nftables 0.9.4 zijn opgenomen in de toekomstige kerneltak. .
Op het kernniveau wordt slechts een algemeen interface aangeboden, dat onafhankelijk is van een specifiek protocol en basisfuncties biedt voor het extraheren van gegevens uit pakketten, het uitvoeren van bewerkingen met gegevens en het beheren van de stroom. De daadwerkelijke filterregels en protocoolspecifieke verwerkers worden in bytecode gecompileerd in de gebruikersruimte, waarna deze bytecode wordt geladen in de kernel via het Netlink-interface en wordt uitgevoerd in de kernel in een speciale virtuele machine die lijkt op BPF (Berkeley Packet Filters). Deze benadering maakt het mogelijk om de grootte van de filtercode die in de kernel draait, aanzienlijk te verminderen en alle functies voor het parseren van regels en de logica voor het werken met protocollen naar de gebruikersruimte te halen.
Belangrijkste vernieuwingen:
- Ondersteuning voor intervallen in concatenaties (bepaalde combinaties van adressen en poorten die het matchen vereenvoudigen). Bijvoorbeeld, voor een set 'whitelist', waarvan de elementen een concatenatie zijn, zal het instellen van de flag 'interval' aangeven dat de set intervallen binnen de concatenatie kan bevatten (voor de concatenatie 'ipv4_addr . ipv4_addr . inet_service' kon eerder een exacte overeenkomst zoals '192.168.10.35 . 192.68.11.123 . 80' worden vermeld, en nu kunnen adressen groepen zoals '192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125 . 80' aangeven):
table ip foo {
set whitelist {
type ipv4_addr . ipv4_addr . inet_service
flags interval
elements = { 192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125 . 80 }
}chain bar {
type filter hook prerouting priority filter; policy drop;
ip saddr . ip daddr . tcp dport @whitelist accept
}
} - In verzamelingen en maplijsten is het mogelijk om de 'typeof'-directive te gebruiken, die het formaat van het element tijdens het matchen bepaalt.
Bijvoorbeeld:table ip foo {
set whitelist {
typeof ip saddr
elements = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
}chain bar {
type filter hook prerouting priority filter; policy drop;
ip daddr @whitelist accept
}
}table ip foo {
map addr2mark {
typeof ip saddr : meta mark
elements = { 192.168.10.35 : 0x00000001, 192.168.10.135 : 0x00000002 }
}
} - De mogelijkheid om verbindingen te gebruiken in NAT-bindingen is toegevoegd, wat het mogelijk maakt om een adres en poort op te geven bij het definiëren van NAT-transformaties op basis van map-lijsten of benoemde sets:
nft add rule ip nat pre dnat ip addr . port to ip saddr map { 1.1.1.1 : 2.2.2.2 . 30 }
nft add map ip nat destinations { type ipv4_addr . inet_service : ipv4_addr . inet_service \\; }
nft add rule ip nat pre dnat ip addr . port to ip saddr . tcp dport map @destinations - Ondersteuning voor hardwareversnelling door sommige filterbewerkingen naar de netwerkkaart te verplaatsen. Versnelling wordt ingeschakeld via het hulpprogramma ethtool ("ethtool -K eth0 hw-tc-offload on"), waarna het in nftables voor de hoofdketen wordt geactiveerd met de vlag "offload". Bij gebruik van de Linux-kernel 5.6 is hardwareversnelling voor het vergelijken van header-velden en het controleren van de inkomende interface mogelijk in combinatie met het accepteren, weggooien, dupliceren (dup) en doorsturen (fwd) van pakketten. In het onderstaande voorbeeld worden pakketten die van het adres 192.168.30.20 komen, op de netwerkkaart weggegooid, zonder dat de pakketten aan de kernel worden doorgegeven:
# cat file.nft
table netdev x {
chain y {
type filter hook ingress device eth0 priority 10; flags offload;
ip saddr 192.168.30.20 drop
}
}
# nft -f file.nft - De foutlocatie in de regels is verbeterd.
# nft delete rule ip y z handle 7
Error: Kan regel niet verwerken: Geen dergelijk bestand of directory
delete rule ip y z handle 7
^# nft delete rule ip x x handle 7
Error: Kan regel niet verwerken: Geen dergelijk bestand of directory
delete rule ip x x handle 7
^# nft delete table twst
Error: Geen dergelijk bestand of directory; bedoelde je tabel ‘test’ in familie ip?
delete table twst
^^^^In het eerste voorbeeld wordt getoond dat de tabel "y" niet in het systeem aanwezig is, in de tweede dat handler "7" ontbreekt, en in de derde dat een tip wordt weergegeven bij het invoeren van de tabelnaam.
- Ondersteuning voor de controle van de slave-interface door het opgeven van "meta sdif" of "meta sdifname" is toegevoegd:
… meta sdifname vrf1 …
- Ondersteuning voor de operatie van rechts of links verschuiven is toegevoegd. Bijvoorbeeld, om een bestaand label van een pakket naar links te verschuiven met 1 bit en het laagste bit op 1 in te stellen:
… meta mark set meta mark lshift 1 or 0x1 …
- De optie "-V" is geïmplementeerd om uitgebreide informatie over de versie weer te geven.
# nft -V
nftables v0.9.4 (Jive at Five)
cli: readline
json: ja
minigmp: nee
libxtables: ja - De opties van de opdrachtregel moeten nu altijd vóór de commando's worden opgegeven. Bijvoorbeeld, je moet "nft -a list ruleset" opgeven, en het uitvoeren van "nft list ruleset -a" leidt tot een fout.
Bron: opennet.ru
