Egy év fejlesztés után a csomagszűrő kiadása , amely az iptables, ip6tables, arptables és ebtables helyettesítéseként fejlődik, a csomagszűrési interfészek egységesítésével IPv4, IPv6, ARP és hálózati hidak számára. Az nftables csomag részeként a felhasználói térben működő csomagszűrő komponensek találhatók, míg a kernel szintjén a nf_tables alrendszer biztosítja a funkciókat, amely a Linux kernel 3.13-as kiadásától kezdve érhető el.
A kernel szintjén csak egy általános interfész áll rendelkezésre, amely nem függ a konkrét protokolltól, és alapvető funkciókat biztosít az adatok csomagokból való kiemelésére, az adatokkal végzett műveletek elvégzésére és a folyamat irányítására.
A szűrési logika és a protokollspecikus kezelők közvetlenül byte-kódra vannak fordítva a felhasználói térben, ezután a byte-kódot a Netlink interfészen keresztül tölti be a kernelbe, és egy speciális virtuális gépen fut, amely hasonlít a BPF (Berkeley Packet Filters) -hez. Ez a megközelítés jelentősen csökkenti a kernel szinten működő szűrések kódjának méretét, és az összes szabályelemzési és protokoll logikát a felhasználói térbe helyezi.
Főbb újítások:
- IPsec támogatása, amely lehetővé teszi a csomagokkal összefüggő alagút címek, IPsec kérésazonosítók és SPI (Security Parameter Index) címkék párosítását. Például,
… ipsec in ip saddr 192.168.1.0/24
… ipsec in spi 1-65536Ezenkívül lehetséges az IPsec alagúton keresztül történő útvonal-ellenőrzés. Például, a nem IPsec-en keresztüli forgalom blokkolásához:
… filter output rt ipsec missing drop
- IGMP (Internet Group Management Protocol) protokoll támogatása. Például a bejövő IGMP tagsági kérések elutasítására a következő szabályt használhatjuk:
nft add rule netdev foo bar igmp type membership-query counter drop
- Változók használatának lehetősége az ugrásláncok (jump / goto) meghatározásához. Például:
define dest = ber
add rule ip foo bar jump $dest - Maszkok támogatása operációs rendszerek azonosításához (OS Fingerprint) a TTL értékek alapján a fejlében. Például a csomagok címkézésére az elküldő OS szerint a következő parancsot használhatjuk:
… meta mark set osf ttl skip name map { "Linux" : 0x1,
"Windows" : 0x2,
"MacOS" : 0x3,
"unknown" : 0x0 }
… osf ttl skip version "Linux:4.20" - A forrás ARP-címének és a célrendszer IPv4-címének párosításának lehetősége. Például az ARP-csomagok számának növeléséhez, amelyeket a 192.168.2.1 címről küldenek, használható a következő szabály:
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
}
} - Képesség a kérések átlátszó proxy-n keresztüli továbbítására (tproxy). Például a 80-as port hívásainak 8080-as proxyport felé történő átirányításához:
table ip x {
chain y {
type filter hook prerouting priority -150; policy accept;
tcp dport 80 tproxy to :8080
}
} - A socketek megjelölésének támogatása, amely lehetővé teszi a megadott címke későbbi megszerzését a setsockopt() segítségével SO_MARK módban. Például:
table inet x {
chain y {
type filter hook prerouting priority -150; policy accept;
tcp dport 8080 mark set socket mark
}
} - A láncok prioritásának szöveges megnevezésének támogatása. Például:
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; } - SELinux címkék támogatása (Secmark). Például a "sshtag" címke SELinux kontextushoz való hozzárendelésének meghatározásához indítsa el a következő parancsot:
nft add secmark inet filter sshtag "system_u:object_r:ssh_server_packet_t:s0"
Aztán ezt a címkét használhatja a szabályokban:
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 - A protokollokhoz rögzített portok szöveges megadásának lehetősége, ahogy azt a /etc/services fájl tartalmazza. Például:
nft add rule x y tcp dport "ssh"
nft list ruleset -l
table x {
chain y {
…
tcp dport "ssh"
}
} - A hálózati interfész típusának ellenőrzésének lehetősége. Például:
add rule inet raw prerouting meta iifkind "vrf" accept
- Javított támogatás a készletek (sets) dinamikus frissítésére az "dynamic" jelző explicit megadásával. Például a "s" készlet frissítéséhez, amely hozzáadja a forráscímet és törli a bejegyzést, ha 30 másodpercig nem érkezett csomag:
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 } - A timeout különálló feltételének megadásának lehetősége. Például a 8888-as portra érkező csomagok alapértelmezett timeout-jának felülírására az alábbiak szerint lehet megadni:
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"
}
} - NAT támogatás az inet család számára:
table inet nat {
…
ip6 daddr dead::2::1 dnat to dead:2::99
} - Javított hibaüzenet-kibővítési eszközök elgépelések miatt:
nft add chain filtre test
Hiba: Nincs ilyen fájl vagy könyvtár; akartad a «filter» táblát az ip családban?
lánc hozzáadása szűrő teszt
^^^^^^ - Lehetőség interfészek neveinek megadására halmazokban (sets):
halmaz sc {
típus inet_service . ifname
elemek = { «ssh» . «eth0» }
} - Frissült a flowtable szabályok szintaxisa:
nft add table x
nft add flowtable x ft { hook ingress priority 0; eszközök = { eth0, wlan0 }; }
…
nft add rule x forward ip protocol { tcp, udp } flow add @ft - Javították a JSON támogatást.
Forrás: opennet.ru
