Anleitung

ufw einrichten unter Linux: Firewall auf dem Server und Grundlagen von nftables

Aktualisiert: · Skillaria.Top

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.

WerkzeugEbeneWann verwenden
ufwAufsatz, einfache Syntaxeinzelner Server unter Ubuntu/Debian, Standardregeln
firewalldAufsatz mit ZonenRHEL, Rocky, Fedora
nftables (nft)niedrig, modernkomplexe Regeln, NAT, Adressmengen
iptablesniedrig, 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.

AufgabeBefehl
TCP-Portsudo ufw allow 443/tcp
UDP-Portsudo ufw allow 51820/udp
Portbereichsudo ufw allow 6000:6007/tcp
Nach Dienstnamesudo ufw allow https
Von einer IPsudo ufw allow from 203.0.113.10
Aus einem Subnetz auf einen Portsudo ufw allow from 10.0.0.0/24 to any port 5432 proto tcp
Auf einer Schnittstellesudo ufw allow in on eth1 to any port 3306 proto tcp
Verbietensudo ufw deny 23/tcp
Mit Antwort ablehnensudo 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:80 und nach außen über einen Reverse-Proxy (nginx) gehen.
  • Eigene Regeln in die Kette DOCKER-USER eintragen — 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 OpenSSH oder sudo ufw disable.
  • Port geöffnet, Dienst aber nicht erreichbar — der Dienst lauscht auf 127.0.0.1 statt auf der externen Adresse. Prüfen Sie es mit ss -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.

Das Thema im Video lernen

Dieses Thema wird im Kurs „Linux: с нуля до уверенного администрирования“ ausführlich mit Praxis behandelt.

Zum Kurs