Zum Inhalt springen
Aktueller Gutschein:10 % RabattIn der Bestellung einlösen

Firewall im VPS: UFW (und nftables für Fortgeschrittene)

Richten Sie die Firewall UFW direkt in Ihrem VPS ein, ohne sich auszusperren: Standardrichtlinie, Regeln für Dienste, Beschränkung nach IP-Adresse, limit, IPv6, Logs. Warum Docker UFW umgeht und wie Sie nftables nutzen.

  • Fortgeschrittene
  • ~20 Min.
  • Aktualisiert am 9.10.2026

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:

bash
ufw status

Die Ausgabe Status: inactive bedeutet, dass die Firewall noch nichts blockiert.

Debian 13

Installieren Sie UFW:

bash
apt install ufw

Nach 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:

bash
ufw default deny incoming
ufw default allow outgoing
  • ufw 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.

bash
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#

  1. Schalten Sie die Firewall ein:

    bash
    ufw enable
  2. UFW fragt Command may disrupt existing ssh connections. Proceed with operation (y|n)?. Wenn Sie die SSH-Regel haben, tippen Sie y und drücken Sie Eingabe.

  3. Sie sehen Firewall is active and enabled on system startup. Die Firewall läuft jetzt und startet auch nach einem Neustart.

  4. Prüfen Sie in einem neuen Fenster, dass Sie sich per SSH verbinden können.

  5. Zeigen Sie den ausführlichen Status an:

    bash
    ufw status verbose
    Ausgabetext
    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
ZeileBedeutung
Status: activeDie 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: skipNeue Anwendungsprofile werden nicht automatisch erlaubt.
22/tcp ALLOW IN AnywherePort 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öchtenBefehl
Web (HTTP und HTTPS)ufw allow proto tcp from any to any port 80,443 comment 'Web'
Minecraft Javaufw 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'
Portbereichufw allow proto tcp from any to any port 25565:25600 comment 'Game servers'
Port nur von einer IP-Adresseufw allow proto tcp from 198.51.100.25 to any port 3306 comment 'DB from office'
Eine IP-Adresse blockierenufw 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 Bereich 198.51.100.0/24 ist 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 mit ufw prepend deny from 2001:db8::/64, was die Regel an den Anfang der IPv6-⁠Regeln setzt.
  • deny – stillschweigend verwerfen. Die Variante reject teilt 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)#

bash
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#

bash
ufw status numbered
Ausgabetext
     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)              # Minecraft

Eine Regel nach Nummer löschen:

bash
ufw delete 2
  • ufw 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:

BefehlWas er tut
ufw reloadLädt die Regeln neu (nach manueller Bearbeitung der Dateien in /etc/ufw/).
ufw disableSchaltet die Firewall aus; die Regeln bleiben gespeichert.
ufw --dry-run allow 80/tcpZeigt, was der Befehl tun würde, ändert aber nichts.
ufw resetSchaltet 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:

  1. 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.
  2. Veröffentlichen Sie Datenbanken und interne Dienste gar nicht. Container sprechen über das Docker-Netzwerk miteinander; sie brauchen keinen Port nach außen.

  3. 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#

bash
ufw logging low
  • low – 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 off schaltet die Protokollierung aus.

Wo Sie die Einträge finden:

Ubuntu 24.04

bash
tail -f /var/log/ufw.log
  • tail -f – gibt neue Zeilen der Datei fortlaufend aus. Beenden mit Strg+C.

Debian 13

bash
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:

/etc/nftables.conftext
#!/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;
    }
}
ZeileWas sie tut
flush rulesetLöscht alle vorhandenen Regeln, damit die Datei immer aus einem sauberen Zustand lädt.
table inet filterDie Tabelle filter für die Familie inet, also IPv4 und IPv6 zugleich.
type filter hook input … policy dropDie Chain für eingehenden Verkehr. Alles, was keine Regel erlaubt, wird verworfen.
ct state established,related acceptLässt Antworten auf bereits aufgebaute Verbindungen durch. Ohne sie würde nichts funktionieren, was der VPS selbst öffnet.
ct state invalid dropVerwirft beschädigte oder unsinnige Pakete.
iif "lo" acceptErlaubt Verkehr innerhalb des VPS (das Loopback, 127.0.0.1). Ohne sie funktionieren lokale Datenbanken und Dienste nicht mehr.
meta l4proto { icmp, ipv6-icmp } acceptErlaubt ICMP: Ping und die Meldungen, die das Netzwerk zum ordentlichen Funktionieren braucht. Ohne ICMPv6 funktioniert IPv6 nicht (Neighbor Discovery).
tcp dport 22 acceptSSH. Wenn Sie einen anderen Port verwenden, ändern Sie ihn.
tcp dport { 80, 443 } acceptWeb. Eine Menge von Ports in geschweiften Klammern. Für UDP verwenden Sie udp dport.
chain forward … policy dropDer VPS leitet keinen Verkehr weiter (er ist kein Router).
chain output … policy acceptAusgehender Verkehr ohne Einschränkung.

Bereitstellung (gilt für Debian 13 und Ubuntu 24.04):

  1. Installieren Sie das Werkzeug: apt install nftables.

  2. Schalten Sie UFW aus, falls es läuft: ufw disable.

  3. Speichern Sie die Konfiguration in /etc/nftables.conf (nano /etc/nftables.conf).

  4. 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.
  5. Aktivieren Sie den Dienst, der die Regeln sofort und nach jedem Booten lädt:

    bash
    systemctl enable --now nftables
    • enable – die Regeln beim Booten des VPS laden (der Dienst ist standardmäßig aus).
    • --now – und sie sofort laden.
  6. Prüfen Sie SSH in einem neuen Fenster. nft list ruleset gibt die aktuellen Regeln aus.

Überprüfung#

  • ufw status verbose zeigt Status: active und 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 Linux nc -vz -w 5 <VPS_IP_ADRESSE> 3306; ein geschlossener Port endet mit einem Timeout).

Wenn Sie sich aussperren#

  1. Öffnen Sie die Browser-Konsole und melden Sie sich als root an.
  2. Erlauben Sie SSH: ufw allow 22/tcp, oder schalten Sie die Firewall vorübergehend aus: ufw disable.
  3. Bei nftables: systemctl stop nftables und dann nft flush ruleset (löscht alle Regeln; Verkehr wird erlaubt).
  4. 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 keine deny-Regel stehen, die denselben Verkehr verwirft.
  • Prüfen Sie, dass die Anwendung auf dem Port lauscht: ss -tulpn | grep <PORT>. Die Adresse 127.0.0.1 bedeutet, 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 dann ufw enable.
  • Standardrichtlinie: deny incoming, allow outgoing; Regeln gelten von oben, und der erste Treffer gewinnt.
  • ufw status numbered und ufw delete <nummer> zum Verwalten der Regeln, ufw status verbose zum 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.1 oder nutzen Sie die Firewall im Kundenbereich.
  • nftables nur für Fortgeschrittene und nie zusammen mit UFW.

Anleitungen durchsuchen