Pas një viti zhvillimi lëshimi i filtrit të paketave , që po zhvillohet si një zëvendësim për iptables, ip6tables, arptables dhe ebtables përmes unifikimit të ndërfaqeve të filtrimit të paketave për IPv4, IPv6, ARP dhe urat rrjet. Paketimi nftables përfshin komponentë të filtrimit të paketave që funksionojnë në hapësirën e përdoruesit, ndërsa në nivelin e kernelit punon nën-sistemi nf_tables, i cili është pjesë e kernelit Linux që nga lëshimi 3.13.
Në nivelin e kernelit ofrohet vetëm një ndërfaqe e përgjithshme, e cila nuk varet nga protokolli specifik dhe siguron funksione bazë për nxjerrjen e të dhënave nga paketat, kryerjen e operacioneve me të dhëna dhe menaxhimin e fluksit.
Logjika e filtrimit në mënyrë direkte dhe trajtuesit specifikë për protokollin kompilehen në bytecode në hapësirën e përdoruesit, pas së cilës ky bytecode ngarkohet në kernel përmes ndërfaqes Netlink dhe ekzekutohet në një makinë virtuale të veçantë, e cila i ngjan BPF (Berkeley Packet Filters). Ky qasje lejon një reduktim të konsiderueshëm të madhësisë së kodit të filtrimit që funksionon në nivelin e kernelit dhe të nxjerrë të gjitha funksionet e analizës së rregullave dhe logjikën e punës me protokollet në hapësirën e përdoruesit.
Novitetet kryesore:
- Mbështetje për IPsec, e cila lejon lidhjen e adresave të tunelit në lidhje me pakot, identifikuesin e kërkesës IPsec dhe etiketën SPI (Security Parameter Index). Për shembull,
⊠ipsec in ip saddr 192.168.1.0/24
⊠ipsec in spi 1-65536Po ashtu, është e mundur të verifikohet kalimi i rrugës përmes tunelit IPsec. Për shembull, për të bllokuar trafikun që nuk kalon përmes IPSec:
⊠filter output rt ipsec missing drop
- Mbështetje për protokollin IGMP (Internet Group Management Protocol). Për shembull, për të hedhur poshtë kërkesat IGMP për përkatësi në grup, mund të përdoret rregulli
nft add rule netdev foo bar igmp type membership-query counter drop
- Mundësi për të përdorur variabla për të përcaktuar zinxhirët e kalimit (jump / goto). Për shembull:
define dest = ber
add rule ip foo bar jump $dest - Mbështetje për maska për identifikimin e sistemeve operative (OS Fingerprint) bazuar në vlerat TTL në kokën e paketës. Për shembull, për të etiketuar paketat në varësi të sistemit operativ të dërguesit, mund të përdoret komandë:
⊠meta mark set osf ttl skip name map { «Linux» : 0x1,
«Windows» : 0x2,
«MacOS» : 0x3,
«unknown» : 0x0 }
⊠osf ttl skip version «Linux:4.20» - Mundësi për të përputhur adresën ARP të dërguesit dhe adresën IPv4 të sistemit që është në qëllim. Për shembull, për të rritur numërimin e paketave ARP të dërguara nga adresa 192.168.2.1, mund të përdoret rregulli:
table arp x {
zinxhir y {
type filter hook input priority filter; policy accept;
arp saddr ip 192.168.2.1 counter packets 1 bytes 46
}
} - Mbështetje për kalimin transparent të kërkesave përmes proxies (tproxy). Për shembull, për të ridrejtuar kërkesat në portin 80 në portin e proxy 8080:
tabela ip x {
zinxhir y {
type filter hook prerouting priority -150; policy accept;
tcp dport 80 tproxy to :8080
}
} - Mbështetje për shënimin e socket-eve me mundësinë e marrjes së etiketës së vendosur përmes setsockopt() në modin SO_MARK. Për shembull:
table inet x {
zinxhir y {
type filter hook prerouting priority -150; policy accept;
tcp dport 8080 mark set socket mark
}
} - Mbështetje për specifikimin e emrave tekstualë të prioriteteve për zinxhirët. Për shembull:
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; } - Mbështetje për etiketat SELinux (Secmark). Për shembull, për të përcaktuar etiketën "sshtag" në lidhje me kontekstin e SELinux mund të ekzekutohet:
nft add secmark inet filter sshtag "system_u:object_r:ssh_server_packet_t:s0"
Dhe më pas të përdoret kjo etiketë në rregulla:
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 - Mundësia për të specifikuar portet të lidhura me protokollet në formë tekstuale, ashtu siç janë përcaktuar në skedarin /etc/services. Për shembull:
nft add rule x y tcp dport "ssh"
nft list ruleset -l
tabela x {
zinxhir y {
âŠ
tcp dport "ssh"
}
} - Mundësia për të verifikuar llojin e ndërfaqes rrjetë. Për shembull:
add rule inet raw prerouting meta iifkind "vrf" accept
- Përmirësuar mbështetje për përditësimin dinamik të përmbajtjes së grupeve (sets) përmes specifikimit të qartë të flamurit "dynamic". Për shembull, për të përditësuar grupin "s" me shtimin e adresës burimore dhe zerozimin e hyrjes në rastin e mungesës së paketave për 30 sekonda:
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 } - Mundësia për të caktuar një kusht të veçantë për ndodhin e kalimit në timeout. Për shembull, për të tejkaluar timeoutin e paracaktuar për paketat që vijnë në portin 8888 mund të caktosh:
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"
}
} - Mbështetje për NAT për familjen inet:
table inet nat {
âŠ
ip6 daddr dead::2::1 dnat to dead:2::99
} - Mjetet përmirësuese për nxjerrjen e informacionit të gabimeve për shkak të gabimeve të shtypjes:
nft add chain filtre test
Error: No such file or directory; did you mean table "filter" in family ip?
add chain filtre test
^^^^^^ - Mundësia për të specifikuar emrat e ndërfaqeve në grupe (sets):
set sc {
type inet_service . ifname
elements = { "ssh" . "eth0" }
} - Sintaksa e rregullave flowtable është përmirësuar:
nft add table x
nft add flowtable x ft { hook ingress priority 0; devices = { eth0, wlan0 }; }
âŠ
nft add rule x forward ip protocol { tcp, udp } flow add @ft - Përmirësuar mbështetja për JSON.
Burimi: opennet.ru
