Linux-VPS-Firewall mit UFW und nftables einrichten

14 Min. Lesezeit·Matthieu·vpssecuritylinuxfirewallnftablesufw|

Konfigurieren Sie eine Default-Deny-Firewall auf Ihrem Linux-VPS mit UFW oder nftables. Zwei Wege, ein Ziel: Nur die Ports, die Sie freigeben, bleiben offen.

Ein frischer VPS hat keine Firewall-Regeln. Jeder Port ist offen. Automatisierte Scanner finden Ihren Server innerhalb von Minuten nach dem Start und beginnen, SSH zu prüfen, Standardpasswörter zu testen und nach exponierten Diensten zu suchen. Eine Default-Deny-Firewall ist die erste Verteidigungsschicht.

Dieses Tutorial behandelt zwei Werkzeuge:

  • UFW -- ein vereinfachtes Frontend, das Firewall-Regeln aus kurzen Befehlen generiert. Optimal, um schnell eine sichere Basis zu schaffen.
  • nftables -- das native Linux-Firewall-Framework, das iptables ablöst. Optimal für Administratoren, die granulare Kontrolle, Docker-Kompatibilität oder IP-basiertes Rate Limiting benötigen.

Wählen Sie den Pfad, der zu Ihren Anforderungen passt. Beide führen zum gleichen Ergebnis: eine verifizierte Default-Deny-Firewall, bei der nur die Ports erreichbar sind, die Sie explizit freigeben.

Soll ich UFW oder nftables auf meinem VPS verwenden?

UFW ist ein vereinfachtes Frontend, das iptables/nftables-Regeln aus kurzen Befehlen wie ufw allow 22 generiert. nftables ist das native Linux-Firewall-Framework, das iptables ablöst und Tabellen, Ketten und Regeln mit einer klareren Syntax verwendet. UFW eignet sich für Einsteiger, die schnelle Standardeinstellungen wollen. nftables eignet sich für Administratoren, die Rate Limiting mit Meters, benannte Sets oder Docker-kompatible Regeln brauchen.

Eigenschaft UFW nftables
Lernkurve Niedrig. Einzeilige Befehle. Mittel. Tabelle/Kette/Regel-Struktur.
Standard auf Ubuntu (installiert, inaktiv) Debian 12 (installiert, minimale Konfiguration)
IPv6-Unterstützung Automatisch (Dual-Stack) Manuelle Regeln erforderlich (inet-Familie)
Rate Limiting ufw limit (pro Regel) Meters mit IP-basiertem Tracking
Docker-kompatibel Nein. Docker umgeht UFW-Regeln. Ja. nftables arbeitet mit Dockers DOCKER-USER-Kette.
Konfigurationspersistenz Automatisch bei ufw enable /etc/nftables.conf + systemd
Empfohlen für Einzelanwendungs-VPS, erster Server Multi-Service, Docker-Hosts, Produktion

Wenn Sie Docker betreiben, verzichten Sie auf UFW oder lesen Sie Docker umgeht UFW: 4 getestete Lösungen für Ihren VPS für den Workaround. Docker manipuliert iptables direkt und umgeht UFW vollständig. Container-Ports sind dann aus dem Internet erreichbar, selbst wenn UFW sie als blockiert anzeigt.

Voraussetzungen

Bevor Sie Firewall-Regeln ändern, prüfen Sie zwei Dinge:

  1. Sie haben SSH-Zugang und er funktioniert. Sie sind gerade per SSH mit Ihrem VPS verbunden.
  2. Sie haben Konsolenzugang als Fallback. Das Control Panel Ihres Hosters bietet eine VNC- oder serielle Konsole. Falls Sie sich aus SSH aussperren, können Sie den Server trotzdem über die Konsole erreichen.

Dieses Tutorial zielt auf Ubuntu 24.04 und Debian 12. Befehle funktionieren auf beiden, sofern nicht anders angegeben.

Prüfen Sie Ihre OS-Version:

cat /etc/os-release | grep PRETTY_NAME

Erwartete Ausgabe:

PRETTY_NAME="Ubuntu 24.04.4 LTS"

oder

PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"

Wie richte ich UFW auf Ubuntu 24.04 ein?

UFW ist auf Ubuntu 24.04 standardmäßig installiert, aber inaktiv. Auf Debian 12 installieren Sie es zuerst:

apt update && apt install -y ufw

Aktuellen Status prüfen:

ufw status

Erwartete Ausgabe:

Status: inactive

Wie aktiviere ich Default-Deny mit UFW?

Setzen Sie die Standard-Richtlinien so, dass aller eingehender Verkehr verworfen wird, und geben Sie dann explizit nur die Ports frei, die Ihre Dienste benötigen. Bei UFW: Standardwerte setzen, SSH erlauben, dann aktivieren. Die Reihenfolge ist entscheidend. Wenn Sie UFW aktivieren, bevor Sie SSH freigeben, sperren Sie sich aus.

Standard-Richtlinien setzen:

ufw default deny incoming
ufw default allow outgoing

Dies weist UFW an, alle eingehenden Verbindungen standardmäßig zu verwerfen und alle ausgehenden zuzulassen. Ihr Server kann weiterhin das Internet erreichen (für Updates, DNS usw.), aber von außen kommt nichts herein, es sei denn, Sie erstellen eine Regel.

Wie erlaube ich SSH, ohne mich auszusperren?

Erlauben Sie SSH vor dem Aktivieren von UFW. Dies ist der wichtigste Schritt:

ufw allow 22/tcp comment 'SSH'

Falls Sie Ihren SSH-Port geändert haben (z.B. auf 2222), verwenden Sie stattdessen diese Portnummer.

Aktivieren Sie nun UFW:

ufw enable

Sie sehen:

Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Ihre aktuelle SSH-Sitzung bleibt bestehen. UFW fügt die Erlaubnisregel vor der Aktivierung hinzu, bestehende Verbindungen werden also nicht unterbrochen.

Regeln überprüfen:

ufw status verbose

Erwartete Ausgabe:

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

Beachten Sie: Sowohl IPv4- als auch IPv6-Regeln erscheinen. UFW erstellt automatisch Dual-Stack-Regeln, wenn IPV6=yes in /etc/default/ufw gesetzt ist (Standard auf Ubuntu 24.04).

Wie erlaube ich Web-Traffic mit UFW?

Wenn Ihr VPS einen Webserver betreibt, geben Sie HTTP und HTTPS frei:

ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'

Überprüfung:

ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere                   # SSH
[ 2] 80/tcp                     ALLOW IN    Anywhere                   # HTTP
[ 3] 443/tcp                    ALLOW IN    Anywhere                   # HTTPS
[ 4] 22/tcp (v6)                ALLOW IN    Anywhere (v6)              # SSH
[ 5] 80/tcp (v6)                ALLOW IN    Anywhere (v6)              # HTTP
[ 6] 443/tcp (v6)               ALLOW IN    Anywhere (v6)              # HTTPS

Die nummerierte Ansicht ist hilfreich, wenn Sie später bestimmte Regeln mit ufw delete <number> löschen müssen.

Wie begrenze ich SSH-Verbindungen mit UFW?

UFW hat einen eingebauten Rate Limiter. Er verweigert Verbindungen von einer IP, die mehr als 6 Verbindungen innerhalb von 30 Sekunden versucht. Ersetzen Sie die einfache Erlaubnisregel durch eine Limit-Regel:

ufw delete allow 22/tcp
ufw limit 22/tcp comment 'SSH rate-limited'

Überprüfung:

ufw status verbose

Die SSH-Regel zeigt jetzt LIMIT IN statt ALLOW IN. Dies verlangsamt Brute-Force-Versuche, ohne legitimen Zugang zu blockieren. Für stärkeren Schutz kombinieren Sie mit Fail2Ban Fail2Ban auf einem Linux-VPS installieren und konfigurieren.

Wie erlaube ich bestimmte IPs oder Subnetze mit UFW?

Um den Zugang zu einem Dienst nach Quell-IP einzuschränken:

ufw allow from 198.51.100.0/24 to any port 22 proto tcp comment 'SSH from office'

Um einer einzelnen IP Zugang zu allen Ports zu gewähren:

ufw allow from 198.51.100.42 comment 'Trusted admin'

Dies ist nützlich für Verwaltungsdienste, die niemals öffentlich erreichbar sein sollten. Kombinieren Sie eingeschränkten Zugang mit der Default-Deny-Richtlinie.

Wie lösche ich UFW-Regeln?

Löschen Sie durch Angabe der exakten Regel. Dies ist die sicherste Methode, da sie unabhängig von der Regelreihenfolge funktioniert:

ufw delete allow 80/tcp

Sie können auch nach Nummer löschen. Listen Sie zuerst die Regeln mit Nummern auf:

ufw status numbered

Dann löschen Sie nach Nummer:

ufw delete 2

Vorsicht beim Löschen nach Nummer. Die Regelnummern ändern sich bei jedem Hinzufügen oder Entfernen von Regeln. Führen Sie immer ufw status numbered unmittelbar vor dem Löschen aus, um zu bestätigen, welche Regel welcher Nummer zugeordnet ist. Das Löschen der falschen Nummer kann Sie aus SSH aussperren.

Wie konfiguriere ich UFW-Logging?

Aktivieren Sie das Logging, um blockierte Verbindungen zu sehen:

ufw logging on

UFW unterstützt drei Log-Level: low, medium, high. Das Standard-Level low protokolliert blockierte Pakete. Zur Fehlersuche erhöhen Sie vorübergehend:

ufw logging medium

Logs ansehen:

journalctl -k -f | grep UFW

Oder die Log-Datei direkt prüfen:

tail -20 /var/log/ufw.log

Setzen Sie es nach der Fehlersuche auf low zurück. Höhere Level erzeugen erhebliche Festplatten-I/O auf stark belasteten Servern.

Funktioniert UFW mit IPv6?

Ja. UFW verwaltet IPv4 und IPv6 gleichzeitig, wenn IPV6=yes in /etc/default/ufw gesetzt ist. Dies ist auf Ubuntu 24.04 standardmäßig aktiviert. Überprüfung:

grep IPV6 /etc/default/ufw

Erwartet:

IPV6=yes

Jede ufw allow-Regel erstellt automatisch passende IPv4- und IPv6-Einträge. Keine zusätzlichen Schritte nötig.

UFW-Prüfliste

Führen Sie diese Prüfungen durch, um zu bestätigen, dass Ihre Firewall funktioniert:

  1. Alle Regeln auflisten: ufw status verbose
  2. Prüfen, ob UFW beim Start aktiviert ist: systemctl is-enabled ufw
  3. SSH von einem zweiten Terminal testen (schließen Sie Ihre aktuelle Sitzung nicht)
  4. Von außerhalb des Servers testen -- von Ihrem lokalen Rechner:
nc -zv YOUR_SERVER_IP 22

Erwartet: Connection to YOUR_SERVER_IP 22 port [tcp/ssh] succeeded!

nc -zv YOUR_SERVER_IP 25

Erwartet: Verbindung abgelehnt oder Timeout (Port 25 ist nicht freigegeben).

Wie konfiguriere ich nftables auf Debian 12?

nftables ist das Standard-Firewall-Framework auf Debian 12. Es ersetzt iptables mit einer klareren Syntax und besserer Leistung. Auf Ubuntu 24.04 installieren Sie es, wenn Sie es statt UFW verwenden möchten:

apt update && apt install -y nftables

Wenn UFW aktiv ist, deaktivieren Sie es zuerst. Beides gleichzeitig zu betreiben erzeugt widersprüchliche Regeln:

ufw disable
systemctl disable --now ufw

Was sind nftables-Tabellen, -Ketten und -Regeln?

nftables organisiert Firewall-Regeln in einer Hierarchie:

  • Tabelle (table) -- ein Container, der Ketten enthält. Die inet-Familie verarbeitet sowohl IPv4 als auch IPv6 in einer Tabelle.
  • Kette (chain) -- eine Liste von Regeln, die sich an einem bestimmten Punkt der Paketverarbeitung einklinkt. Eine input-Kette filtert Pakete, die für den Server bestimmt sind. Eine forward-Kette filtert durchlaufende Pakete.
  • Regel (rule) -- ein Paar aus Bedingung und Aktion. „Wenn das Paket auf TCP-Port 22 passt, akzeptieren."

Das zentrale Konzept: Setzen Sie die Richtlinie der Kette auf drop und fügen Sie dann Regeln hinzu, die bestimmten Verkehr per accept durchlassen. Alles, was nicht explizit erlaubt ist, wird stillschweigend verworfen.

Wie schreibe ich ein Default-Deny-Regelwerk für nftables?

Setzen Sie die Standard-Richtlinien so, dass aller eingehender Verkehr verworfen wird, und fügen Sie dann Regeln für SSH, HTTP und HTTPS hinzu. Bei nftables schreiben Sie dies als Konfigurationsdatei.

Konfiguration erstellen:

cp /etc/nftables.conf /etc/nftables.conf.bak
cat > /etc/nftables.conf << 'NFTEOF'
#!/usr/sbin/nft -f

flush ruleset

table inet firewall {

    set ssh_ratelimit {
        type ipv4_addr
        flags dynamic
        timeout 60s
    }

    set ssh_ratelimit6 {
        type ipv6_addr
        flags dynamic
        timeout 60s
    }

    chain inbound_ipv4 {
        icmp type echo-request limit rate 5/second accept
    }

    chain inbound_ipv6 {
        icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept
        icmpv6 type echo-request limit rate 5/second accept
    }

    chain inbound {
        type filter hook input priority filter; policy drop;

        ct state established,related accept
        ct state invalid drop

        iifname "lo" accept

        meta protocol vmap { ip : jump inbound_ipv4, ip6 : jump inbound_ipv6 }

        tcp dport 22 ct state new add @ssh_ratelimit { ip saddr limit rate 3/minute burst 5 packets } accept
        tcp dport 22 ct state new add @ssh_ratelimit6 { ip6 saddr limit rate 3/minute burst 5 packets } accept

        tcp dport { 80, 443 } accept

        log prefix "[nftables] Dropped: " counter drop
    }

    chain forward {
        type filter hook forward priority filter; policy drop;
    }

    chain outbound {
        type filter hook output priority filter; policy accept;
    }
}
NFTEOF

Was jeder Abschnitt bewirkt:

  • flush ruleset -- löscht alle bestehenden Regeln für einen sauberen Start.
  • table inet firewall -- erstellt eine Tabelle in der inet-Familie (Dual-Stack IPv4+IPv6).
  • set ssh_ratelimit -- ein dynamisches Set, das Quell-IPs für SSH-Rate-Limiting verfolgt. Einträge verfallen nach 60 Sekunden.
  • chain inbound -- die Haupt-Eingangskette mit policy drop. Alles, was keiner Regel entspricht, wird verworfen.
  • ct state established,related accept -- erlaubt Rückverkehr für Verbindungen, die Ihr Server initiiert hat. Ohne dies würden ausgehende Verbindungen (apt-Updates, DNS-Abfragen) fehlschlagen.
  • ct state invalid drop -- verwirft fehlerhafte Pakete, die zu keiner bekannten Verbindung gehören.
  • iifname "lo" accept -- erlaubt Loopback-Verkehr. Viele Dienste kommunizieren intern über localhost.
  • meta protocol vmap -- springt basierend auf dem Protokoll zu IPv4- oder IPv6-spezifischen Ketten. So werden ICMP und ICMPv6 getrennt behandelt.
  • tcp dport 22 ... limit rate 3/minute -- erlaubt SSH mit IP-basiertem Rate Limiting. Jede Quell-IP erhält 3 neue Verbindungen pro Minute mit einem Burst von 5.
  • tcp dport { 80, 443 } accept -- erlaubt HTTP und HTTPS.
  • log prefix "[nftables] Dropped: " -- protokolliert alle verworfenen Pakete im Kernel-Log zur Fehlersuche.

Wie handhabe ich IPv6 mit nftables?

Die inet-Familie in der Tabellendefinition verarbeitet sowohl IPv4 als auch IPv6 in einem Regelwerk. IPv6 benötigt jedoch bestimmte ICMPv6-Typen, damit das Netzwerk grundlegend funktioniert.

Die inbound_ipv6-Kette akzeptiert drei ICMPv6-Typen:

  • nd-neighbor-solicit -- das IPv6-Äquivalent zu ARP. Ohne dies kann Ihr Server keine Nachbarn im lokalen Netzwerk entdecken.
  • nd-router-advert -- ermöglicht Routern, sich anzukündigen. Erforderlich für SLAAC (automatische IPv6-Adresskonfiguration).
  • nd-neighbor-advert -- Antworten auf Nachbaranfragen. Erforderlich für IPv6-Konnektivität.

Das Blockieren eines dieser Typen unterbricht IPv6-Netzwerke. Das obige Regelwerk behandelt dies korrekt. Falls Sie nur IPv4 haben, sind diese Regeln harmlos -- sie greifen einfach nie.

Wie begrenze ich Verbindungen mit nftables-Meters?

Das obige Regelwerk verwendet dynamische Sets (früher Meters genannt) für IP-basiertes Rate Limiting bei SSH. Wenn eine Verbindung eintrifft, passiert Folgendes:

  1. Eine neue TCP-Verbindung auf Port 22 kommt von 198.51.100.42.
  2. nftables prüft @ssh_ratelimit auf einen Eintrag für diese IP.
  3. Hat die IP weniger als 3 Verbindungen in der letzten Minute, wird die Verbindung akzeptiert und der Zähler aktualisiert.
  4. Überschreitet die IP das Limit, greift die Regel nicht, und das Paket fällt in die drop-Richtlinie.

Der Parameter burst 5 packets erlaubt einen kurzen Spitzenwert, bevor die konstante Rate durchgesetzt wird. Das timeout 60s auf dem Set sorgt dafür, dass Einträge automatisch bereinigt werden und das Set nicht unbegrenzt wächst.

Um den aktuellen Zustand des Rate Limiters einzusehen:

nft list set inet firewall ssh_ratelimit

Dies zeigt, welche IPs aktuell verfolgt werden und deren Zähler.

Wie füge ich Regeln für weitere Dienste hinzu?

Das obige Regelwerk erlaubt SSH, HTTP und HTTPS. Um weitere Dienste hinzuzufügen, fügen Sie Regeln in der inbound-Kette vor der abschließenden log ... drop-Zeile ein.

Zum Beispiel, um eine Node.js-App auf Port 3000 nur von einer bestimmten IP zu erlauben:

tcp dport 3000 ip saddr 198.51.100.42 accept

Um einen UDP-Dienst wie WireGuard auf Port 51820 zu erlauben:

udp dport 51820 accept

Um einen Port-Bereich zu erlauben (z.B. für passives FTP):

tcp dport 40000-50000 accept

Nach dem Bearbeiten von /etc/nftables.conf validieren Sie die Syntax ohne Anwendung:

nft -c -f /etc/nftables.conf

Das -c-Flag prüft auf Fehler und beendet sich. Keine Ausgabe bedeutet, die Syntax ist gültig.

Wie verwalte ich nftables-Regeln zur Laufzeit?

Sie können Regeln hinzufügen und entfernen, ohne die Konfigurationsdatei zu bearbeiten. Diese Änderungen sind temporär und gehen beim Neustart verloren, sofern Sie sie nicht speichern.

Regel zur Laufzeit hinzufügen:

nft add rule inet firewall inbound tcp dport 8080 accept

Aktuelles Regelwerk auflisten:

nft list ruleset

Eine Regel über ihre Handle-Nummer löschen. Zuerst Regeln mit Handles auflisten:

nft -a list chain inet firewall inbound

Jede Regel zeigt ein # handle N-Suffix. Nach Handle löschen:

nft delete rule inet firewall inbound handle 15

Laufzeitänderungen in die Konfigurationsdatei speichern:

nft list ruleset > /etc/nftables.conf

Die Shebang-Zeile oben in der Datei ergänzen:

sed -i '1i #!/usr/sbin/nft -f' /etc/nftables.conf

Wie wende ich nftables-Regeln an und mache sie persistent?

Konfiguration anwenden:

nft -f /etc/nftables.conf

Prüfen, ob die Regeln geladen sind:

nft list ruleset

Sie sollten die vollständige Tabelle mit allen Ketten und Regeln sehen. Bei Syntaxfehlern gibt nft -f die Zeilennummer und den Fehler aus.

nftables beim Start aktivieren:

systemctl enable --now nftables

enable macht es neustartsicher. --now startet es sofort. Prüfen Sie, ob der Dienst läuft:

systemctl status nftables

Die erwartete Ausgabe enthält Active: active (exited). Der Status exited ist normal. nftables lädt die Regeln in den Kernel und beendet sich. Die Regeln bleiben im Kernel-Raum aktiv.

Bestätigen, dass es für den nächsten Start aktiviert ist:

systemctl is-enabled nftables

Erwartet: enabled.

Wie lese ich nftables-Logs?

Das Regelwerk enthält eine log-Anweisung vor dem abschließenden drop. Verworfene Pakete erscheinen im Kernel-Log mit dem Präfix [nftables] Dropped:.

Verworfene Pakete in Echtzeit anzeigen:

journalctl -k -f | grep nftables

Ein typischer Log-Eintrag:

Mar 19 14:23:01 vps kernel: [nftables] Dropped: IN=eth0 OUT= SRC=203.0.113.55 DST=198.51.100.1 PROTO=TCP SPT=44521 DPT=3389

Das sagt Ihnen: Eine externe IP (203.0.113.55) hat versucht, Port 3389 (RDP) auf Ihrem Server zu erreichen, und wurde verworfen. Das ist normaler Scan-Verkehr. Wenn Sie Ihre eigene IP im SRC-Feld sehen, haben Sie ein Regelproblem.

Um Log-Spam auf stark gescannten Servern zu vermeiden, erklärt der Fehlerbehebungsabschnitt unten, wie Sie ein Rate Limit zur Log-Regel hinzufügen.

nftables-Prüfliste

  1. Vollständiges Regelwerk auflisten: nft list ruleset
  2. Dienst prüfen: systemctl is-enabled nftables
  3. SSH von einem zweiten Terminal testen (aktuelle Sitzung offen lassen)
  4. Von Ihrem lokalen Rechner testen:
nc -zv YOUR_SERVER_IP 22

Erwartet: Verbindung erfolgreich.

nc -zv YOUR_SERVER_IP 25

Erwartet: Verbindung abgelehnt oder Timeout.

  1. Verworfene Pakete in den Logs prüfen:
journalctl -k | grep "nftables"

Wie verhindere ich eine SSH-Aussperrung beim Ändern von Firewall-Regeln?

Sich aus SSH auszusperren ist das größte Risiko bei der Firewall-Konfiguration. Zwei Sicherungen verhindern dies.

Sicherung 1: Immer in einem zweiten Terminal testen

Bevor Sie Ihre SSH-Sitzung nach Firewall-Änderungen schließen, öffnen Sie ein neues Terminal und verbinden Sie sich per SSH mit Ihrem Server. Wenn die neue Verbindung funktioniert, sind Ihre Regeln korrekt. Falls nicht, kehren Sie zu Ihrer ursprünglichen Sitzung zurück und korrigieren Sie die Regeln.

Schließen Sie niemals Ihre aktive SSH-Sitzung, bevor Sie bestätigt haben, dass eine zweite Verbindung funktioniert.

Sicherung 2: Zeitgesteuerte Absicherung mit at

Wenn Sie nftables-Änderungen testen, planen Sie einen Job, der nach 5 Minuten automatisch alle Regeln löscht. Falls Ihre neuen Regeln Sie aussperren, warten Sie 5 Minuten und versuchen es erneut.

at now + 5 minutes <<< 'nft flush ruleset'

Falls at nicht installiert ist:

apt install -y at
systemctl enable --now atd
at now + 5 minutes <<< 'nft flush ruleset'

Nachdem Sie bestätigt haben, dass Ihre Regeln funktionieren, brechen Sie die Absicherung ab:

atrm $(atq | awk '{print $1}')

Für UFW die entsprechende Absicherung:

at now + 5 minutes <<< 'ufw disable'

Was ist mit Docker und der Firewall?

Docker manipuliert iptables direkt, um Container-Netzwerke einzurichten. Wenn Sie einen Port mit -p 8080:80 veröffentlichen, erstellt Docker NAT-Regeln, die UFW vollständig umgehen. Ihre ufw deny-Regeln haben keine Wirkung auf von Docker veröffentlichte Ports.

Das ist die häufigste Firewall-Überraschung auf Linux-VPS. Ein Port, den Sie für blockiert hielten, ist weit offen, weil Docker den Verkehr um Ihre Firewall herum geleitet hat.

Zwei Lösungen:

  1. Verwenden Sie nftables statt UFW. nftables hat nicht dasselbe Umgehungsproblem, weil Sie das gesamte Regelwerk kontrollieren.
  2. Wenden Sie den DOCKER-USER-Ketten-Fix an. Siehe Docker umgeht UFW: 4 getestete Lösungen für Ihren VPS für die Schritt-für-Schritt-Anleitung, die Docker-Verkehr durch UFW zwingt.

Wenn Sie Docker in Produktion betreiben, ist nftables die sicherere Wahl.

Referenz gängiger Ports

Dienst Port Protokoll UFW-Befehl nftables-Regel
SSH 22 TCP ufw allow 22/tcp tcp dport 22 accept
HTTP 80 TCP ufw allow 80/tcp tcp dport 80 accept
HTTPS 443 TCP ufw allow 443/tcp tcp dport 443 accept
DNS 53 TCP/UDP ufw allow 53 tcp dport 53 accept; udp dport 53 accept
PostgreSQL 5432 TCP ufw allow 5432/tcp tcp dport 5432 accept
MySQL 3306 TCP ufw allow 3306/tcp tcp dport 3306 accept

Exponieren Sie Datenbank-Ports niemals ins Internet. Wenn Sie entfernten Datenbankzugang benötigen, verwenden Sie einen SSH-Tunnel oder beschränken Sie auf bestimmte IPs:

UFW:

ufw allow from 198.51.100.0/24 to any port 5432 proto tcp comment 'PostgreSQL from trusted network'

nftables (vor dem abschließenden drop in der inbound-Kette einfügen):

tcp dport 5432 ip saddr 198.51.100.0/24 accept

Fehlerbehebung

Etwas funktioniert nicht?

Aus SSH ausgesperrt: Verwenden Sie die VNC-/serielle Konsole Ihres Hosters. Dann entweder ufw disable oder nft flush ruleset, um alle Regeln zu löschen. Fügen Sie Ihre SSH-Erlaubnisregel wieder hinzu, bevor Sie die Firewall erneut aktivieren.

Regeln bleiben nach Neustart nicht erhalten (nftables): Prüfen Sie, ob der Dienst aktiviert ist: systemctl is-enabled nftables. Falls disabled angezeigt wird, führen Sie systemctl enable nftables aus. Prüfen Sie auch, ob /etc/nftables.conf syntaktisch gültig ist: nft -c -f /etc/nftables.conf (das -c-Flag prüft die Syntax ohne Anwendung).

UFW zeigt Regeln, aber Verkehr wird trotzdem blockiert: Prüfen Sie auf widersprüchliche nftables- oder iptables-Regeln: nft list ruleset und iptables -L -n. Zwei gleichzeitig laufende Firewall-Tools erzeugen unvorhersehbare Ergebnisse.

Logs füllen die Festplatte: Wenn Sie Logging aktiviert haben und der Server viel Scan-Verkehr empfängt, können Logs schnell wachsen. Senken Sie das Log-Level (ufw logging low) oder fügen Sie ein Rate Limit zur nftables-Log-Regel hinzu:

log prefix "[nftables] Dropped: " limit rate 10/minute counter drop

Verbindung nach Aktivierung des Rate Limiting nicht möglich: Der Rate Limiter ist möglicherweise zu streng. Für nftables inspizieren Sie das dynamische Set: nft list set inet firewall ssh_ratelimit. Bei UFW verwendet ufw limit einen festen Schwellenwert von 6 Verbindungen/30 Sekunden, der nicht konfigurierbar ist. Falls das zu streng ist, verwenden Sie ein einfaches ufw allow und setzen Sie stattdessen auf Fail2Ban Fail2Ban auf einem Linux-VPS installieren und konfigurieren.

Nächste Schritte

Eine Firewall blockiert unerwünschte Ports. Sie erkennt keine wiederholten fehlgeschlagenen Anmeldeversuche und keine Angriffe auf Anwendungsebene. Um Ihre VPS-Sicherheitsbasis zu vervollständigen: