Das Erstellen von Filterregeln für die Firewall gestaltet sich manchmal etwas trickreich. Nftables erleichtert das durch konsequente Vereinfachung.
Egal, ob bei der Ausbildung zum Systeminformatiker, der Administration im Netzwerk oder der Vorbereitung auf die Stufe 2 des Linux Professional Institutes (LPIC-2) [1]: An der Beschäftigung mit dem Themenschwerpunkt Firewall samt Regeln zum Filtern von Paketen im Netzwerk kommt ein werdender IT-Spezialist nicht vorbei. Nach Ipchains und Ipfw kommt heute als Basis von Firewall-Systemen unter Linux meist Iptables aus dem Netfilter-Projekt [2] zum Einsatz. Unter FreeBSD/NetBSD sowie den beiden Solaris-Nachfolgern Illumos und OpenIndiana ist es hingegen Ipfilter [3].
Bereits in früheren Ausgaben haben wir versucht, mit Beiträgen zu Iptables [4] sowie praktischen Frontends [5] dazu die Arbeit zu erleichtern. Iptables ist jedoch mittlerweile etwas in die Jahre gekommen, und insbesondere der Programmcode entwickelte sich immer komplexer. Kleine Änderungen im Projektkern wirkten sich auf alle weiteren Werkzeuge aus. Iptables, Ip6tables, Ebtables und Arptables entstammen alle derselben Codebasis, aber nicht in Form von Modulen, sondern durch Code-Duplikation. Entsprechend drifteten die vier Tools mit der Zeit auseinander. Iptables war am besten gepflegt, Ebtables das Stiefkind. Bugs, die in Iptables geflickt wurden, klafften in Ebtables noch Jahre später.
Daher begann im Netfilter-Projekt bereits 2009 die Entwicklung des Nachfolgers Nftables [6]. Die ersten beiden Buchstaben von Nftables leiten sich vom Projekt ab, ausgesprochen heißt Nftables schlicht “netfilter tables”. Zu den erklärten Entwicklungszielen zählen mehr Datendurchsatz, größere Skalierbarkeit in Anbetracht geänderter Anforderungen sowie insbesondere ein modularer Aufbau und damit bessere Wartbarkeit [7]. Seit Linux 3.13 (Januar 2014) steckt Nftables direkt im Kernel [8]. Es nutzt dabei interne, bereits bewährte Komponenten des Netfilter-Projekts.
Seit der Veröffentlichung von Debian 10 “Buster” Anfang Juli 2019 setzt auch Debian komplett auf Nftables [9], was sich dann auch auf die Derivate wie Ubuntu und Linux Mint auswirkte. Für RHEL und CentOS gilt seit Version 7 dasselbe [10]. Insgesamt enthalten seit geraumer Zeit alle gängigen Distributionen Nftables – zwar nicht unbedingt aktiv, aber zumindest einsatzbereit.
Aus- und Umbauten
Regeln für Firewalls erstellen Sie mit den Kommandozeilenwerkzeugen iptables (IPv4), ip6tables (IPv6), arptables (ARP-Pakete) und ebtables (Ethernet-Frames). Nftables ersetzt alle vier durch ein einziges Kommandozeilenwerkzeug namens nft, über das Sie nun alle Regeln zur Annahme, Weiterleitung, Modifikation oder Ablehnung von Paketen aus dem Netzwerk auf dem System einstellen.
Während Iptables dabei verschiedene Filter und die drei Verarbeitungsketten (“chains”) INPUT, FORWARD und OUTPUT zur Weiterleitung der Pakete benutzt, kennt das Nftables-Framework so etwas erst, nachdem Sie es selbst definiert haben.
Nft greift auf zwei Bibliotheken zurück: Libnml, eine minimalistische Netlink-Bibliothek [11], sowie Libnftml, eine Netlink-Bibliothek im Userspace [12]. Das führt dazu, dass sich der benötigte Code im Linux-Kernel reduziert und kleine Änderungen an Nft keine Anpassung des Kernels nach sich ziehen [13].
Um sicherzustellen, dass im Kernel des Systems auch das passende Kernel-Modul geladen wurde, helfen die Ausgaben der Kommandos modinfo (Abbildung 1) und lsmod (Abbildung 2). Die Rückmeldungen fallen in den gezeigten Beispielen positiv aus und erlauben, direkt mit Nft loszulegen.
Basiskonfiguration
Nftables kommt zu Beginn mit einem vollständig leeren Regelsatz daher; es gibt keine vordefinierten Tabellen, Ketten oder Regeln. Als Nutzer (beziehungsweise Admin) erstellen Sie zuerst die Tabellen, ergänzen diese um Chains, die sich als Netfilter-Hooks in den Linux-Kernel einklinken, und füllen diese anschließend noch mit den passenden Rules. Alle genannten Schritte erfolgen mithilfe des Kommandos nft, das Sie als Root ausführen.
Listing 1 demonstriert, wie Sie eine Firewall definieren, die (noch) keine Pakete hindurchlässt. Mit dem ersten Kommando legen Sie eine Tabelle für IP-Pakete vom Typ filter an. In der zweiten Zeile fügen Sie der Tabelle filter eine Kette hinzu. In der dritten Zeile kommt zur Kette noch eine Regel dazu, die alle Pakete verwirft (drop).
Listing 1
# nft add table ip filter
# nft add chain ip filter input {type filter hook input priority 0\;}
# nft add rule ip filter input drop
# nft list ruleset -a
# nft delete rule ip filter input handle 2
Mithilfe des Kommandos aus der vierten Zeile erhalten Sie einen Überblick mit allen Regeln der Firewall (Abbildung 3). Neben den Einträgen finden sich dort Kommentare der Form # handle Nummer, über die Sie die Einträge referenzieren. Das wird insbesondere dann interessant, wenn Sie bestehende Festlegungen löschen, ändern oder neue Festlegungen davor beziehungsweise danach einfügen möchten. So löscht der Befehl aus Zeile 5 beispielsweise die Drop-Regel.
Grundlegende Arbeitsweise
Von der Schreibweise der Regeln her setzen die Entwickler von Nft auf den Berkeley Packet Filter (BPF) [14] und orientierten sich unter anderem am Klassiker Tcpdump [15], sodass Sie nicht alles neu erlernen müssen [16].
Dazu stellt Nft eine Reihe von Adressfamilien bereit: Vordefiniert sind arp (ARP), bridge (vorher von Ebtables bereitgestellt), inet (umfasst IPv4 und IPv6), ip (für IPv4), ip6 (für IPv6) sowie netdev. Letzteres dient zur Filterung eingehender Pakete, bevor diese Layer 3 gemäß ISO/OSI-Spezifikation erreichen [17].
Nft fungiert als Übersetzer der Regeln und hält diese in einer kleinen virtuellen Maschine (“nftables core”) zur Kommunikation mit dem Linux-Kernel vor. Soweit sinnvoll, stellen wir nachfolgend anhand von Praxisbeispielen die Schreibweisen und Aufrufe von Iptables und Nft gegenüber.
Das Beispiel in Listing 2 demonstriert das Freischalten des Ports 22 für eingehende Pakete, so wie Sie es für den Zugang über SSH benötigen. Bei Nft reduziert sich der Aufwand auf ein Kommando, zudem ist die Syntax einfacher aufgebaut.
Listing 2
### Eingehende Pakete auf Port 22 erlauben. ### Mit Iptables: # iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT # iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT ### Mit Nft: $ nft add rule inet filter input tcp dport 22 ct state new,established accept
Möchten Sie das Ganze noch um die beiden Ports 80 und 443 erweitern, also um HTTP und HTTPS, benötigen Sie für Iptables pro Port noch zwei weitere Zeilen. Bei Nft genügt es hingegen, die bereits bestehende Zeile zu erweitern, um alle drei Protokolle in einem Rutsch miteinander zu kombinieren. Dazu kommt die Portnummer 22 in geschweifte Klammern, mit Kommas getrennt folgen danach die beiden Ports 80 und 443 (Listing 3).
Listing 3
# nft add rule inet filter input tcp dport { 22, 80, 443 } ct state new,established accept
Bitte beachten Sie, dass die Leerzeichen innerhalb der Klammern exakt so stehen müssen, wie gezeigt – sonst verschluckt sich die Bash und protestiert. Nutzer der Zsh laufen in dasselbe Problem hinein, was sich durch ein passendes Quoting lösen lässt.
Speichern und wiederherstellen
Ähnlich wie bei Iptables lässt sich auch bei den Nftables die Konfiguration in eine Datei sichern. Das erste Kommando aus Listing 4 schreibt den aktuellen Regelsatz in die Datei firewall.config, der zweite Befehl liest die Konfiguration wieder ein.
Listing 4
# nft list ruleset > firewall.config # nft -f firewall.config
Um sicherzugehen, dass sich vor dem Initialisieren der Firewall keine anderen (und eventuell störenden) Regeln mehr im Cache befinden, fügen Sie am Anfang der Konfigurationsdatei firewall.config am besten die Zeile flush ruleset hinzu.
Der Mensch ist bekanntlich ein Gewohnheitstier und arrangiert sich nur schwer mit Änderungen. Für die Eingewöhnungsphase gibt es mit den Kommandos iptables-translate und ip6tables-translate zwei Werkzeuge, die bei Wechsel helfen. Sie wandeln die Schreibweise von Iptables-Firewall-Regeln in jene von Nftables um (Listing 5). Das gelingt sowohl für einzelne Anweisungen als auch für komplette Regelsätze.
Listing 5
$ iptables-translate -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT nft add rule ip filter INPUT tcp dport 22 ct state new counter accept $ ip6tables-translate -A FORWARD -i eth0 -o eth3 -p udp -m multiport --dports 111,222 -j ACCEPT nft add rule ip6 filter FORWARD iifname eth0 oifname eth3 meta l4proto udp udp dport { 111,222} counter accept
Fazit
Nftables hilft dabei, mehrere komplexe Werkzeuge unter einen Hut zu bekommen, und erleichtert so das Absichern des Netzwerks. Um das neue Firewall-Regelwerk gründlich auszuprobieren, können Sie beispielsweise ein Rudel Raspberry Pis in einem kleinen, eigenen Netz verwenden. Alternativ erzeugen Sie ein virtuelles Testnetzwerk mithilfe von Virtualbox oder der pfiffigen Anwendung Mininet [18].
Danksagung
Der Autor bedankt sich bei Axel Beckert und Werner Heuser für Anregungen und Kritik bei der Vorbereitung des Artikels.
Über den Autor
Frank Hofmann arbeitet von unterwegs aus, bevorzugt in Berlin, Genf und Kapstadt, als Entwickler, LPI-zertifizierter Trainer und Autor. Er ist Koautor des Debian-Paketmanagement-Buchs (http://www.dpmb.org).
Infos
-
LPIC 2 Linux Engineer: https://www.lpi.org/our-certifications/lpic-2-overview
-
Netfilter-Projekt: https://netfilter.org
-
Ipfilter: https://en.wikipedia.org/wiki/IPFilter
-
Persistente Iptables-Einträge: Frank Hofmann, “Nachgeladen”, LU 03/2016, S. 86, http://www.linux-community.de/36240
-
Firewall Builder: Florian Effenberger, “Aufbauhilfe”, LU 05/2011, S. 70, http://www.linux-community.de/22939
-
Nftables: https://netfilter.org/projects/nftables
-
“What comes after iptables?”: https://developers.redhat.com/blog/2016/10/28/what-comes-after-iptables-its-successor-of-course-nftables
-
“Why you will love nftables”: https://home.regit.org/2014/01/why-you-will-love-nftables
-
Nftables in Debian: https://wiki.debian.org/nftables
-
“Hello nftables, Goodbye iptables”: https://linuxnewbieguide.org/hello-nftables-goodbye-iptables
-
Libmnl: https://git.netfilter.org/libmnl
-
Libnftnl: https://git.netfilter.org/libnfnetlink
-
“IPtables vs. nftables”: https://digitalglarus.ch/en-us/cms/blog/2018/08/19/iptables-vs-nftables
-
Berkeley Packet Filter (BPF): https://en.wikipedia.org/wiki/Berkeley_Packet_Filter
-
Tcpdump: https://www.tcpdump.org
-
“Differences between iptables and nftables explained”: https://linux-audit.com/differences-between-iptables-and-nftables-explained/
-
ISO/OSI-Modell: https://de.wikipedia.org/wiki/OSI-Modell
-
Mininet: http://mininet.org








