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 pakke- og trafiktællere forbundet med sæt-elementer er blevet tilføjet til sæt. Tællere aktiveres ved at bruge søgeordet "tæller":
tabel ip x {
sæt y {
type ip saddr
imødegå
elementer = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
}kæde z {
type filter krog output prioritetsfilter; politik acceptere;
ip daddr @y
}
} - For at indstille startværdierne for tællere, for eksempel for at gendanne tidligere tællere efter en genstart, kan du bruge kommandoen "nft -f":
# kat regelsæt.nft
tabel ip x {
sæt y {
type ip saddr
imødegå
elementer = { 192.168.10.35 tællerpakker 1 byte 84, 192.168.10.101 \
tæller p 192.168.10.135 tællerpakker 0 bytes 0 }
}kæde z {
type filter krog output prioritetsfilter; politik acceptere;
ip daddr @y
}
}
# nft -f regelsæt.nft
#nft liste regelsæt
tabel ip x {
sæt y {
type ip saddr
imødegå
elementer = { 192.168.10.35 tællerpakker 1 byte 84, 192.168.10.101 \
tæller p 192.168.10.135 tællerpakker 0 bytes 0 }
}kæde z {
type filter krog output prioritetsfilter; politik acceptere;
ip daddr @y
}
} - Tællerunderstøttelse er også blevet tilføjet til flowtabel:
table ip foo {
flowtable bar {
krogindgangsprioritet -100
enheder = { eth0, eth1 }
imødegå
}kæde frem {
type filter krog frem prioritet filter;
flow tilføje @bar tæller
}
}Du kan se listen over tællere ved at bruge kommandoen "conntrack -L":
tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47278 dport=5201 pakker=9 bytes=608 \
src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47278 pakker=8 bytes=428 [OFFLOAD] mark=0 \
secctx=null use=2 tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47280 dport=5201 \
packets=1005763 bytes=44075714753 src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47280 \
packets=967505 bytes=50310268 [OFFLOAD] mark=0 secctx=null use=2 - I sammenkædningssæt (sammenkædning, visse bundter af adresser og porte, der forenkler sammenligning), er det muligt at bruge "typeof"-direktivet, som bestemmer datatypen af elementer for de bestanddele af elementerne i sættet:
table ip foo {
sæt hvidliste {
type ip saddr. tcp dport
elementer = { 192.168.10.35 . 80, 192.168.10.101. 80}
}kædestang {
type filter krog prerouting prioritetsfilter; politik fald;
ip daddr. tcp dport @whitelist accepter
}
} - Direktivet gælder nu også for sammenføjninger i kortlister:
table ip foo {
map addr2mark {
type ip saddr. tcp dport: metamærke
elementer = { 192.168.10.35 . 80: 0x00000001,
192.168.10.135. 80 : 0x00000002 }
}kædestang {
type filter krog prerouting prioritetsfilter; politik fald;
meta mark set ip daddr. tcp dport map @addr2mark accepter
}
} - Tilføjet understøttelse af range joins i anonyme (unavngivne) sæt:
# nft tilføje regel inet filter input ip daddr . tcp dport\
{ 10.0.0.0/8. 10-23, 192.168.1.1-192.168.3.8. 80-443 } accepter - Muligheden for at kassere pakker med 802.1q (VLAN)-flag ved behandling af netværksbroer er tilvejebragt:
# nft tilføje regel bro foo bar ether type vlan afvise med tcp nulstilling
- Tilføjet understøttelse af matchning med TCP-session-id (conntrack-id). For at bestemme conntrack-id'et kan du bruge "--output id" muligheden:
# conntrack -L —output-id
udp 17 18 src=192.168.2.118 dst=192.168.2.1 sport=36424 dport=53 pakker=2 \
bytes=122 src=192.168.2.1 dst=192.168.2.118 sport=53 dport=36424 pakker=2 bytes=320 \
[ASSURED] mark=0 use=1 id=2779986232# nft tilføje regel foo bar ct id 2779986232 tæller
Kilde: opennet.ru