Kjernenivået gir bare et generisk protokolluavhengig grensesnitt som gir grunnleggende funksjoner for å trekke ut data fra pakker, utføre dataoperasjoner og flytkontroll. Filtreringsreglene og protokollspesifikke behandlere kompileres til bytekode i brukerrommet, hvoretter denne bytekoden lastes inn i kjernen ved hjelp av Netlink-grensesnittet og kjøres i kjernen i en spesiell virtuell maskin som minner om BPF (Berkeley Packet Filters). Denne tilnærmingen lar deg redusere størrelsen på filtreringskoden som kjører på kjernenivå betraktelig og flytte alle funksjonene til parsingsregler og logikk for arbeid med protokoller inn i brukerområdet.
Hovedinnovasjoner:
- Støtte for områder i tilkoblinger (sammenkobling, visse bunter med adresser og porter som forenkler sammenligning). For eksempel, for et sett "hviteliste" hvis elementer er et vedlegg, vil spesifisering av "intervall"-flagget indikere at settet kan inkludere områder i vedlegget (for vedlegget "ipv4_addr . ipv4_addr . inet_service" var det tidligere mulig å liste nøyaktig samsvarer med formen "192.168.10.35. 192.68.11.123", og nå kan du spesifisere grupper med adresser "80-192.168.10.35-192.168.10.40").192.68.11.123.
table ip foo {
sett hviteliste {
skriv ipv4_addr . ipv4_addr. inet_service
flaggintervall
elementer = { 192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125. 80}
}kjedestang {
type filter krok prerouting prioritet filter; politikk fall;
ip saddr. ip daddr. tcp dport @whitelist godta
}
} - I sett og kartlister er det mulig å bruke "typeof"-direktivet, som bestemmer formatet på elementet ved matching.
For eksempel:table ip foo {
sett hviteliste {
type ip saddr
elementer = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
}kjedestang {
type filter krok prerouting prioritet filter; politikk fall;
ip daddr @hviteliste godta
}
}table ip foo {
kartadr2mark {
type ip saddr: metamerke
elementer = { 192.168.10.35 : 0x00000001, 192.168.10.135 : 0x00000002 }
}
} - Lagt til muligheten til å bruke sammenføyninger i NAT-bindinger, som lar deg spesifisere en adresse og port når du definerer NAT-transformasjoner basert på kartlister eller navngitte sett:
nft add rule ip nat pre dnat ip adr. port til ip saddr kart { 1.1.1.1 : 2.2.2.2 . tretti }
nft legg til kart ip nat-destinasjoner { skriv ipv4_addr. inet_service: ipv4_addr. inet_service \\; }
nft add rule ip nat pre dnat ip addr. port til ip saddr. tcp dport kart @destinasjoner - Støtte for maskinvareakselerasjon med enkelte filtreringsoperasjoner utført av nettverkskortet. Akselerasjon er aktivert via ethtool-verktøyet ("ethtool -K eth0 hw-tc-offload on"), hvoretter det aktiveres i nftables for hovedkjeden ved å bruke "offload"-flagget. Når du bruker Linux-kjernen 5.6, støttes maskinvareakselerasjon for topptekstfelttilpasning og innkommende grensesnittinspeksjon i kombinasjon med mottak, forkasting, duplisering (dup) og videresending (fwd) pakker. I eksemplet nedenfor utføres operasjonene med å droppe pakker som kommer fra adressen 192.168.30.20 på nettverkskortnivå, uten å sende pakkene til kjernen:
# katt fil.nft
tabell netdev x {
kjede y {
type filter krok inntrengningsenhet eth0 prioritet 10; flagg avlastning;
ip saddr 192.168.30.20 slipp
}
}
# nft -f file.nft - Forbedret informasjon om plasseringen av en feil i reglene.
# nft slette regel ip yz handle 7
Feil: Kunne ikke behandle regel: Ingen slik fil eller katalog
slett regel ip yz handle 7
^# nft slette regel ip xx håndtak 7
Feil: Kunne ikke behandle regel: Ingen slik fil eller katalog
slett regel ip xx håndtak 7
^# nft slette tabell twst
Feil: Ingen slik fil eller katalog; mente du tabell «test» i familie-ip?
slett tabell twst
^^^^Det første eksemplet viser at tabellen "y" ikke er i systemet, det andre at "7"-behandleren mangler, og det tredje at det vises en skrivefeil når du skriver inn tabellnavnet.
- Lagt til støtte for å sjekke slavegrensesnittet ved å spesifisere "meta sdif" eller "meta sdifname":
... meta sdifname vrf1 ...
- Lagt til støtte for høyre- eller venstreskiftoperasjoner. For eksempel, for å flytte en eksisterende pakkeetikett til venstre med 1 bit og sette den mindre biten til 1:
… metamark sett metamark lshift 1 eller 0x1 …
- Implementert "-V"-alternativ for å vise utvidet versjonsinformasjon.
# nft -V
nftables v0.9.4 (Jive at Five)
cli: leselinje
json: ja
minigmp: nei
libxtables: ja - Kommandolinjealternativer må nå spesifiseres før kommandoer. For eksempel må du spesifisere "nft -a list ruleset", og å kjøre "nft list ruleset -a" vil resultere i en feil.
Kilde: opennet.ru