Modul 5 · 5.2
Deutsch
Eine Firewall mit ufw und nftables
Modul 5: Das Netzwerk abschirmen · Lesezeit: 12 Minuten
Lernziel: Nach dieser Lektion können Sie eine Firewall einrichten, die nur das Nötige zulässt, für IPv4 und IPv6, ohne sich selbst auszusperren. Außerdem wissen Sie, wovor eine Firewall auf Ihrem Server nicht schützt.
Kernbegriffe: Paketfilter, netfilter, nftables, iptables-nft, ufw, Standardrichtlinie, allow, deny, reject, limit, IPv6 in ufw, Firewall des Anbieters, firewalld, Docker und die Firewall
Was eine Firewall macht
Eine Firewall auf Ihrem Server ist ein Paketfilter: Für jedes eingehende Netzwerkpaket prüft sie eine Liste von Regeln und entscheidet, ob es passieren darf. Unter Linux sitzt dieser Filter im Kernel und heißt netfilter. Sie konfigurieren ihn mit einem Programm:
- nftables (Befehl
nft) ist das aktuelle Werkzeug. Debian verwendet es seit Debian 10 standardmäßig. - iptables ist das alte Werkzeug. Auf modernen Systemen ist
iptablesmeist eine Übersetzung nach nftables (iptables-nft), damit alte Anleitungen weiterhin funktionieren. - ufw (Uncomplicated Firewall) ist eine einfache Schicht darüber, unter Ubuntu standardmäßig vorhanden und unter Debian mit einem Befehl installierbar. Für einen einzelnen Server ist ufw die einfachste Wahl. Diese Lektion verwendet ufw und zeigt anschließend, wie dieselben Regeln in nftables aussehen.
Eine Firewall ist Ihre zweite Verteidigungslinie. Die erste besteht darin, dass Dienste nur auf der richtigen Adresse lauschen (Lektion 5.1). Zusammen sorgen sie dafür, dass ein Fehler in einer Schicht nicht sofort eine offene Tür ist.
Zuerst: Wie kommen Sie zurück, wenn etwas schiefgeht?
Der klassische Fehler: Sie schalten die Firewall ein, vergessen, SSH zuzulassen, und Ihre Verbindung bricht ab. Per SSH kommen Sie dann nicht mehr auf den Server. Bevor Sie beginnen:
- Wissen Sie, wie Sie die Konsole Ihres Anbieters öffnen (Lektion 1.2). Sie funktioniert am Netzwerk vorbei, also auch dann, wenn die Firewall alles sperrt. Dort melden Sie sich an und geben
ufw disableein. - Erstellen Sie im Zweifel einen Snapshot.
- Lassen Sie Ihre aktuelle SSH-Sitzung offen und testen Sie mit einer zweiten Sitzung.
ufw in fünf Schritten
Schritt 1: installieren und den Standard wählen.
anna@web1:~$ sudo apt install ufw
anna@web1:~$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
anna@web1:~$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'Die Standardrichtlinie gilt für alles, wofür es keine Regel gibt. "Deny incoming" bedeutet: Alles, was hereinkommt, ist verboten, außer dem, was Sie anschließend erlauben. Das ist die einzige sichere Grundlage. Ausgehenden Datenverkehr (Ihr Server, der Updates abruft) lassen Sie zu.
Schritt 2: SSH zulassen, bevor Sie die Firewall einschalten.
anna@web1:~$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)OpenSSH ist ein Anwendungsprofil, das ufw kennt (es steht für Port 22/tcp). Läuft SSH auf einem anderen Port, verwenden Sie die Nummer: sudo ufw allow 2222/tcp. Achten Sie auf "Rules updated (v6)": ufw legt die Regel auch für IPv6 an. Das geschieht, weil in /etc/default/ufw die Zeile IPV6=yes steht, was der Standard ist. Prüfen Sie das kurz; steht dort no, gilt Ihre Firewall nur für IPv4.
Schritt 3: was Sie sonst noch brauchen.
anna@web1:~$ sudo ufw allow 80/tcp
anna@web1:~$ sudo ufw allow 443/tcp
anna@web1:~$ sudo ufw allow 443/udp # nur wenn Sie HTTP/3 verwendenSie können eine Regel auf eine einzelne Quelladresse beschränken, zum Beispiel einen Verwaltungsport, der nur von Ihrem Büro aus erreichbar sein soll:
anna@web1:~$ sudo ufw allow from 198.51.100.20 to any port 9090 proto tcpSchritt 4: einschalten.
anna@web1:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startupSchritt 5: prüfen. Öffnen Sie ein zweites Fenster und melden Sie sich erneut an. Klappt das, ist SSH richtig eingerichtet. Sehen Sie sich danach die Regeln an:
anna@web1:~$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6)Eine Regel entfernen Sie über ihre Nummer: sudo ufw status numbered und dann sudo ufw delete 3.
deny, reject und limit
- deny verwirft das Paket stillschweigend: Von außen sehen Sie "gefiltert" (Lektion 5.1).
- reject schickt eine Ablehnung zurück: Von außen sehen Sie "geschlossen". Das ist sauberer für Ihre eigenen Dienste, verrät aber, dass dort ein Server ist.
- limit lässt eine Verbindung zu, blockiert aber eine Adresse, die innerhalb von 30 Sekunden sechsmal oder öfter eine Verbindung aufzubauen versucht. Praktisch für SSH:
sudo ufw limit OpenSSHstattallow. Das ist grob (es zählt Verbindungen, nicht fehlgeschlagene Anmeldungen); fail2ban (Lektion 5.3) ist genauer.
Dieselben Regeln in nftables
ufw schreibt unter der Haube netfilter-Regeln. Wenn Sie ohne ufw arbeiten möchten, schreiben Sie selbst eine nftables-Datei. Unter Debian liegt sie in /etc/nftables.conf und wird über den Dienst nftables geladen:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
ct state invalid drop
iif "lo" accept
meta l4proto { icmp, ipv6-icmp } accept
tcp dport { 22, 80, 443 } accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}So lesen Sie das. Die Tabelle heißt filter und gehört zur Familie inet: eine Tabelle für IPv4 und IPv6 zugleich, sodass Sie IPv6 nicht vergessen können. In der Kette input ist die Richtlinie drop. Danach gilt: Antworten auf bereits bestehende Verbindungen dürfen zurück (established,related), alles auf Loopback ist erlaubt, ICMP ist erlaubt (unter anderem nötig für IPv6 und für Fehlermeldungen zur Paketgröße), und die Ports 22, 80 und 443 sind erlaubt.
anna@web1:~$ sudo nft -c -f /etc/nftables.conf # prüfen, ohne zu laden
anna@web1:~$ sudo systemctl enable --now nftables
anna@web1:~$ sudo nft list rulesetVerwenden Sie entweder ufw oder eine eigene nftables-Datei, nicht beides: Beide schreiben in dasselbe netfilter und können sich gegenseitig in die Quere kommen.
Wovor Ihre Firewall nicht schützt
- Dienste, die Sie selbst zulassen. Port 443 ist für Ihre Website offen; eine Sicherheitslücke in Ihrer Website ist also ganz normal erreichbar. Die Firewall schützt nur die Ports, die geschlossen sind.
- Docker. Wenn Sie mit Docker einen Port veröffentlichen (
-p 5432:5432), setzt Docker eigene netfilter-Regeln, die den Datenverkehr umleiten, bevor die Regeln von ufw greifen. Die Docker-Dokumentation sagt wörtlich, dass Docker und ufw nicht gut zusammenpassen. Ein Container-Port kann also von außen offen sein, obwohlufw statusihn nicht anzeigt. Die Lösung (Veröffentlichen auf127.0.0.1) lernen Sie in Lektion 9.3. - Ausgehender Datenverkehr. Mit "allow outgoing" kann ein gehacktes Programm überallhin. Für die meisten kleinen Server ist das eine vertretbare Entscheidung; strenge Umgebungen beschränken auch den ausgehenden Datenverkehr.
Die Firewall Ihres Anbieters
Viele Anbieter haben zusätzlich eine Firewall im Netzwerk, vor Ihrem Server, die Sie im Kundenbereich konfigurieren (manchmal "Cloud Firewall" oder "Security Group" genannt). Sie ist eine gute zusätzliche Schicht und wirkt auch dann, wenn Sie auf dem Server selbst etwas falsch einstellen. Sie ersetzt die Firewall auf dem Server aber nicht: Wenn Sie den Server umziehen oder den Anbieter wechseln, kommt sie nicht mit, und nicht jeder Anbieter bietet sie an. Betreiben Sie deshalb immer auch eine Firewall auf dem Server selbst.
Unter AlmaLinux und Rocky Linux
Dort ist firewalld standardmäßig aktiv, mit Zonen. Die wichtigsten Befehle:
[root@web1 ~]# firewall-cmd --list-all
[root@web1 ~]# firewall-cmd --permanent --add-service=http --add-service=https
[root@web1 ~]# firewall-cmd --reloadOhne --permanent gilt eine Änderung nur bis zum nächsten Neustart; mit --permanent erst nach --reload. SSH ist in der Standardzone bereits offen.
In der Praxis
Sperren Sie sich bei einem VPS von WebOké trotzdem aus, öffnen Sie im VPS-Bereich die Konsole, melden sich an und schalten die Firewall aus (ufw disable) oder nehmen die letzte Regel zurück. Bei anderen Anbietern heißt dieser Notzugang ebenfalls Konsole, VNC oder Rescue. Wissen Sie, wo sich diese Schaltfläche befindet, bevor Sie sie brauchen.
Zusammenfassung
- Eine Firewall ist Ihre zweite Schicht nach "nur dort lauschen, wo es nötig ist"; nftables ist das Werkzeug im Kernel, ufw eine einfache Schicht darüber.
- Beginnen Sie mit
default deny incoming, erlauben Sie SSH vorufw enable, testen Sie mit einer zweiten Sitzung und kennen Sie die Konsole Ihres Anbieters. - Prüfen Sie, dass ufw auch IPv6 abdeckt (
IPV6=yes); in nftables erledigt das die Familieinetin einem Schritt. denyergibt von außen "gefiltert",rejectergibt "geschlossen";limitbremst wiederholte Verbindungen.- Docker-Ports gehen an ufw vorbei (Lektion 9.3); die Firewall Ihres Anbieters ist eine zusätzliche Schicht, kein Ersatz.
Quiz
Aufgabe
Aufgabe O5.2: Ihre Firewall einrichten. Schalten Sie auf Ihrem Server eine Firewall mit ufw ein (oder nftables, oder firewalld unter AlmaLinux/Rocky): standardmäßig alles Eingehende gesperrt, SSH erlaubt und dazu nur, was Sie wirklich brauchen. Testen Sie mit einer zweiten Sitzung, prüfen Sie, ob IPv6 abgedeckt ist, und kontrollieren Sie von außen mit nc, ob ein nicht erlaubter Port geschlossen oder gefiltert ist. Füllen Sie die Checkliste aus und fügen Sie Ihr ufw status verbose (oder nft list ruleset) ein; geben Sie bei jedem offenen Port an, wofür er gedacht ist.
Aufgabe O5.2: Ihre Firewall einrichten
Diese Aufgabe machen Sie selbst; niemand prüft sie nach. Haken Sie ab, was Sie erledigt haben, und markieren Sie die Aufgabe als erledigt.
Für einen Webserver nur 22 (oder Ihr SSH-Port), 80 und 443, für IPv4 und IPv6. Verwaltungsports nur von einer festen Adresse aus oder über einen SSH-Tunnel. Über die Konsole: ufw disable (oder die nftables-Regeln leeren).
Ihre Haken und Notizen bleiben nur in diesem Browser; wir senden sie nirgendwohin. Sind Sie angemeldet, speichern wir in Meine Kurse nur, dass Sie die Aufgabe erledigt haben.
Weiterführende Informationen
- Ihren VPS absichern: die ersten fünf Minuten
- Kein Zugriff mehr auf Ihren VPS: Was nun?
- Debian Wiki, nftables: https://wiki.debian.org/nftables
- Ubuntu-Server-Dokumentation, Firewall (ufw): https://ubuntu.com/server/docs/how-to/security/firewalls/
- Docker-Dokumentation, Packet filtering and firewalls: https://docs.docker.com/engine/network/packet-filtering-firewalls/
