UFW (Uncomplicated Firewall) ist eine Firewall direkt im VPS, die Sie mit gut lesbaren Befehlen steuern. Sie richten sie so ein, dass nur das von außen erreichbar ist, was Sie möchten, ohne sich von SSH auszusperren. Am Ende erfahren Sie, warum Docker UFW umgeht, und finden eine Beispielkonfiguration für nftables für Fortgeschrittene.
Was Sie brauchen
- Ein StormHost-VPS mit Ubuntu 24.04 oder Debian 13
- Eine SSH-Verbindung als root (Anleitung)
- Die geöffnete Browser-Konsole, für alle Fälle
- Eine Liste der Ports, die Ihre Dienste verwenden
- Etwa 20 Minuten
UFW in Kürze#
Linux filtert Pakete im Kernel (das Subsystem netfilter, gesteuert über nftables oder iptables). Regeln direkt zu schreiben ist kompliziert; UFW erledigt das für Sie: Es macht aus dem Befehl ufw allow 22/tcp die richtigen Regeln für IPv4 und IPv6.
UFW ist eine von zwei Möglichkeiten. Die andere ist die Firewall im Kundenbereich, die den Verkehr filtert, bevor er den VPS überhaupt erreicht. Wenn Sie beide nutzen, muss ein Port in beiden offen sein.
Installation und Standardrichtlinie#
Ubuntu 24.04
UFW ist installiert, aber ausgeschaltet. Prüfen Sie es:
ufw statusDie Ausgabe Status: inactive bedeutet, dass die Firewall noch nichts blockiert.
Debian 13
Installieren Sie UFW:
apt install ufwNach der Installation ist es ausgeschaltet (ufw status gibt Status: inactive aus).
Legen Sie die Standardrichtlinie fest, also was mit Verkehr passiert, den keine Regel erwähnt:
ufw default deny incoming
ufw default allow outgoingufw default deny incoming– neue eingehende Verbindungen blockieren, sofern keine Regel sie erlaubt.ufw default allow outgoing– ausgehende Verbindungen vom VPS erlauben (Updates, DNS, Downloads).
UFW ist zustandsbehaftet (stateful): Antworten auf Verbindungen, die der VPS selbst geöffnet hat, kommen auch bei deny incoming durch.
SSH erlauben, bevor Sie die Firewall einschalten#
Ohne SSH-Regel sperren Sie sich beim Einschalten aus
ufw enable mit der Richtlinie deny incoming blockiert sofort alles, was nicht erlaubt ist. Haben Sie in diesem Moment keine Regel für SSH, bricht die Verbindung ab. In den VPS kommen Sie dann nur noch über die Browser-Konsole. Läuft Ihr SSH auf einem anderen Port als 22, erlauben Sie diesen.
ufw allow 22/tcp comment 'SSH'ufw allow– fügt eine Erlaubnisregel für eingehenden Verkehr hinzu.22/tcp– Port 22, Protokoll TCP.comment 'SSH'– eine Notiz, die in der Regelliste erscheint.
Alternativ können Sie ein Anwendungsprofil verwenden. ufw app list listet die Profile auf (zum Beispiel OpenSSH, nach der Installation von Nginx auch Nginx Full). Die Regel fügen Sie dann mit ufw allow OpenSSH hinzu.
Einschalten und prüfen#
Schalten Sie die Firewall ein:
bash ufw enableUFW fragt
Command may disrupt existing ssh connections. Proceed with operation (y|n)?. Wenn Sie die SSH-Regel haben, tippen Sieyund drücken Sie Eingabe.Sie sehen
Firewall is active and enabled on system startup. Die Firewall läuft jetzt und startet auch nach einem Neustart.Prüfen Sie in einem neuen Fenster, dass Sie sich per SSH verbinden können.
Zeigen Sie den ausführlichen Status an:
bash ufw status verboseAusgabetext Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22/tcp ALLOW IN Anywhere # SSH 22/tcp (v6) ALLOW IN Anywhere (v6) # SSH
| Zeile | Bedeutung |
|---|---|
Status: active | Die Firewall läuft. |
Logging: on (low) | Schreibt blockierte Pakete ins Log, mit einer Begrenzung der Einträge. |
Default: deny (incoming) | Eingehender Verkehr ohne Regel wird verworfen. |
allow (outgoing) | Ausgehender Verkehr ist erlaubt. |
disabled (routed) | UFW behandelt keinen weitergeleiteten Verkehr (der VPS als Router). |
New profiles: skip | Neue Anwendungsprofile werden nicht automatisch erlaubt. |
22/tcp ALLOW IN Anywhere | Port 22/TCP ist über IPv4 von überall erlaubt. |
(v6) | Dieselbe Regel für IPv6. UFW erstellt sie automatisch. |
Regeln für Dienste#
| Was Sie möchten | Befehl |
|---|---|
| Web (HTTP und HTTPS) | ufw allow proto tcp from any to any port 80,443 comment 'Web' |
| Minecraft Java | ufw allow 25565/tcp comment 'Minecraft' |
| Bedrock (Geyser) | ufw allow 19132/udp comment 'Geyser' |
| FiveM (TCP und UDP) | ufw allow 30120 comment 'FiveM' |
| Rust (Spiel und Query) | ufw allow proto udp from any to any port 28015,28017 comment 'Rust' |
| Portbereich | ufw allow proto tcp from any to any port 25565:25600 comment 'Game servers' |
| Port nur von einer IP-Adresse | ufw allow proto tcp from 198.51.100.25 to any port 3306 comment 'DB from office' |
| Eine IP-Adresse blockieren | ufw insert 1 deny from 198.51.100.25 comment 'Attacker' |
So lesen Sie die Teile der Befehle:
25565/tcp– Port und Protokoll. Ohne Protokoll (ufw allow 30120) gilt die Regel für TCP und UDP.proto tcp– das Protokoll in der erweiterten Syntax. Ein Bereich oder eine Liste von Ports (80,443,25565:25600) erfordert ein Protokoll.from any/from 198.51.100.25– woher die Verbindung kommt: von überall oder von einer Adresse (auch ein Bereich198.51.100.0/24ist möglich).to any port 3306– welche VPS-Adresse und welcher Port.any= alle Adressen des VPS.insert 1– fügt die Regel an erster Stelle ein. UFW wertet Regeln von oben aus, und der erste Treffer gewinnt, deshalb muss das Blockieren einer Adresse über den Erlaubnisregeln stehen. Eine IPv6-Adresse blockieren Sie mitufw prepend deny from 2001:db8::/64, was die Regel an den Anfang der IPv6-Regeln setzt.deny– stillschweigend verwerfen. Die Varianterejectteilt dem Absender mit, dass die Verbindung abgelehnt wurde.
Verwenden Sie in Kommentaren (comment) nur einfache Buchstaben ohne Umlaute, Ziffern und Leerzeichen.
Anzahl der Verbindungen begrenzen (limit)#
ufw limit 22/tcp comment 'SSH'ufw limit– erlaubt den Port, blockiert aber eine IP-Adresse, die 6 oder mehr Verbindungen innerhalb von 30 Sekunden öffnen will. Das bremst das Erraten von Passwörtern.
Wenn Sie bereits eine allow-Regel für Port 22 haben, löschen Sie sie zuerst (siehe nächster Abschnitt), sonst würde die ältere Regel gewinnen. Limit eignet sich nicht für Dienste mit vielen legitimen Verbindungen (Web, Spiele). Für SSH ist fail2ban besser, weil es auf tatsächlich fehlgeschlagene Anmeldungen reagiert.
Nummerierte Regeln und Löschen#
ufw status numbered To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere # SSH
[ 2] 25565/tcp ALLOW IN Anywhere # Minecraft
[ 3] 22/tcp (v6) ALLOW IN Anywhere (v6) # SSH
[ 4] 25565/tcp (v6) ALLOW IN Anywhere (v6) # MinecraftEine Regel nach Nummer löschen:
ufw delete 2ufw delete 2– löscht Regel Nummer 2. UFW fragt nach Bestätigung (y).
Nach jedem Löschen verschieben sich die Nummern, führen Sie also vor dem nächsten Löschen erneut ufw status numbered aus. Die IPv4- und IPv6-Varianten sind zwei Regeln. Beide auf einmal löschen Sie, indem Sie die Regel ausschreiben: ufw delete allow 25565/tcp.
Weitere nützliche Befehle:
| Befehl | Was er tut |
|---|---|
ufw reload | Lädt die Regeln neu (nach manueller Bearbeitung der Dateien in /etc/ufw/). |
ufw disable | Schaltet die Firewall aus; die Regeln bleiben gespeichert. |
ufw --dry-run allow 80/tcp | Zeigt, was der Befehl tun würde, ändert aber nichts. |
ufw reset | Schaltet die Firewall aus und löscht alle Regeln. Nur verwenden, wenn Sie von vorn beginnen. |
IPv6#
Bei UFW ist IPv6 standardmäßig eingeschaltet: Die Datei /etc/default/ufw enthält die Zeile IPV6=yes. Jede Regel ohne konkrete IPv4-Adresse wird dann auch für IPv6 erstellt (die Zeilen (v6)). Setzen Sie nicht IPV6=no. Der VPS hat eine öffentliche IPv6-Adresse, und ohne IPv6-Regeln würde IPv6-Verkehr nicht von Ihren Regeln gefiltert.
Docker umgeht UFW#
Wenn Sie in Docker einen Port veröffentlichen (-p 8080:80 oder ports: in compose.yaml), ist er aus dem Internet erreichbar, auch wenn UFW ihn blockiert. Docker leitet den Verkehr zum Container um, bevor die Regeln von UFW an die Reihe kommen. Die Docker-Dokumentation beschreibt das als Inkompatibilität zwischen Docker und UFW.
So vermeiden Sie es:
Veröffentlichen Sie Ports nur auf
127.0.0.1. Dann sind sie nur innerhalb des VPS erreichbar, und Sie stellen sie über Nginx bereit (siehe Nginx und HTTPS):compose.yamlYAML services: app: ports: - "127.0.0.1:8080:80"127.0.0.1:8080:80– Port 8080 auf dem VPS, aber nur auf der lokalen Adresse, weitergeleitet an Port 80 im Container.
Veröffentlichen Sie Datenbanken und interne Dienste gar nicht. Container sprechen über das Docker-Netzwerk miteinander; sie brauchen keinen Port nach außen.
Nutzen Sie die Firewall im Kundenbereich. Sie filtert den Verkehr, bevor er den VPS erreicht, und erfasst daher auch von Docker veröffentlichte Ports.
Verwenden Sie nicht die Docker-Einstellung "iptables": false; sie beschädigt das Container-Netzwerk. Erweitertes Filtern des Verkehrs zu Containern (die Chain DOCKER-USER) beschreibt die Docker-Dokumentation (öffnet sich in einem neuen Fenster). Mehr zu Docker in der Anleitung Docker und Docker Compose.
Protokollierung#
ufw logging lowlow– protokolliert blockierte Pakete, mit einer Begrenzung der Einträge. Höhere Stufen (medium,high,full) protokollieren mehr, und das Log wächst schnell.ufw logging offschaltet die Protokollierung aus.
Wo Sie die Einträge finden:
Ubuntu 24.04
tail -f /var/log/ufw.logtail -f– gibt neue Zeilen der Datei fortlaufend aus. Beenden mit Strg+C.
Debian 13
journalctl -k -f --grep "UFW"journalctl -k– Kernel-Meldungen (Debian hat standardmäßig keine separate Datei/var/log/ufw.log).-f– neue Einträge fortlaufend ausgeben.--grep "UFW"– nur Zeilen von UFW.
Beispieleintrag: [UFW BLOCK] IN=eth0 … SRC=198.51.100.25 DST=203.0.113.10 … PROTO=TCP SPT=51234 DPT=23. SRC ist die Adresse des Absenders, DST Ihr VPS, PROTO das Protokoll und DPT der Port, zu dem er sich verbinden wollte.
Für Fortgeschrittene: nftables#
nftables ist das moderne Werkzeug für Firewall-Regeln im Kernel. Unter Debian ist es das Standard-Framework, und UFW selbst nutzt es unter der Haube (über die Schicht iptables-nft). Regeln direkt in nftables zu schreiben ist nützlich, wenn Sie mehr brauchen, als UFW kann.
UFW und eigenes nftables nicht mischen
Verwenden Sie entweder UFW oder Ihre eigene /etc/nftables.conf. Schalten Sie UFW aus (ufw disable), bevor Sie auf nftables wechseln. Die Konfiguration unten beginnt mit dem Befehl flush ruleset, der alle Regeln im Kernel löscht, einschließlich der Regeln von Docker und fail2ban. Starten Sie deshalb nach jedem Neustart des Dienstes nftables auch Docker und fail2ban neu. Mit Docker auf demselben VPS bleiben Sie besser bei UFW oder der Firewall im Kundenbereich.
Eine Beispieldatei für einen Server mit SSH und einer Website:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
ct state invalid drop
iif "lo" accept
meta l4proto { icmp, ipv6-icmp } accept
tcp dport 22 accept
tcp dport { 80, 443 } accept
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
}
}| Zeile | Was sie tut |
|---|---|
flush ruleset | Löscht alle vorhandenen Regeln, damit die Datei immer aus einem sauberen Zustand lädt. |
table inet filter | Die Tabelle filter für die Familie inet, also IPv4 und IPv6 zugleich. |
type filter hook input … policy drop | Die Chain für eingehenden Verkehr. Alles, was keine Regel erlaubt, wird verworfen. |
ct state established,related accept | Lässt Antworten auf bereits aufgebaute Verbindungen durch. Ohne sie würde nichts funktionieren, was der VPS selbst öffnet. |
ct state invalid drop | Verwirft beschädigte oder unsinnige Pakete. |
iif "lo" accept | Erlaubt Verkehr innerhalb des VPS (das Loopback, 127.0.0.1). Ohne sie funktionieren lokale Datenbanken und Dienste nicht mehr. |
meta l4proto { icmp, ipv6-icmp } accept | Erlaubt ICMP: Ping und die Meldungen, die das Netzwerk zum ordentlichen Funktionieren braucht. Ohne ICMPv6 funktioniert IPv6 nicht (Neighbor Discovery). |
tcp dport 22 accept | SSH. Wenn Sie einen anderen Port verwenden, ändern Sie ihn. |
tcp dport { 80, 443 } accept | Web. Eine Menge von Ports in geschweiften Klammern. Für UDP verwenden Sie udp dport. |
chain forward … policy drop | Der VPS leitet keinen Verkehr weiter (er ist kein Router). |
chain output … policy accept | Ausgehender Verkehr ohne Einschränkung. |
Bereitstellung (gilt für Debian 13 und Ubuntu 24.04):
Installieren Sie das Werkzeug:
apt install nftables.Schalten Sie UFW aus, falls es läuft:
ufw disable.Speichern Sie die Konfiguration in
/etc/nftables.conf(nano /etc/nftables.conf).Prüfen Sie sie, ohne sie anzuwenden:
bash nft -c -f /etc/nftables.conf-c– nur prüfen; nichts ändert sich. Ist alles in Ordnung, gibt es nichts aus.-f– die Regeln aus einer Datei laden.
Aktivieren Sie den Dienst, der die Regeln sofort und nach jedem Booten lädt:
bash systemctl enable --now nftablesenable– die Regeln beim Booten des VPS laden (der Dienst ist standardmäßig aus).--now– und sie sofort laden.
Prüfen Sie SSH in einem neuen Fenster.
nft list rulesetgibt die aktuellen Regeln aus.
Überprüfung#
ufw status verbosezeigtStatus: activeund Regeln für alle Ihre Dienste.- Sie können sich von Ihrem Computer per SSH verbinden, und die Dienste funktionieren.
- Ein nicht erlaubter Port antwortet von außen nicht (Test von Ihrem Computer: unter Windows
Test-NetConnection <VPS_IP_ADRESSE> -Port 3306, unter macOS und Linuxnc -vz -w 5 <VPS_IP_ADRESSE> 3306; ein geschlossener Port endet mit einem Timeout).
Wenn Sie sich aussperren#
- Öffnen Sie die Browser-Konsole und melden Sie sich als root an.
- Erlauben Sie SSH:
ufw allow 22/tcp, oder schalten Sie die Firewall vorübergehend aus:ufw disable. - Bei nftables:
systemctl stop nftablesund dannnft flush ruleset(löscht alle Regeln; Verkehr wird erlaubt). - Korrigieren Sie die Regeln und schalten Sie die Firewall wieder ein.
Fehlerbehebung#
ERROR: Must specify 'tcp' or 'udp' with multiple ports#
Ein Bereich oder eine Liste von Ports erfordert ein Protokoll. Schreiben Sie die Regel so: ufw allow proto tcp from any to any port 25565:25600. Für TCP und UDP fügen Sie zwei Regeln hinzu.
Die Regel ist hinzugefügt, aber der Port ist weiterhin geschlossen#
- Prüfen Sie die Reihenfolge (
ufw status numbered). Darüber darf keinedeny-Regel stehen, die denselben Verkehr verwirft. - Prüfen Sie, dass die Anwendung auf dem Port lauscht:
ss -tulpn | grep <PORT>. Die Adresse127.0.0.1bedeutet, dass er nur innerhalb des VPS erreichbar ist. - Prüfen Sie die Firewall im Kundenbereich. Steht sie im Modus Alles blockieren außer Erlaubtem, muss der Port auch dort erlaubt sein.
Ein Docker-Port ist offen, obwohl UFW ihn blockiert#
Das ist das erwartete Verhalten, siehe den Abschnitt Docker umgeht UFW.
ERROR: initcaps beim Einschalten#
UFW kann die Kernel-Module nicht verwenden. Typischerweise haben Sie den Kernel aktualisiert, und der VPS läuft noch nicht mit dem neuen. Starten Sie den VPS neu und schalten Sie UFW erneut ein.
Docker oder fail2ban funktioniert nach einem Neustart des Dienstes nftables nicht mehr#
flush ruleset hat ihre Regeln gelöscht. Starten Sie sie neu: systemctl restart docker fail2ban.
Zusammenfassung
- Zuerst
ufw allow 22/tcp, erst dannufw enable. - Standardrichtlinie:
deny incoming,allow outgoing; Regeln gelten von oben, und der erste Treffer gewinnt. ufw status numberedundufw delete <nummer>zum Verwalten der Regeln,ufw status verbosezum Prüfen.- IPv6 ist eingeschaltet (
IPV6=yes); Regeln werden für beide Versionen erstellt. - Von Docker veröffentlichte Ports umgehen UFW: Veröffentlichen Sie auf
127.0.0.1oder nutzen Sie die Firewall im Kundenbereich. - nftables nur für Fortgeschrittene und nie zusammen mit UFW.
Weiterführende Links#
- Ubuntu: Firewall (UFW) (öffnet sich in einem neuen Fenster)
- Handbuchseite ufw (öffnet sich in einem neuen Fenster)
- Docker: Paketfilterung und Firewalls (öffnet sich in einem neuen Fenster)
- Debian Wiki: nftables (öffnet sich in einem neuen Fenster)
- nftables-Wiki: einfaches Regelwerk für einen Server (öffnet sich in einem neuen Fenster)