ufw einrichten unter Linux: Firewall auf dem Server und Grundlagen von nftables
ufw einrichten gelingt in drei Schritten: Standardrichtlinien setzen (sudo ufw default deny incoming und allow outgoing), SSH und die nötigen Ports erlauben (sudo ufw allow 22/tcp, sudo ufw allow 443/tcp) und die Firewall mit sudo ufw enable aktivieren. Die Regeln prüfen Sie mit sudo ufw status numbered; im Hintergrund steuert ufw den Netfilter über iptables oder nftables.
Eine Firewall unter Linux entscheidet, welche Netzwerkpakete den Server erreichen dürfen und welche verworfen werden. Im Kern erledigt das das Subsystem netfilter, gesteuert wird es über Werkzeuge: die Low-Level-Tools iptables und nftables sowie die Aufsatzlösung ufw (Uncomplicated Firewall). Für die meisten Server unter Ubuntu und Debian dauert ein ufw einrichten etwa fünf Minuten: Man sperrt alles Eingehende, öffnet SSH und die Ports der Dienste und aktiviert die Firewall. Im Folgenden finden Sie den Ablauf Schritt für Schritt, typische Fehler und das Nötigste zu nftables, damit Sie verstehen, was im Hintergrund passiert.
Wie eine Firewall unter Linux arbeitet
Die Filterung von Paketen findet im Kernel statt — das ist netfilter. Er stellt Haltepunkte (Hooks) bereit: eingehenden Verkehr zum Host selbst, ausgehenden Verkehr und durchgeleiteten Verkehr (forward). Die Benutzerwerkzeuge schreiben lediglich Regeln für diese Haltepunkte in den Kernel.
| Werkzeug | Ebene | Wann verwenden |
|---|---|---|
ufw | Aufsatz, einfache Syntax | einzelner Server unter Ubuntu/Debian, Standardregeln |
firewalld | Aufsatz mit Zonen | RHEL, Rocky, Fedora |
nftables (nft) | niedrig, modern | komplexe Regeln, NAT, Adressmengen |
iptables | niedrig, veraltend | ältere Systeme und Skripte |
Wichtig: Verwenden Sie nur ein Werkzeug zur Verwaltung. Ändern Sie Regeln gleichzeitig über ufw und von Hand über iptables, überschreiben sie sich gegenseitig, und das Bild wird unvorhersehbar.
Installation und Prüfung von ufw
Unter Ubuntu ist ufw meist bereits installiert, aber deaktiviert. Unter Debian installieren Sie es separat:
$ sudo apt update
$ sudo apt install ufw
$ sudo ufw status
Status: inactive
Der Status inactive bedeutet, dass die ufw-Regeln nicht angewendet werden. Die Firewall sollten Sie noch nicht aktivieren: Erlauben Sie zuerst SSH, sonst sperren Sie sich auf einem entfernten Server selbst aus.
Schritt für Schritt: ufw auf dem Server einrichten
Schritt 1. Standardrichtlinien
Die Standardrichtlinie legt fest, was mit einem Paket geschieht, wenn keine Regel passt. Für einen Server ist ein sicheres Schema: Eingehendes verbieten, Ausgehendes erlauben.
$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'
Antworten auf Ihre eigenen ausgehenden Verbindungen kommen automatisch durch: ufw verfolgt den Zustand der Verbindungen (connection tracking), daher müssen Sie keine Ports für Antworten öffnen.
Schritt 2. SSH erlauben
$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)
OpenSSH ist ein Anwendungsprofil. Lauscht SSH auf einem nicht standardmäßigen Port, erlauben Sie ihn ausdrücklich: sudo ufw allow 2222/tcp. Welcher Port tatsächlich von sshd belegt wird, prüfen Sie mit sudo ss -tlnp | grep sshd.
Schritt 3. Ports der Dienste öffnen
$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp
Geben Sie das Protokoll an: Ohne /tcp öffnet ufw den Port sowohl für TCP als auch für UDP, und eine unnötig offene Tür brauchen Sie nicht.
Schritt 4. Firewall aktivieren
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
ufw startet sofort und wird bei jedem Systemstart aktiviert. Schließen Sie Ihre aktuelle SSH-Sitzung nicht: Öffnen Sie eine zweite und prüfen Sie, ob die Verbindung funktioniert.
Schritt 5. Regeln prüfen
$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (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)
Die Regeln für IPv6 legt ufw selbst an, wenn in /etc/default/ufw der Wert IPV6=yes steht (Standardwert).
Port in ufw öffnen: alle Varianten der Syntax
Der Befehl ufw allow kennt eine kurze und eine vollständige Form. Die kurze Form ist für typische Fälle praktisch, die vollständige, wenn Sie Quelle, Schnittstelle oder Zieladresse angeben müssen.
| Aufgabe | Befehl |
|---|---|
| TCP-Port | sudo ufw allow 443/tcp |
| UDP-Port | sudo ufw allow 51820/udp |
| Portbereich | sudo ufw allow 6000:6007/tcp |
| Nach Dienstname | sudo ufw allow https |
| Von einer IP | sudo ufw allow from 203.0.113.10 |
| Aus einem Subnetz auf einen Port | sudo ufw allow from 10.0.0.0/24 to any port 5432 proto tcp |
| Auf einer Schnittstelle | sudo ufw allow in on eth1 to any port 3306 proto tcp |
| Verbieten | sudo ufw deny 23/tcp |
| Mit Antwort ablehnen | sudo ufw reject 25/tcp |
Der Unterschied zwischen deny und reject: deny verwirft das Paket stillschweigend, der Client wartet bis zum Timeout; reject sendet eine Antwort, dass der Port geschlossen ist. Für das Internet wählt man meist deny, für interne Netze ist reject bequemer, weil Clients den Fehler sofort sehen.
Datenbank nur von einem Server erreichbar machen
Eine typische Aufgabe: PostgreSQL oder MySQL dürfen nicht aus dem Internet sichtbar sein, doch die Anwendung auf einem Nachbarserver muss sich verbinden können.
$ sudo ufw allow from 10.0.0.5 to any port 5432 proto tcp
Rule added
Port 5432 bleibt für alle anderen geschlossen dank der Richtlinie deny incoming. Zusätzlich sollten Sie die Datenbank so konfigurieren, dass sie nur auf der internen Adresse lauscht — Firewall und Dienstkonfiguration ergänzen sich.
Anwendungsprofile
Pakete können ihre Portangaben in /etc/ufw/applications.d/ ablegen. Liste und Inhalt der Profile:
$ sudo ufw app list
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
$ sudo ufw app info "Nginx Full"
Profile: Nginx Full
Title: Web Server (Nginx, HTTP + HTTPS)
Description: Small, but very powerful and efficient web server
Ports:
80,443/tcp
Ein Profil erlauben Sie mit sudo ufw allow "Nginx Full". Namen mit Leerzeichen setzen Sie in Anführungszeichen. Ein eigenes Profil beschreiben Sie im INI-Format im selben Verzeichnis und übernehmen es mit sudo ufw app update name.
Regel in ufw löschen
Am zuverlässigsten geht es über die Nummer:
$ sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] OpenSSH ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
[ 4] OpenSSH (v6) ALLOW IN Anywhere (v6)
[ 5] 80/tcp (v6) ALLOW IN Anywhere (v6)
[ 6] 443/tcp (v6) ALLOW IN Anywhere (v6)
$ sudo ufw delete 2
Deleting:
allow 80/tcp
Proceed with operation (y|n)? y
Rule deleted
Nach dem Löschen rücken die Nummern nach, deshalb führen Sie vor dem nächsten Löschen erneut status numbered aus. Der zweite Weg ist, die Regel mit dem Wort delete zu wiederholen: sudo ufw delete allow 80/tcp; das entfernt die IPv4- und die IPv6-Variante zugleich.
Reihenfolge der Regeln und Einfügen am Anfang
ufw prüft die Regeln von oben nach unten, und es gilt die erste passende. Deshalb muss ein Verbot für eine bestimmte Adresse über der allgemeinen Erlaubnis stehen:
$ sudo ufw insert 1 deny from 198.51.100.23
Rule inserted
Fügen Sie ein deny mit dem normalen Befehl hinzu, landet es am Ende der Liste nach allow 443/tcp und greift für diesen Port nicht.
Schutz von SSH vor Brute-Force: ufw limit
Die Regel limit erlaubt die Verbindung, sperrt aber eine Adresse, die innerhalb von 30 Sekunden 6 oder mehr Verbindungen geöffnet hat:
$ sudo ufw limit OpenSSH
Rule updated
Das ist ein einfacher Schutz gegen massenhaftes Raten von Passwörtern. Für einen ernsthaften Schutz richten Sie zusätzlich die Anmeldung nur per Schlüssel ein und setzen bei Bedarf fail2ban ein — es kann Adressen über ufw sperren.
Logs von ufw
Die Protokollierung schalten Sie mit sudo ufw logging on ein; die Stufen sind low, medium, high, full. Die Einträge landen in /var/log/ufw.log (über rsyslog) und im Kernel-Journal:
$ sudo journalctl -k | grep 'UFW BLOCK' | tail -2
Oct 14 10:12:03 web kernel: [UFW BLOCK] IN=eth0 OUT= SRC=45.155.205.1 DST=192.0.2.10 PROTO=TCP SPT=51544 DPT=3389
Oct 14 10:12:09 web kernel: [UFW BLOCK] IN=eth0 OUT= SRC=89.248.165.7 DST=192.0.2.10 PROTO=TCP SPT=40312 DPT=23
Die Felder SRC und DPT zeigen, wer und an welchen Port geklopft hat. Antwortet ein Dienst nicht, und das Log enthält UFW BLOCK mit seinem Port, fehlt die passende Regel.
ufw und Docker: warum Ports trotz Regeln offen sind
Das ist die bekannteste Falle. Beim Veröffentlichen eines Ports (-p 8080:80) legt Docker selbst NAT-Regeln und die Kette DOCKER an. Der Verkehr zum Container läuft über forward und umgeht die eingehenden Regeln von ufw. Im Ergebnis zeigt ufw status den Port 8080 nicht an, er ist aber von außen erreichbar.
Lösungsmöglichkeiten:
- Ports nur auf localhost veröffentlichen:
-p 127.0.0.1:8080:80und nach außen über einen Reverse-Proxy (nginx) gehen. - Eigene Regeln in die Kette
DOCKER-USEReintragen — Docker überschreibt sie nicht. - Die Ports interner Hilfscontainer gar nicht veröffentlichen, sondern über ein Docker-Netzwerk verbinden.
Zurücksetzen und Deaktivieren
$ sudo ufw disable # ausschalten, Regeln bleiben erhalten
$ sudo ufw reset # alle Regeln löschen und ausschalten
$ sudo ufw reload # Konfiguration neu einlesen
Vor reset sichert ufw die Regeldateien in /etc/ufw/ mit einem Datumssuffix. Die Regeln selbst stehen in /etc/ufw/user.rules und user6.rules — diese Dateien bearbeitet man nicht von Hand, sondern nur mit den Befehlen.
Grundlagen von nftables
nftables ist der moderne Nachfolger von iptables im Linux-Kernel. Unter Debian 10+ und Ubuntu 20.10+ arbeitet der Befehl iptables standardmäßig über die Kompatibilitätsschicht iptables-nft, daher landen die Regeln von ufw ebenfalls in nftables. Alles, was im Kernel geladen ist, zeigen Sie so:
$ sudo nft list ruleset
Aufbau von nftables: Eine Tabelle (Familie ip, ip6 oder inet für beide) enthält Ketten, die an die Haltepunkte von netfilter gebunden sind, und Ketten enthalten Regeln. Eine minimale Firewall für einen Server in der Datei /etc/nftables.conf:
#!/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
ip protocol icmp accept
meta l4proto 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;
}
}
Anwenden und beim Start aktivieren:
$ sudo nft -c -f /etc/nftables.conf # nur die Syntax prüfen
$ sudo systemctl enable --now nftables
Regeln lassen sich auch im laufenden Betrieb hinzufügen, sie gehen aber nach einem Neustart verloren, wenn Sie sie nicht in eine Datei schreiben:
$ sudo nft add rule inet filter input tcp dport 5432 ip saddr 10.0.0.5 accept
$ sudo nft -a list chain inet filter input # -a zeigt die Handles der Regeln
$ sudo nft delete rule inet filter input handle 9
Der große Vorteil von nftables sind Mengen ({ 22, 80, 443 }) und eine gemeinsame Tabelle inet für IPv4 und IPv6. Starten Sie nicht gleichzeitig einen eigenen Dienst nftables.service und ufw: flush ruleset löscht die Regeln von ufw.
Typische Fehler
- ufw eingeschaltet, ohne Regel für SSH — der Zugang ist verloren. Rettung bietet die Konsole des Anbieters (VNC/seriell):
sudo ufw allow OpenSSHodersudo ufw disable. - Port geöffnet, Dienst aber nicht erreichbar — der Dienst lauscht auf
127.0.0.1statt auf der externen Adresse. Prüfen Sie es mitss -tlnp. - Zusätzliche Cloud-Firewall — viele Anbieter haben Sicherheitsgruppen; den Port müssen Sie dort ebenfalls öffnen.
- deny wirkt nicht — die Regel steht unterhalb einer erlaubenden Regel; verwenden Sie
insert 1.
Fazit
Ein Grundsetup mit ufw besteht aus default deny incoming, der Erlaubnis für SSH und die Ports der Dienste, ufw enable und der Kontrolle mit status numbered. Für gezielten Zugriff verwenden Sie Regeln mit from und port, für SSH limit, und beim Einsatz von Docker denken Sie daran, dass Docker ufw umgeht. Wenn Sie NAT oder komplexe Regelmengen brauchen, wechseln Sie zu nftables. Der Schutz eines Servers durch eine Firewall wird im Kurs zu Linux praxisnah behandelt.
Häufige Fragen
Worin unterscheidet sich ufw von iptables?
ufw ist ein Aufsatz mit einfacher Syntax, der selbst Regeln für iptables oder nftables erzeugt. iptables und nftables sind Low-Level-Werkzeuge mit voller Kontrolle, verlangen aber mehr Kenntnisse.
Bleiben die ufw-Regeln nach einem Neustart erhalten?
Ja. Nach sudo ufw enable startet die Firewall beim Booten, und die Regeln stehen in /etc/ufw/user.rules und user6.rules.
Muss ich Ports für ausgehende Verbindungen öffnen?
Bei der Richtlinie allow outgoing nicht. Antworten auf ausgehende Verbindungen lässt ufw dank der Zustandsverfolgung automatisch durch.
Wie erlaube ich ping, wenn ufw aktiv ist?
Eingehende ICMP-Echo-Anfragen lässt ufw standardmäßig bereits durch: Die Regel steht in /etc/ufw/before.rules. Um ping zu verbieten, ändern Sie dort ACCEPT in DROP und führen sudo ufw reload aus.
Gibt es ufw auf CentOS und Rocky Linux?
Dort ist firewalld mit dem Befehl firewall-cmd das Standardwerkzeug. ufw lässt sich aus EPEL nachinstallieren, aber mit firewalld sollte man es nicht kombinieren.
Dieses Thema wird im Kurs „Linux: с нуля до уверенного администрирования“ ausführlich mit Praxis behandelt.
Zum Kurs