Efter ett Ärs utveckling utgÄvan av paketfilter , som utvecklas som ett alternativ till iptables, ip6tables, arptables och ebtables genom att enhetliga grÀnssnitt för paketfiltering för IPv4, IPv6, ARP och nÀtverksbroar. Paketet nftables innehÄller komponenter för paketfilter som arbetar i anvÀndarutrymmet, medan subsystemet nf_tables, som ingÄr i kÀrnan av Linux sedan version 3.13, ansvarar för arbetet pÄ kÀrnnivÄ.
PÄ kÀrnnivÄ tillhandahÄlls bara ett generellt grÀnssnitt, oberoende av specifika protokoll, och som erbjuder grundlÀggande funktioner för att extrahera data frÄn paket, utföra operationer pÄ data och styra flödet.
Filtreringslogiken och protokollspecificerade processorer kompileras till bytekod i anvÀndarutrymmet, varefter denna bytekod laddas in i kÀrnan via Netlink-grÀnssnittet och körs i en speciell virtuell maskin som liknar BPF (Berkeley Packet Filters). Denna metod möjliggör en betydande minskning av koden för filtrering som körs pÄ kÀrnnivÄ och flyttar alla funktioner för regeltolkning och protokollhantering till anvÀndarutrymmet.
Huvudsakliga nyheter:
- Stöd för IPsec, vilket möjliggör koppling av tunneladresser till paket, IPsec-förfrÄgningsidentifierare och SPI-tagg (Security Parameter Index). Till exempel:
⊠ipsec in ip saddr 192.168.1.0/24
⊠ipsec in spi 1-65536Det Àr ocksÄ möjligt att kontrollera trafikens vÀg genom IPsec-tunneln. Till exempel, för att blockera trafik som inte gÄr via IPSec:
⊠filter output rt ipsec missing drop
- Stöd för IGMP-protokollet (Internet Group Management Protocol). Till exempel, för att avvisa inkommande IGMP-meddelanden om grupptillhörighet kan du anvÀnda regeln:
nft add rule netdev foo bar igmp type membership-query counter drop
- Möjlighet att anvÀnda variabler för att definiera övergÄngskedjor (jump / goto). Till exempel:
define dest = ber
add rule ip foo bar jump $dest - Stöd för maskor för identifiering av operativsystem (OS Fingerprint) baserat pÄ TTL-vÀrden i rubriken. Till exempel, för att mÀrka paket beroende pÄ avsÀndarens OS kan kommandot anvÀndas:
⊠meta mark set osf ttl skip name map { "Linux" : 0x1,
"Windows" : 0x2,
"MacOS" : 0x3,
"unknown" : 0x0 }
⊠osf ttl skip version "Linux:4.20" - Möjlighet att korrelera ARP-adressen för avsÀndaren med IPv4-adressen för mÄlsystemet. Till exempel, för att öka rÀknaren för ARP-paket som skickas frÄn adressen 192.168.2.1 kan regeln anvÀndas:
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
}
} - Stöd för transparent vidarebefordran av förfrÄgningar genom proxy (tproxy). Till exempel för att vidarebefordra förfrÄgningar till port 80 till proxyport 8080:
table ip x {
chain y {
typ filter krok prerouting prioritet -150; policy accept;
tcp dport 80 tproxy till :8080
}
} - Stöd för mÀrkning av sockets med möjlighet till senare Ätkomst av den faststÀllda etiketten via setsockopt() i lÀge SO_MARK. Till exempel:
tabell inet x {
chain y {
typ filter krok prerouting prioritet -150; policy accept;
tcp dport 8080 mark sÀtt socket mark
}
} - Stöd för att ange textnamn pÄ prioriteringar för kedjor. Till exempel:
nft lÀgg till kedja ip x raw { typ filter krok prerouting prioritet raw; }
nft lÀgg till kedja ip x filter { typ filter krok prerouting prioritet filter; }
nft lÀgg till kedja ip x filter_later { typ filter krok prerouting prioritet filter + 10; } - Stöd för SELinux-mÀrkningar (Secmark). Till exempel, för att definiera mÀrkningen "sshtag" i koppling till SELinux-kontexten kan du köra:
nft lÀgg till secmark inet filter sshtag "system_u:object_r:ssh_server_packet_t:s0"
Och sedan anvÀnda denna mÀrkning i regler:
nft lÀgg till regel inet filter input tcp dport 22 meta secmark sÀtt "sshtag"
nft lÀgg till karta inet filter secmapping { typ inet_service : secmark; }
nft lÀgg till element inet filter secmapping { 22 : "sshtag" }
nft lÀgg till regel inet filter input meta secmark sÀtt tcp dport karta @secmapping - Möjlighet att ange portar kopplade till protokollen i textformat, som de definieras i filen /etc/services. Till exempel:
nft lÀgg till regel x y tcp dport "ssh"
nft lista regler -l
tabell x {
chain y {
âŠ
tcp dport "ssh"
}
} - Möjlighet att kontrollera typ av nÀtverksgrÀnssnitt. Till exempel:
lÀgg till regel inet raw prerouting meta iifkind "vrf" accept
- FörbÀttrat stöd för dynamisk uppdatering av innehÄllet i uppsÀttningar (sets) genom att uttryckligen ange flaggan "dynamic". Till exempel, för att uppdatera uppsÀttningen "s" genom att lÀgga till kÀlladressen och ÄterstÀlla posten om det inte finns nÄgra paket pÄ 30 sekunder:
lÀgg till tabell x
lÀgg till uppsÀttning x s { typ ipv4_addr; storlek 128; timeout 30s; flaggor dynamiska; }
lÀgg till kedja x y { typ filter krok input prioritet 0; }
lÀgg till regel x y uppdatera @s { ip saddr } - Möjlighet att ange ett separat villkor för tidpunkten för timeout. Till exempel, för att ÄsidosÀtta standardtimeouten för paket som kommer till port 8888 kan man ange:
tabell ip filter {
ct timeout agressive-tcp {
protokoll tcp;
l3proto ip;
policy = {etablerad: 100, close_wait: 4, close: 4}
}
kedja output {
âŠ
tcp dport 8888 ct timeout sÀtt "agressive-tcp"
}
} - Stöd för NAT för inet-familjen:
tabell inet nat {
âŠ
ip6 daddr dead::2::1 dnat till dead:2::99
} - FörbÀttrade felsökningsverktyg för skrivfel:
nft lÀgg till kedja filtre test
Fel: Ingen sÄdan fil eller katalog; menade du tabell "filter" i familj ip?
lÀgg till kedja filtre test
^^^^^^ - Möjlighet att ange namn pÄ grÀnssnitt i uppsÀttningar (sets):
set sc {
typ inet_service . ifname
element = { "ssh" . "eth0" }
} - Uppdaterad syntax för flowtable-regler:
nft lÀgg till tabell x
nft lÀgg till flowtable x ft { krok ingress prioritet 0; enheter = { eth0, wlan0 }; }
âŠ
nft lÀgg till regel x vidarebefordra ip protokoll { tcp, udp } flow lÀgg till @ft - FörbÀttrat stöd för JSON.
KĂ€lla: opennet.ru
