Efter et års udvikling pakke-filter udgivelse , som udvikler sig som erstatning for iptables, ip6tables, arptables og ebtables ved at forene grænsefladerne for pakke filtrering for IPv4, IPv6, ARP og netværksbroer. I nftables-pakken indgår komponenter til pakke-filteret, der fungerer i brugerrummet, mens nf_tables subsystemet, som er en del af Linux-kernen siden version 3.13, sørger for funktionen på kerne-niveau.
På kerne-niveau leveres kun en generel grænseflade, der ikke er afhængig af den specifikke protokol og som leverer grundlæggende funktioner til dataudtræk fra pakker, udførelse af dataoperationer og strømstyring.
Filtreringslogikken og protokolspecifikke behandlere kompileres til bytekode i brugerrummet, hvorefter denne bytekode indlæses i kernen via Netlink-grænsefladen og udføres i en specialiseret virtuel maskine, der minder om BPF (Berkeley Packet Filters). Denne tilgang gør det muligt at betydeligt reducere størrelsen af den filtreringskode, der kører på kerne-niveau og flytte alle funktioner til regelspecifikation og protokolbehandling til brugerrummet.
Hovednyhederne:
- Understøttelse af IPsec, som muliggør adressebinding af tunneler i forbindelse med pakker, IPsec-anmodnings-ID og SPI (Security Parameter Index) tag. For eksempel,
… ipsec in ip saddr 192.168.1.0/24
… ipsec in spi 1-65536Det er også muligt at kontrollere rute-gennemgang gennem en IPsec-tunnel. For eksempel, for at blokere trafik, der ikke går gennem IPsec:
… filter output rt ipsec missing drop
- Understøttelse af IGMP-protokollen (Internet Group Management Protocol). For eksempel, for at afvise indgående IGMP-medlemskabsspørgsmål, kan man bruge reglen
nft add rule netdev foo bar igmp type membership-query counter drop
- Mulighed for at bruge variabler til at definere overgangskæder (jump / goto). For eksempel:
define dest = ber
add rule ip foo bar jump $dest - Understøttelse af masker til identifikation af operativsystemer (OS Fingerprint) baseret på TTL-værdier i headeren. For eksempel, for at markere pakker afhængigt af afsenders operativsystem, kan man bruge kommandoen:
… meta mark set osf ttl skip name map { «Linux» : 0x1,
«Windows» : 0x2,
«MacOS» : 0x3,
«unknown» : 0x0 }
… osf ttl skip version «Linux:4.20» - Mulighed for at matche ARP-adressen for afsenderen med IPv4-adressen for målsystemet. For eksempel, for at øge tælleren for ARP-pakker sendt fra adressen 192.168.2.1, kan man bruge reglen:
table arp x {
chain y {
type filter hook input priority filter; policy accept;
arp saddr ip 192.168.2.1 counter packets 1 bytes 46
}
} - Understøttelse af gennemsigtig videresending af forespørgsler gennem proxy (tproxy). For eksempel, til at omdirigere anmodninger til port 80 til proxyport 8080:
table ip x {
chain y {
type filter hook prerouting priority -150; policy accept;
tcp dport 80 tproxy to :8080
}
} - Understøttelse af mærkning af sockets med mulighed for at hente den indstillede mærkning via setsockopt() i SO_MARK-tilstand. For eksempel:
table inet x {
chain y {
type filter hook prerouting priority -150; policy accept;
tcp dport 8080 mark set socket mark
}
} - Understøttelse af angivelse af tekstnavne for prioriteter for kæder. For eksempel:
nft add chain ip x raw { type filter hook prerouting priority raw; }
nft add chain ip x filter { type filter hook prerouting priority filter; }
nft add chain ip x filter_later { type filter hook prerouting priority filter + 10; } - Understøttelse af SELinux-mærker (Secmark). For eksempel, for at definere mærket «sshtag» i tilknytning til SELinux-konteksten kan du køre:
nft add secmark inet filter sshtag «system_u:object_r:ssh_server_packet_t:s0»
Og derefter bruge dette mærke i reglerne:
nft add rule inet filter input tcp dport 22 meta secmark set «sshtag»
nft add map inet filter secmapping { type inet_service : secmark; }
nft add element inet filter secmapping { 22 : «sshtag» }
nft add rule inet filter input meta secmark set tcp dport map @secmapping - Mulighed for at angive protokollerne tildelt porte i tekstform, som de er defineret i filen /etc/services. For eksempel:
nft add rule x y tcp dport «ssh»
nft list ruleset -l
table x {
chain y {
…
tcp dport «ssh»
}
} - Mulighed for at kontrollere typen af netværksinterface. For eksempel:
add rule inet raw prerouting meta iifkind «vrf» accept
- Forbedret støtte til dynamisk opdatering af indholdet i sæt (sets) ved eksplicit at angive flagget «dynamic». For eksempel, til at opdatere sættet «s» ved at tilføje kildeadressen og nulstille posten, hvis der ikke er nogen pakker i 30 sekunder:
add table x
add set x s { type ipv4_addr; size 128; timeout 30s; flags dynamic; }
add chain x y { type filter hook input priority 0; }
add rule x y update @s { ip saddr } - Mulighed for at angive et separat betingelse for timeout. For eksempel, for at overskrive standardtimeouten for pakker, der kommer til port 8888, kan du angive:
table ip filter {
ct timeout agressive-tcp {
protocol tcp;
l3proto ip;
policy = {established: 100, close_wait: 4, close: 4}
}
chain output {
…
tcp dport 8888 ct timeout set «agressive-tcp»
}
} - Understøttelse af NAT for inet-familien:
table inet nat {
…
ip6 daddr dead::2::1 dnat to dead:2::99
} - Forbedrede værktøjer til fejlinformation forårsaget af tastefejl:
nft add chain filtre test
Fejl: Ingen sådan fil eller bibliotek; mente du tabel «filter» i familie ip?
add chain filtre test
^^^^^^ - Mulighed for at angive interface-navne i sæt (sets):
set sc {
type inet_service . ifname
elements = { «ssh» . «eth0» }
} - Opdateret syntaks for flowtable-regler:
nft add table x
nft add flowtable x ft { hook ingress priority 0; devices = { eth0, wlan0 }; }
…
nft tilføj regel x fremad ip protokol { tcp, udp } flow tilføj @ft - Forbedret støtte til JSON.
Kilde: opennet.ru
