Pas një vit zhvillimi lëshimi i filtrit të paketave , duke po zhvillimit si një zëvendësim për iptables, ip6tables, arptables dhe ebtables përmes unifikimit të interfaces së filtrimit të paketave për IPv4, IPv6, ARP dhe ura rrjetesh. Në paketën nftables përfshihen komponentë të filtrit të paketave, të cilët punojnë në hapësirën e përdoruesit, ndërsa në nivelin e bërthamës, funksionin e kryen nën-sistemi nf_tables, i përfshirë në bërthamën Linux që nga versioni 3.13.
Në nivelin e bërthamës ofrohet vetëm një interface e përgjithshme, e pavarur nga protokolli specifik dhe që ofron funksione bazike për nxjerrjen e të dhënave nga paketat, kryerjen e operacioneve me të dhëna dhe menaxhimin e rrjedhave.
Logjika e filtrimit dhe trajtuesit specifikë për protokollet kompilohet në kod bajtësor në hapësirën e përdoruesit, pas së cilës ky kod bajtësor ngarkohet në bërthamë nëpërmjet interface Netlink dhe ekzekutohet në një makinë virtuale të veçantë, e ngjashme me BPF (Berkeley Packet Filters). Ky qasje lejon një reduktim të ndjeshëm të madhësisë së kodit të filtrimit që punon në nivelin e bërthamës dhe sjell të gjitha funksionet e analizës së rregullave dhe logjikës së punës me protokollet në hapësirën e përdoruesit.
TĂ« rejat kryesore:
- Mbështetje për IPsec, e cila lejon përputhjen e adresave të tunelit në lidhje me paketën, 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ë kontrollohet 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ësinë në grup mund të përdoret rregulli
nft add rule netdev foo bar igmp type membership-query counter drop
- Mundësia e përdorimit të variablave 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 maskat për identifikimin e sistemeve operative (OS Fingerprint) në bazë të vlerave TTL në header. Për shembull, për të markuar paketat në varësi të OS-së së 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ësia e përputhjes së adresës ARP të dërguesit me adresën IPv4 të sistemit të synuar. Për shembull, për të rritur numëruesin e paketave ARP të dërguara nga adresa 192.168.2.1 mund të përdoret rregulli:
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
}
} - Mbështetje për kalimin transparent të kërkesave përmes proxy (tproxy). Për shembull, për të drejtuar kërkesat në portin 80 në portin e proxy 8080:
tavolinë ip x {
chain y {
type filter hook prerouting priority -150; policy accept;
tcp dport 80 tproxy to :8080
}
} - Mbështetje për shënimin e soketeve me mundësinë e marrjes së etiketës së caktuar përmes setsockopt() në modin SO_MARK. Për shembull:
table inet x {
chain 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 SELinux mund të startoni:
nft add secmark inet filter sshtag "system_u:object_r:ssh_server_packet_t:s0"
Dhe pastaj të përdorni këtë 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 e specifikimit të porteve të caktuara për protokollet në formë tekstuale, siç janë të përcaktuar në skedarin /etc/services. Për shembull:
nft add rule x y tcp dport "ssh"
nft list ruleset -l
table x {
chain y {
âŠ
tcp dport "ssh"
}
} - Mundësia e kontrollit të llojit të ndërfaqes së rrjetit. Për shembull:
add rule inet raw prerouting meta iifkind "vrf" accept
- Përmirësuar mbështetje për azhurnimin dinamik të përmbajtjeve të grupeve (sets) përmes specifikimit të qartë të flamurit "dynamic". Për shembull, për të azhurnuar grupin "s" me shtimin e adresës burimore dhe resetting e regjistrit në rast të mungesës së paketave për një periudhë prej 30 sekondash:
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 e caktimit të një kushti të veçantë për ngjarjen e skadimit. Për shembull, për të përcaktuar një kohë skadimi të ndryshme për paketat që vijnë në portin 8888 mund të specifikohet:
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 grupin inet:
table inet nat {
âŠ
ip6 daddr dead::2::1 dnat to dead:2::99
} - Mjetet e përmirësuara për të nxjerrë informacionin e gabimeve për shkak të gabimeve të shkrimit:
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 e specifikimit të emrave të ndërfaqeve në grupe (sets):
set sc {
type inet_service . ifname
elements = { "ssh" . "eth0" }
} - Sintaksa e rregullave të flowtable është përditë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 - Mbështetje e përmirësuar për JSON.
Burimi: opennet.ru
