Die Veröffentlichung des Paketfilter-Systems nftables 1.0.0 wurde angekündigt, das die Filterinterfaces für IPv4, IPv6, ARP und Netzwerkbrücken vereinheitlicht (zielt darauf ab, iptables, ip6tables, arptables und ebtables zu ersetzen). Die erforderlichen Änderungen für die Betriebsfähigkeit der Version nftables 1.0.0 sind im Linux-Kernel 5.13 enthalten. Der signifikante Versionswechsel steht nicht im Zusammenhang mit grundlegenden Veränderungen, sondern ist lediglich das Ergebnis einer fortlaufenden Dezimalzahlennummerierung (die vorherige Version war 0.9.9).
Das Paket nftables umfasst Komponenten des Paketfilters, die im Benutzermodus arbeiten, während auf Kernel-Ebene das Subsystem nf_tables, das seit Version 3.13 Teil des Linux-Kernels ist, die Arbeit bereitstellt. Auf Kernel-Ebene wird nur eine allgemeine Schnittstelle bereitgestellt, die unabhängig vom spezifischen Protokoll ist und grundlegende Funktionen zum Extrahieren von Daten aus Paketen, Ausführen von Datenoperationen und Steuern des Flusses bietet.
Die eigentlichen Filterregeln und protokollspezifischen Handler werden im Benutzermodus in Bytecode kompiliert, danach wird dieser Bytecode über die Netlink-Schnittstelle in den Kernel geladen und dort in einem speziellen virtuellen Maschine, der an BPF (Berkeley Packet Filters) erinnert, ausgeführt. Dieser Ansatz ermöglicht es, die Größe des im Kernel arbeitenden Filtercodes erheblich zu reduzieren und alle Funktionen zur Regel-Parsing und zur Logik der Protokollverarbeitung in den Benutzermodus auszulagern.
Hauptneuheiten:
- In set-Listen wurde die Unterstützung für das Maskenelement „*“ hinzugefügt, das für alle Pakete ausgelöst wird, die nicht unter andere im Set definierte Elemente fallen. table x { map blocklist { type ipv4_addr : verdict flags interval elements = { 192.168.0.0/16 : accept, 10.0.0.0/8 : accept, * : drop } } chain y { type filter hook prerouting priority 0; policy accept; ip saddr vmap @blocklist } }
- Es wurde die Möglichkeit eingeführt, Variablen aus der Kommandozeile mit der Option „—define“ festzulegen. # cat test.nft table netdev x { chain y { type filter hook ingress devices = $dev priority 0; policy drop; } } # nft —define dev=„{ eth0, eth1 }“ -f test.nft
- In map-Listen ist die Anwendung von zustandsbehafteten (stateful) Ausdrücken erlaubt: table inet filter { map portmap { type inet_service : verdict counter elements = { 22 counter packets 0 bytes 0 : jump ssh_input, * counter packets 0 bytes 0 : drop } } chain ssh_input { } chain wan_input { tcp dport vmap @portmap } chain prerouting { type filter hook prerouting priority raw; policy accept; iif vmap { „lo“ : jump wan_input } } }
- Der Befehl „list hooks“ wurde hinzugefügt, um eine Liste der Handler für die angegebene Paketfamilie auszugeben: # nft list hooks ip device eth0 family ip { hook ingress { +0000000010 chain netdev x y [nf_tables] +0000000300 chain inet m w [nf_tables] } hook input { -0000000100 chain ip a b [nf_tables] +0000000300 chain inet m z [nf_tables] } hook forward { -0000000225 selinux_ipv4_forward 0000000000 chain ip a c [nf_tables] } hook output { -0000000225 selinux_ipv4_output } hook postrouting { +0000000225 selinux_ipv4_postroute } }
- In den „queue“-Blöcken ist es erlaubt, jhash, symhash und numgen für die Verteilung von Paketen auf Warteschlangen im Benutzerspeicher zu kombinieren. … queue to symhash mod 65536 … queue flags bypass to numgen inc mod 65536 … queue to jhash oif . meta mark mod 32 „queue“ kann auch mit map-Listen kombiniert werden, um die Warteschlange im Benutzerspeicher basierend auf beliebigen Schlüsseln auszuwählen. … queue flags bypass to oifname map { „eth0“ : 0, „ppp0“ : 2, „eth1“ : 2 }
- Es wurde die Möglichkeit geschaffen, Variablen, die eine set-Liste beinhalten, in mehreren Maps zu enthüllen. define interfaces = { eth0, eth1 } table ip x { chain y { type filter hook input priority 0; policy accept; iifname vmap { lo : accept, $interfaces : drop } } } # nft -f x.nft # nft list ruleset table ip x { chain y { type filter hook input priority 0; policy accept; iifname vmap { „lo“ : accept, „eth0“ : drop, „eth1“ : drop } } }
- Das Kombinieren von vmap (verdict map) mit Intervallen ist erlaubt: # nft add rule x y tcp dport . ip saddr vmap { 1025-65535 . 192.168.10.2 : accept }
- Die Syntax für NAT-Zuordnungen wurde vereinfacht. Es ist erlaubt, Adressbereiche anzugeben: … snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } oder explizite IP-Adressen und Ports: … dnat to ip saddr map { 10.141.11.4 : 192.168.2.3 . 80 } oder Kombinationen von IP-Bereichen und Ports: … dnat to ip saddr . tcp dport map { 192.168.1.2 . 80 : 10.141.10.2-10.141.10.5 . 8888-8999 }
Quelle: opennet.ru
