På kerneniveau er der kun en generisk protokol-uafhængig grænseflade, der giver grundlæggende funktioner til at udtrække data fra pakker, udføre operationer på data og kontrollere flow. Selve filtreringsreglerne og protokol-specifikke handlere kompileres til brugerrumsbytekode, hvorefter denne bytekode indlæses i kernen ved hjælp af Netlink-grænsefladen og eksekveres i kernen i en speciel virtuel maskine, der ligner BPF (Berkeley Packet Filters). Denne tilgang gør det muligt betydeligt at reducere størrelsen af den filtreringskode, der kører på kerneniveau, og flytte alle funktionerne i parsingsregler og logikken i at arbejde med protokoller ind i brugerrummet.
Vigtigste innovationer:
- Understøttelse af områder i joins (sammenkædning, visse bindinger af adresser og porte, der forenkler matchning). For et "hvidliste"-sæt, hvis elementer er en vedhæftet fil, vil angivelse af "interval"-flaget indikere, at sættet kan inkludere intervaller i den vedhæftede fil (for den vedhæftede fil "ipv4_addr . ipv4_addr . inet_service" var det tidligere muligt at angive en nøjagtig liste matcher som "192.168.10.35. 192.68.11.123", og nu kan du angive grupper af adresser "80-192.168.10.35-192.168.10.40".
table ip foo {
sæt hvidliste {
skriv ipv4_addr . ipv4_addr . inet_service
flag interval
elementer = { 192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125 . 80}
}kædestang {
type filter krog prerouting prioritetsfilter; politik fald;
ip saddr. ip daddr. tcp dport@whitelist acceptere
}
} - I sæt og kortlister er det muligt at bruge "typeof"-direktivet, som bestemmer elementets format ved mapping.
For eksempel:table ip foo {
sæt hvidliste {
type ip saddr
elementer = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
}kædestang {
type filter krog prerouting prioritetsfilter; politik fald;
ip daddr @whitelist accepter
}
}table ip foo {
map addr2mark {
type ip saddr: metamærke
elementer = { 192.168.10.35 : 0x00000001, 192.168.10.135 : 0x00000002 }
}
} - Tilføjet muligheden for at bruge vedhæftede filer i NAT-bindinger, som giver dig mulighed for at angive en adresse og port, når du definerer NAT-oversættelser baseret på kortlister eller navngivne sæt:
nft tilføje regel ip nat før dnat ip adr. port til ip saddr map { 1.1.1.1 : 2.2.2.2 . tredive}
nft tilføj kort ip nat destinationer { skriv ipv4_addr. inet_service: ipv4_addr. inet_service\\; }
nft tilføje regel ip nat før dnat ip adr. port til ip saddr. tcp dport kort @destinations - Understøttelse af hardwareacceleration med fjernelse af nogle filtreringsoperationer på skuldrene af netværkskortet. Acceleration aktiveres gennem ethtool-værktøjet ("ethtool -K eth0 hw-tc-offload on"), hvorefter det aktiveres i nftables for hovedkæden ved hjælp af "offload"-flaget. Når du bruger Linux 5.6-kernen, understøttes hardwareacceleration til header-feltmatching og indgående grænsefladeinspektion i kombination med modtagelse, dropping, duplikering (dup) og videresendelse (fwd) pakker. I eksemplet nedenfor udføres operationer til at droppe pakker, der kommer fra adressen 192.168.30.20, på netværkskortniveau uden at sende pakkerne til kernen:
# kat fil.nft
tabel netdev x {
kæde y {
type filter krog indtrængen enhed eth0 prioritet 10; flag offload;
ip saddr 192.168.30.20 drop
}
}
# nft -f fil.nft - Forbedret information om stedet for en fejl i reglerne.
# nft slet regel ip yz håndtag 7
Fejl: Kunne ikke behandle regel: Ingen sådan fil eller mappe
slet regel ip yz handle 7
^# nft slet regel ip xx håndtag 7
Fejl: Kunne ikke behandle regel: Ingen sådan fil eller mappe
slet regel ip xx håndtag 7
^# nft slet tabel twst
Fejl: Ingen sådan fil eller mappe; mente du tabel ‘test' i familie-ip?
slet tabeltwist
^^^^Det første eksempel viser, at tabellen 'y' ikke er til stede i systemet, det andet viser, at '7'-handleren mangler, og det tredje viser et tip om tastefejl ved indtastning af tabelnavnet.
- Tilføjet support til kontrol af slavegrænsefladen ved at specificere "meta sdif" eller "meta sdifname":
... meta sdifname vrf1 ...
- Tilføjet understøttelse for skift til højre eller venstre. For eksempel for at flytte en eksisterende pakkeetiket til venstre med 1 bit og indstille den nederste bit til 1:
… metamærkesæt metamærke lshift 1 eller 0x1 …
- Implementeret "-V" mulighed for at vise udvidet versionsinformation.
#nft -V
nftables v0.9.4 (Jive at Five)
cli:readline
json: ja
minigmp:nej
libxtables: ja - Kommandolinjeindstillinger er nu obligatoriske før kommandoer. For eksempel skal du angive "nft -a list ruleset", og kørsel af "nft list ruleset -a" vil resultere i en fejl.
Kilde: opennet.ru