{"id":8983,"date":"2022-05-29T19:40:14","date_gmt":"2022-05-29T17:40:14","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=8983"},"modified":"2022-12-12T14:40:59","modified_gmt":"2022-12-12T12:40:59","slug":"einstiegt-in-nftables-so-funktioniert-die-neue-firewall-unterschiede-zu-iptables","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/einstiegt-in-nftables-so-funktioniert-die-neue-firewall-unterschiede-zu-iptables\/","title":{"rendered":"Einstiegt in nftables: So funktioniert die neue Firewall &#8211; Unterschiede zu iptables"},"content":{"rendered":"<p>Sowohl <strong>Nftables <\/strong>als auch <strong>Iptables <\/strong>erm\u00f6glichen grundlegende Funktionen einer Firewall, darunter etwa Netzwerkpakete anhand bestimmter Regeln zu filtern (erlauben\/blockieren), protokollieren oder umzuleiten. Network Adress Translation (NAT) kann ebenfalls umgesetzt werden. Dieser Beitrag soll Neulingen einen Einstieg in <strong>iptables <\/strong>erm\u00f6glichen. Zus\u00e4tzlich werden wir die Unterschiede zu <strong>iptables <\/strong>betrachten und die Frage beantworten, wieso es mit <strong>iptables <\/strong>und <strong>nftables <\/strong>zwei in ihrer Funktion recht \u00e4hnliche Werkzeuge gibt.<\/p>\n<h2 class=\"wp-block-heading\">Was ist eine Firewall?<\/h2>\n<p>Eine Firewall kann man sich wie einen T\u00fcrsteher vorstellen: Anhand selbst festgelegter Regeln sch\u00fctzt sie einen Computer oder das gesamtes Netzwerk vor unerw\u00fcnschten Netzwerkzugriffen. Beispielsweise kann man damit den Zugriff auf Dienste wie SSH nur f\u00fcr bestimmte IP-Adressen erlauben. Oder b\u00f6swillige IP-Adressen blockieren, sodass s\u00e4mtliche Verbindungsversuche von Ihnen abgelehnt werden. Es gibt Hardware-Firewalls, also physische Ger\u00e4te mit dieser Funktionalit\u00e4t. In nahezu jedem DSL-Modem ist beispielsweise eine Firewall eingebaut, um das Heimnetzwerk gegen\u00fcber dem Internet zu sch\u00fctzen. Man kann aber auch Software-Firewalls direkt auf dem zu sch\u00fctzenden Ger\u00e4t selbst installieren, etwa einem Computer oder Server. Grundlegende Funktionen daf\u00fcr bieten <strong>Nftables <\/strong>und <strong>Iptables<\/strong>.<\/p>\n<h2 class=\"wp-block-heading\">Was sind iptables?<\/h2>\n<p>Grundlage beider Projekte ist <a href=\"https:\/\/www.netfilter.org\/\" title=\"Netfilter\" target=\"_blank\" rel=\"nofollow\">Netfilter<\/a>, eine seit 1998 existierende Softwareschicht im Linux-Kernel. Dazu geh\u00f6rt eine gleichnamige Bibliothek, mit der man auf bestimmte Ereignisse im Linux Network-Stack reagieren kann, wie z.B. eingehende oder Ausgehende Datenpakete. <strong>Iptables <\/strong>entstand ebenfalls 1998 und war das erste Kommandozeilenwerkzeug, um Filterregeln anzulegen. Die Regeln werden in Form von Tabellen dargestellt. Jede gibt an, was an einem Paket \u00fcberpr\u00fcft wird und was bei einer \u00dcbereinstimmung geschieht. Beispielsweise k\u00f6nnten Datenpakete von einer bestimmten IP-Adresse oder einem Port erlaubt oder verworfen werden.<\/p>\n<h2 class=\"wp-block-heading\">Warum gibt es nftables?<\/h2>\n<p>Die iptables-Werkzeuge wurden mehrfach erweitert und erg\u00e4nzt. So gibt es unter andrem <strong>iptables<\/strong> f\u00fcr IPv4, <strong>ip6tables<\/strong> f\u00fcr den Nachfolger IPv6 und <strong>arptables<\/strong>. Bei ARP geht es um die Zuordnung von IP- zu Hardware-Adressen (MAC) der Netzwerkschnittstellen. Durch die getrennten Werkzeuge sind Teile des Programmcodes mehrfach vorhanden. <strong>Nftables <\/strong>ist eine Neuentwicklung, die ebenfalls auf Netfilter basiert &#8211; allerdings s\u00e4mtliche Funktionen in einem einzigen Werkzeug namens <strong>nft<\/strong> b\u00fcndelt. Das Projekt wurde als Nachfolger entwickelt und existiert seit 2009. Seit 2016 bietet <strong>nftables <\/strong>die gleichen Funktionen wie <strong>iptables<\/strong>, mittlerweile ist es sogar m\u00e4chtiger. Lange Zeit existierten beide Projekte daher parallel und iptables war verbreiteter.<\/p>\n<p>Das \u00e4ndert sich zunehmend, da es eine Kompatibilit\u00e4tsschicht gibt. <a href=\"https:\/\/wiki.nftables.org\/wiki-nftables\/index.php\/Moving_from_iptables_to_nftables\" title=\"Mithilfe von iptables-translate\" target=\"_blank\" rel=\"nofollow\">Mithilfe von iptables-translate<\/a> kann man zudem bestehende Regeln in <strong>nftables <\/strong>umwandeln lassen. Einige Linux-Distributionen sind bereits gewechselt oder haben dies angek\u00fcndigt. <a href=\"https:\/\/wiki.debian.org\/iptables\" title=\"Unter Debian (und damit auch dem Raspberry Pi OS) ist nftables seit Buster der neue Standard\" target=\"_blank\" rel=\"nofollow\">Unter Debian (und damit auch dem Raspberry Pi OS) ist nftables seit Buster der neue Standard<\/a>. Man kann mithilfe von update-alternatives zur\u00fcck zum alten <strong>iptables <\/strong>wechseln:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo update-alternatives --set iptables \/usr\/sbin\/iptables-legacy\n# Oder zun\u00e4chst nur einsehen, was als Standard f\u00fcr iptables konfiguriert ist\n# Ein Verweis auf iptables-nft steht f\u00fcr nftables, &quot;iptables&quot; ohne nft = iptables\nupdate-alternatives --display iptables<\/code><\/pre>\n<p>Dies funktioniert analog f\u00fcr <strong>ip6tables<\/strong>, <strong>arptables <\/strong>und <strong>ebtables<\/strong>. Allerdings ist iptables veraltet und wird daher voraussichtlich in einer der n\u00e4chsten Hauptversionen entfernt. Zumindest mittelfristig sollte man daher zu nftables wechseln, <a href=\"https:\/\/wiki.debian.org\/nftables#Should_I_replace_an_iptables_firewall_with_a_nftables_one.3F\" title=\"wie es auch im Debian-Wiki empfohlen wird\" target=\"_blank\" rel=\"nofollow\">wie es auch im Debian-Wiki empfohlen wird<\/a>.<\/p>\n<h2 class=\"wp-block-heading\">Worin unterscheiden sich iptables und nftables haupts\u00e4chlich?<\/h2>\n<p>Unter <strong>nftables <\/strong>werden s\u00e4mtliche Regeln mit dem Kommandozeilenwerkzeug <strong>nft <\/strong>verwaltet. Ob es sich dabei um IPv4, V6 oder andere Protokolle wie ARP handelt, spielt keine Rolle. Es gibt keine getrennten Werkzeuge wie <strong>iptables, ip6tables<\/strong> etc. mehr. <\/p>\n<p>Sowohl <strong>iptables <\/strong>als auch <strong>nftables <\/strong>arbeiten mit Tabellen und Ketten (chains). W\u00e4hrend es bei <strong>iptables <\/strong>standardm\u00e4\u00dfig bestimmte Tabellen (z.B. Filter, NAT) und Ketten (INPUT, FORWARD, usw.) gab, ist dies bei <strong>nftables <\/strong>nicht der Fall. Dies wird mit der Leistung begr\u00fcndet, da man so nur jene Tabellen\/Ketten anlegen kann, die auch wirklich ben\u00f6tigt werden.<\/p>\n<p>Die Handhabung wurde in <strong>nftables <\/strong>an mehreren Stellen verbessert. Beispielsweise sind alle Regeln automatisch persistent. Manuelles importieren beim Serverstart mit <strong>iptables-save<\/strong> und <strong>iptables-restore<\/strong> entf\u00e4llt. <\/p>\n<p>Die Regeln sind flexibler geworden: Man kann mehrere Aktionen in einer einzelnen Regel angeben. Bei <strong>iptables <\/strong>war nur eine einzige (z.B. <strong>-j ACCEPT<\/strong> oder <strong>-j LOG<\/strong>) m\u00f6glich. Wer mehrere Regeln erstellt, spart sich Wiederholungen durch den hierarchischen Aufbau.<\/p>\n<p>Interessant ist ebenfalls die komfortable M\u00f6glichkeit, um Regeln in einer Datei angeben und laden zu k\u00f6nnen. Das vermeidet lange, un\u00fcbersichtliche und im Zweifel undokumentierte Konsolenbefehle.<\/p>\n<h2 class=\"wp-block-heading\">Einstieg in nftables<\/h2>\n<h3 class=\"wp-block-heading\">Ist nftables bei mir installiert?<\/h3>\n<p>Unter Debian (ab Buster), Ubuntu (ab 20.10), CentOS (ab 8) und Fedora (32) ist nftables bereits standardm\u00e4\u00dfig installiert. Unter anderen\/\u00e4lteren Distributionen muss es ggf. nachinstalliert werden, meist hei\u00dft das Paket daf\u00fcr ebenfalls <strong>nftables<\/strong>.<\/p>\n<p>Wenn ihr euch nicht sicher seid, k\u00f6nnt ihr pr\u00fcfen, ob das Kernel-Modul <strong>nf_tables<\/strong> geladen ist:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ sudo lsmod | egrep ^nf_tables\nnf_tables             241664  1649 nft_reject_ipv4,nft_ct,nft_compat,nft_log,nft_nat,nft_fib_ipv4,nft_counter,nft_masq,nft_chain_nat,nft_reject,nft_fib<\/code><\/pre>\n<p>Eine Liste aller aktiven Regeln l\u00e4sst sich mit folgendem Befehl anzeigen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo nft list ruleset<\/code><\/pre>\n<p>In der Regel wird diese Liste leer sein. Au\u00dfer ihr habt Software installiert, die eigene Regeln anlegt. Das ist beispielsweise bei Docker der Fall, um Funktionen wie Portfreigaben umzusetzen.<\/p>\n<h3 class=\"wp-block-heading\">Befehle per CLI ausf\u00fchren: Anlegen der ersten Tabelle, Kette und Regel<\/h3>\n<p>Man hat die Wahl, ob man einzelne Konsolenbefehle wie bei <strong>iptables <\/strong>verwendet &#8211; oder die Konfiguration in einer Datei speichert. Beginnen wir mit einer Tabelle, die <a href=\"https:\/\/wiki.nftables.org\/wiki-nftables\/index.php\/Nftables_families\" title=\"eine Protokollfamilie\" target=\"_blank\" rel=\"nofollow\">eine Protokollfamilie<\/a> festlegt. Hier wird <strong>inet<\/strong> verwendet f\u00fcr alle Internetprotokolle (IPv4 und der Nachfolger v6). Insgesamt sechs Familien existieren, man k\u00f6nnte z.B. auch <strong>ip<\/strong> angeben, um ausschlie\u00dflich IPv4 Datenverkehr zu behandeln. Oder <strong>ip6<\/strong> f\u00fcr V6. Zuletzt folgt der frei w\u00e4hlbare Name der Tabelle <strong>basic-filter<\/strong>:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo nft add table inet basic-filter<\/code><\/pre>\n<p>Innerhalb einer Tabelle k\u00f6nnen wir nun Ketten anlegen. Eine Kette hat einen bestimmten Typ und reagiert auf ein Ereignis. Wichtig: Ketten und Regeln erhalten Sonderzeichen wie z.B. geschweifte Klammern, die von der Shell (meist Bash) interpretiert werden! Ihr m\u00fcsst diese daher entweder mit einem umgekehrten Schr\u00e4gstrich \\ escapen, etwa \\{ statt { oder in einfachen Anf\u00fchrungsstrichen &#8218; maskieren. Ich empfehle einfache Anf\u00fchrungsstriche. Doppelte funktionieren nicht, da Bash nur innerhalb einfacher Anf\u00fchrungszeichen nichts interpretiert. Die Anf\u00fchrungsstriche sollten nach dem <strong>nft <\/strong>Befehl beginnen.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo nft &#039;add chain inet basic-filter input { type filter hook input priority filter; ... }&#039;<\/code><\/pre>\n<p>An der &#8230; Stelle w\u00fcrden nun die Regeln folgen, die wir uns im folgenden aber besser in einer eigenen Datei anschauen. Das ist deutlich komfortabler und \u00fcbersichtlicher, als l\u00e4ngere Konsolenbefehle zu nutzen.<\/p>\n<h3 class=\"wp-block-heading\">Grundlegende Regeln als Datei<\/h3>\n<p>Dazu legen wir eine frei w\u00e4hlbare Datei (z.B. <strong>nft_basic_rules.conf<\/strong>) an und definieren die Regeln wie folgt:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">#!\/usr\/sbin\/nft -f\n\n# Optional: L\u00f6scht alle m\u00f6glicherweise bereits existierenden Regeln\n# flush ruleset\n\ntable inet basic-filter {\n        chain input {\n                type filter hook input priority filter\n                policy drop\n                ct state { established, related } accept\n\n                iifname lo accept\n                ct state new tcp dport ssh log prefix &quot;Neue SSH-Verbindung &quot; accept\n        }\n}<\/code><\/pre>\n<p>Diese legt eine Tabelle und Kette (Chain) an, die auf eingehende IP-Pakete (V4 und V6) reagiert. Nur SSH und lokale Verbindungen auf der Loopback-Schnittstelle (127.0.0.1) wird erlaubt, alle anderen Pakete verworfen. <\/p>\n<ul class=\"wp-block-list\">\n<li>Mit <strong>flush ruleset<\/strong> werden alle m\u00f6glicherweise bereits existierenden Regeln gel\u00f6scht. Dies ist Sinnvoll, wenn es keine weiteren Regeln gibt. So ist sichergestellt, dass nur die folgenden definierten vorhanden sind. Sollte allerdings nicht genutzt werden, falls es bereits wichtige Regeln gibt. Diese k\u00f6nnen auch automatisch von anderen Programmen generiert worden sein, ohne dass dies einem bewusst ist &#8211; beispielsweise Docker.<\/li>\n<li>Da nftables wie schon iptables in Tabellen organisiert ist, legen wir zun\u00e4chst eine an. Hier steht <strong>inet<\/strong> f\u00fcr die Protokollfamilie, d.H. IPv4 und IPv6. Der Name <strong>basic-filter<\/strong> ist frei w\u00e4hlbar, sollte aber m\u00f6glichst aussagekr\u00e4ftig sein. Sehr generische Namen wie <strong>filter, nat<\/strong> etc. sollten nicht gew\u00e4hlt werden, hier kann es ggf. zu Konflikten kommen. Etwa derzeit mit KVM, dort wird derzeit noch eine Kompatibilit\u00e4tsschicht verwendet, die mit nativen nftables Regeln nicht funktioniert.<\/li>\n<li>Es folgt eine Kette, die ich (ebenfalls frei w\u00e4hlbar) <strong>input <\/strong>genannt habe. Es empfiehlt sich eine Benennung, die auf den Hook (siehe unten) schlie\u00dfen l\u00e4sst.<\/li>\n<li><strong>filter<\/strong> ist <a href=\"https:\/\/wiki.nftables.org\/wiki-nftables\/index.php\/Configuring_chains#Base_chain_types\" title=\"einer von drei Typen\" target=\"_blank\" rel=\"nofollow\">einer von drei Typen<\/a>. Wie der Name vermuten l\u00e4sst, k\u00f6nnen wir damit Pakete anhand verschiedener Kriterien filtern. Dieser Typ ist am meisten verbreitet. F\u00fcr andere Anwendungsf\u00e4lle gibt es u.a. noch NAT.<\/li>\n<li><strong>hook<\/strong> gibt <a href=\"https:\/\/wiki.nftables.org\/wiki-nftables\/index.php\/Netfilter_hooks\" title=\"ein Ereignis von Netfilter\" target=\"_blank\" rel=\"nofollow\">ein Ereignis von Netfilter<\/a> an. Oder anders ausgedr\u00fcckt die Stelle im Lebenslauf eines Pakets, an der diese Regel greift. Insgesamt stehen <a href=\"https:\/\/wiki.nftables.org\/wiki-nftables\/index.php\/Configuring_chains#Base_chain_hooks\" title=\"sechs Hooks zur Verf\u00fcgung\" target=\"_blank\" rel=\"nofollow\">sechs Hooks zur Verf\u00fcgung<\/a>. Je nach verwendetem Hook erreichen m\u00f6glicherweise nicht alle Pakete eine Regel. Mit <strong>input<\/strong> k\u00f6nnen wir uns sicher sein, dass die Pakete f\u00fcr unser System bestimmt sind. <\/li>\n<li>Mit der Priorit\u00e4t (<strong>priority<\/strong>) l\u00e4sst sich festlegen, welche Regel Vorrang hat. Dies ist eher f\u00fcr komplexere Regels\u00e4tze relevant, wir setzen daher hier den Standard f\u00fcr Filter.<\/li>\n<li>Die Standardaktion <strong>policy drop<\/strong> verwirft alle Pakete, die nicht unseren folgenden Regeln entsprechen.<\/li>\n<li><strong>ct state<\/strong> steht f\u00fcr <strong>connection tracking<\/strong> und gibt <a href=\"https:\/\/wiki.nftables.org\/wiki-nftables\/index.php\/Matching_connection_tracking_stateful_metainformation#ct_state_-_conntrack_state\" title=\"den Zusta\" target=\"_blank\" rel=\"nofollow\">den Zusta<\/a><a href=\"https:\/\/wiki.nftables.org\/wiki-nftables\/index.php\/Matching_connection_tracking_stateful_metainformation#ct_state_-_conntrack_state\" target=\"_blank\" rel=\"nofollow\">nd<\/a> eines Paketes an. <em>Established <\/em>sind weitere Pakete einer Verbindung, die bereits berechtigt wurde. <em>Related<\/em> dagegen erwartete neue Verbindung einer bestehenden Hauptverbindung, wie etwa ein FTP-Datenkanal. Bei FTP gibt es einen Steuerkanal, der Meta-Informationen wie Verzeichnisinhalte \u00fcbertr\u00e4gt. Soll eine Datei hoch- oder heruntergeladen werden, \u00f6ffnet dieser Steuerkanal eine zweite Verbindung f\u00fcr den Inhalt. Diese zweite Verbindung wird hiermit erlaubt. <a href=\"https:\/\/thermalcircle.de\/doku.php?id=blog:linux:connection_tracking_3_state_and_examples\" title=\"Weitere Details zum Connection tracking finden sich hier\" target=\"_blank\" rel=\"nofollow\">Weitere Details zum Connection tracking finden sich hier<\/a>.<\/li>\n<li>Es folgt eine Regel, die per <strong>iifname<\/strong> nur auf die Loopback-Schnittstelle (<strong>lo<\/strong> ist der Standardname) angewendet wird. Sie erlaubt jeglichen Datenverkehr auf dieser Schnittstelle, die nur f\u00fcr lokale Verbindungen auf dem Server selbst genutzt wird.<\/li>\n<li>Schlussendlich erlauben wir neue SSH-Verbindungen auf dem Standardport 22, da wir uns ansonsten selbst aussperren w\u00fcrden. Die Anweisung <strong>dport<\/strong> steht f\u00fcr <em>destination port<\/em>, also Zielport. Hier kann man auch eine beliebige Portnummer angeben, z.B. 81. Zus\u00e4tzlich habe ich hier mit <strong>log<\/strong> die Protokollierung aktiviert, <strong>prefix<\/strong> schreibt die folgende Zeichenkette in das Log, damit wir sie wieder finden. <\/li>\n<li>Ein weiterer Vorteil der Datei: Man erspart sich Wiederholungen. Auf der Konsole m\u00fcsste man f\u00fcr die Kette (chain) beispielsweise immer Name und Typ der Tabelle angeben. Da die Datei hierarchisch aufgebaut ist, entf\u00e4llt dies dort.<\/li>\n<\/ul>\n<p>Laden kann man die Regeln aus der angelegten Datei mit dem <strong>-t<\/strong> Schalter. Mit <strong>list ruleset<\/strong> l\u00e4sst sich sicherstellen, dass diese tats\u00e4chlich aktiv angewendet werden:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">$ sudo nft -f nft_basic_rules.conf\n$ sudo nft list ruleset\ntable ip basic-filter {\n\tchain input {\n\t\ttype filter hook input priority filter; policy drop;\n\t\tct state { established, related } accept\n\t\tiifname &quot;lo&quot; accept comment &quot;allow from loopback&quot;\n\t\tct state new tcp dport 22 log prefix &quot;Neue SSH-Verbindung &quot; accept\n\t}\n}<\/code><\/pre>\n<h3 class=\"wp-block-heading\">Einsehen der Protokolle: Welche Regeln wurde wann angewendet?<\/h3>\n<p>Bei der Erlaubnisregel f\u00fcr SSH haben wir die Protokollierung aktiviert. Dies ist vor allem bei Tests hilfreich. Im Protokoll des Kernels (<strong>\/var\/log\/kern.log<\/strong>) lassen sich diese Eintr\u00e4ge auslesen. Am einfachsten geht das mit dem Werkzeug <strong>dmesg<\/strong>. Der Schalter <strong>&#8211;follow<\/strong> folgt dem Protokoll, sodass neue Eintr\u00e4ge in Echtzeit angezeigt werden:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo dmesg --follow<\/code><\/pre>\n<p>F\u00fcr eine neue SSH-Verbindung erscheint dort beispielsweise folgender Eintrag:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">[  441.703526] Neue SSH-Verbindung IN=eth0 OUT= MAC=... SRC=... DST=... LEN=60 TOS=0x00 PREC=0x00 TTL=46 ID=24203 DF PROTO=TCP SPT=50492 DPT=22 WINDOW=29200 RES=0x00 SYN URGP=0<\/code><\/pre>\n<p>Aus Leistungsgr\u00fcnden ist zu empfehlen, die Protokollierung abzuschalten, wenn sie nicht (mehr) ben\u00f6tigt wird. Weitere Informationen finden sich <a href=\"https:\/\/wiki.nftables.org\/wiki-nftables\/index.php\/Logging_traffic\" title=\"im nftables Wiki zur Protokollierung (englisch)\" target=\"_blank\" rel=\"nofollow\">im nftables Wiki zur Protokollierung (englisch)<\/a>.<\/p>\n<h3 class=\"wp-block-heading\">Automatisches Laden der Regeln beim Systemstart<\/h3>\n<p>Damit die gespeicherten Regeln beim Start automatisch geladen werden, muss der Dienst <strong>nftables<\/strong> aktiv sein. Standardm\u00e4\u00dfig ist dies bei Ubuntu 22.04 LTS nicht der Fall (<em>Active: inactive<\/em>):<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ sudo systemctl status nftables\n\u25cb nftables.service - nftables\n     Loaded: loaded (\/lib\/systemd\/system\/nftables.service; disabled; vendor preset: enabled)\n     Active: inactive (dead)<\/code><\/pre>\n<p>In diesem Falle den Dienst aktivieren:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo systemctl enable nftables<\/code><\/pre>\n<p>Der Dienst l\u00e4dt alle Regeln aus der Datei <strong>\/etc\/nftables.conf<\/strong>. Wenn ihr eure Regeln in einer lokalen Datei abgespeichert habt wie im vorherigen Schritt gezeigt, k\u00f6nnt ihr diese dort hin kopieren:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo cp nft_basic_rules.conf \/etc\/nftables.conf<\/code><\/pre>\n<p>Sind allerdings noch andere Regeln vorhanden, weil ihr z.B. zuvor bereits h\u00e4ndische per CLI angelegt habt, empfiehlt es sich, die aktiven zu exportieren:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo nft list ruleset | sudo tee \/etc\/nftables.conf<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Gibt es Alternative Firewalls?<\/h2>\n<p>Sowohl <strong>iptables <\/strong>als auch <strong>nftables <\/strong>sind Low-Level Werkzeuge, d.H. recht nah am Kernel und damit an der Hardware. Das ist perfekt zum lernen oder wenn man m\u00f6glichst wenige Tools einsetzen bzw. m\u00f6glichst viel Kontrolle haben m\u00f6chte. Daf\u00fcr bringt es aber relativ viel Komplexit\u00e4t mit, vor allem iptables. Alternativ kann man daher Firewalls nutzen, die wiederum auf nftables\/iptables aufbauen. Unter Ubuntu\/Debian ist beispielsweise <strong>ufw <\/strong>(uncomplicated firewall, auf Deutsch: Unkomplizierte Firewall) verbreitet und standardm\u00e4\u00dfig aktiv:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ sudo systemctl status ufw\n\u25cf ufw.service - Uncomplicated firewall\n     Loaded: loaded (\/lib\/systemd\/system\/ufw.service; enabled; vendor preset: enabled)\n     Active: active (exited) since Tue 2022-05-24 12:12:44 CEST; 4 days ago<\/code><\/pre>\n<p>Dort kann man beispielsweise den SSH-Zugriff mit folgendem Befehl vergleichsweise einfach erlauben:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo ufw allow ssh<\/code><\/pre>\n<p>In der Red-Hat\/CentOS und Suse-Szene ist dagegen <strong>firewalld <\/strong>die Standard-Firewall. W\u00e4hrend diese Werkzeuge alle konsolenbasiert sind, gibt es teils auch grafische Oberfl\u00e4chen zur Verwaltung.<\/p>\n<h2 class=\"wp-block-heading\">\u00dcbersicht der wichtigsten Befehle (Cheatsheet)<\/h2>\n<p>Nftables muss grunds\u00e4tzlich als root (su\/sudo) ausgef\u00fchrt werden. Der Aufbau der Befehle kann auch f\u00fcr andere Typen \u00fcbernommen werden.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\"># Alle Regeln l\u00f6schen\nnft flush ruleset\n# Nur alle Regeln innerhalb der Tabelle basic-filter l\u00f6schen\nnft flush table basic-filter\n# L\u00f6schen der Tabelle selbst\nnft delete table basic-filter\n# Kette (Chain) leeren\nnft flush chain basic-filter\n# L\u00f6schen der Kette input in der Tabelle basic-filter\nnft delete chain basic-filter input\n\n# L\u00f6schen einer spezifischen Regel: Zun\u00e4chst brauchst du das Handle (Nummer am Ende der Zeile)\n# basic-filter ist der Name der Tabelle, inet dessen Protokollfamilie\nsudo nft -a list table inet basic-filter\n# L\u00f6scht Regel mit dem Handle 5 (Beispiel, Nummer s.o.) aus der Kette input in der Tabelle basic-filter\nsudo nft delete rule inet basic-filter input handle 5\n\n# S\u00e4mtliche Regeln aus der angegebenen Datei laden\nnft -f my_rules.conf\n# Alle derzeit aktiven Regeln auflisten\nnft list ruleset<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Fazit und Erweiterungen<\/h2>\n<p>Nftables optimiert einiges, was bei iptables \u00fcber die Jahre historisch gewachsen ist, wie man so sch\u00f6n sagt. Dieser Beitrag dient als Einstieg f\u00fcr Neulinge und zeigt nur eine sehr einfache Konfiguration als grundlegendes Beispiel. Man kann jedoch noch deutlich mehr damit machen, daher wird man die Regeln in der Praxis erweitern. Vom komplexeren Filterregeln bis hin <a href=\"https:\/\/wiki.nftables.org\/wiki-nftables\/index.php\/Performing_Network_Address_Translation_(NAT)\" title=\"zu NAT\" target=\"_blank\" rel=\"nofollow\">zu NAT<\/a> ist vieles m\u00f6glich. <\/p>\n<p>NAT (<em>Network Adress Translation<\/em>) ist in Form von Destination-NAT z.B. dann n\u00fctzlich, wenn man Ports nach au\u00dfen hin auf andere Ports mappen m\u00f6chte. Etwa eine Anwendung die auf Port 8080 l\u00e4uft auf Port 80 erreichbar machen. Oder mehrere VMs auf dem Server laufen, von denen man gezielt einzelne Ports ins Internet freigeben m\u00f6chte (z.B. Port 80\/443 auf Webserver-VM1, IMAP-Ports auf Mailserver-VM2 usw).<\/p>\n<h2 class=\"wp-block-heading\">Weiterf\u00fchrende Informationen<\/h2>\n<ul class=\"wp-block-list\">\n<li>F\u00fcr eine tiefergehende Konfiguration ist <a href=\"https:\/\/wiki.nftables.org\/wiki-nftables\/index.php\/Main_Page\" title=\"das Wiki von nftables\" target=\"_blank\" rel=\"nofollow\">das Wiki von nftables<\/a> hilfreich. Es ist zwar nur in englischer Sprache verf\u00fcgbar, enth\u00e4lt aber oft grundlegende Erkl\u00e4rungen und Beispiele. <\/li>\n<li>Wie bei vielen Linux-Werkzeugen kann auch ein Blick <a href=\"https:\/\/www.netfilter.org\/projects\/nftables\/manpage.html\" title=\"in die Manpage\" target=\"_blank\" rel=\"nofollow\">in die Manpage<\/a> helfen. <\/li>\n<li>Wer NAT machen m\u00f6chte, findet <a href=\"https:\/\/bbs.archlinux.org\/viewtopic.php?id=225429\" title=\"hier im Arch Linux Forum\" target=\"_blank\" rel=\"nofollow\">hier im Arch Linux Forum<\/a> ein einfaches Beispiel. Das offizielle Wiki enth\u00e4lt ebenfalls <a href=\"https:\/\/wiki.nftables.org\/wiki-nftables\/index.php\/Performing_Network_Address_Translation_(NAT)\" title=\"einen Artikel zu NAT\" target=\"_blank\" rel=\"nofollow\">einen Artikel zu NAT<\/a>.<\/li>\n<li>Mehr zu den Konsolenbefehlen und iptables hat <a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-nftables\/\" title=\"Linode in einem Artikel erkl\u00e4rt\" target=\"_blank\" rel=\"nofollow\">Linode in einem Artikel erkl\u00e4rt<\/a>. <\/li>\n<li>Sehr umfangreich ist zudem <a href=\"https:\/\/wiki.archlinux.org\/title\/Nftables\" title=\"der Artikel im Arch Linux Wiki\" target=\"_blank\" rel=\"nofollow\">der Artikel im Arch Linux Wiki<\/a>.<\/li>\n<li><a href=\"https:\/\/wiki.nftables.org\/wiki-nftables\/index.php\/Quick_reference-nftables_in_10_minutes\" title=\"Kompakte Zusammenfassung der wichtigsten Infos im Nftables-Wiki\" target=\"_blank\" rel=\"nofollow\">Kompakte Zusammenfassung der wichtigsten Infos im Nftables-Wiki<\/a><\/li>\n<li><a href=\"https:\/\/gist.github.com\/redteamrover\/c4a09052213012f82c449be849b728e3\" title=\"Etwas umfangreicheres Beispiel einer Firewall\" target=\"_blank\" rel=\"nofollow\">Etwas umfangreicheres Beispiel einer Firewall<\/a>.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Sowohl Nftables als auch Iptables erm\u00f6glichen grundlegende Funktionen einer Firewall, darunter etwa Netzwerkpakete anhand bestimmter Regeln zu filtern (erlauben\/blockieren), protokollieren oder umzuleiten. Network Adress Translation (NAT) kann ebenfalls umgesetzt werden. Dieser Beitrag soll Neulingen einen Einstieg in iptables erm\u00f6glichen. Zus\u00e4tzlich werden wir die Unterschiede zu iptables betrachten und die Frage beantworten, wieso es mit iptables &#8230;<\/p>\n","protected":false},"author":5,"featured_media":8993,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[74],"tags":[1048,1046,1049,1047],"class_list":["post-8983","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","tag-firewall","tag-iptables","tag-nft","tag-nftables"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8983","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=8983"}],"version-history":[{"count":13,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8983\/revisions"}],"predecessor-version":[{"id":9742,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8983\/revisions\/9742"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/8993"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=8983"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=8983"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=8983"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}