UFW Firewall unter Linux einrichten – Ports sichern, Regeln verwalten

UFW (Uncomplicated Firewall) Schritt für Schritt einrichten: Standardregeln, Ports öffnen und sperren, IP-Adressen blockieren, Logging aktivieren und den Docker-Caveat kennen.

7 min Lesezeit

UFW Firewall unter Linux einrichten – Ports sichern, Regeln verwalten

Eine Firewall ist die erste Verteidigungslinie deines Servers. UFW (Uncomplicated Firewall) macht die Verwaltung von iptables-Regeln deutlich einfacher – ohne auf Flexibilität zu verzichten.

Wichtiger Hinweis für Docker-Nutzer: Docker bypassed UFW-Regeln standardmäßig. Lies den Docker-Abschnitt bevor du UFW auf einem Docker-Host einrichtest.


Installation und Grundeinrichtung

# Ubuntu: UFW ist vorinstalliert
# Debian: Installation
sudo apt update && sudo apt install -y ufw

# Fedora: firewalld ist Standard (UFW separat)
sudo dnf install -y ufw

Status prüfen

sudo ufw status
# Status: inactive   ← noch nicht aktiv

IPv6-Unterstützung aktivieren

sudo nano /etc/default/ufw
# Sicherstellen:
# IPV6=yes

Standardregeln und -richtlinien

Reihenfolge beim Einrichten (kritisch!):

1. Standardrichtlinien setzen
2. SSH erlauben  ← ZUERST, sonst sperrst du dich aus!
3. UFW aktivieren

Standardrichtlinien setzen

# Alle eingehenden Verbindungen ablehnen (sicher)
sudo ufw default deny incoming

# Alle ausgehenden Verbindungen erlauben
sudo ufw default allow outgoing

SSH erlauben (PFLICHT vor dem Aktivieren!)

# Über Service-Namen (Port 22)
sudo ufw allow OpenSSH

# Oder explizit über Port
sudo ufw allow 22/tcp

# SSH auf anderem Port (z.B. 2222)
sudo ufw allow 2222/tcp

UFW aktivieren

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

sudo ufw status verbose

Regeln hinzufügen

Nach Port

# HTTP und HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# Beides gleichzeitig
sudo ufw allow proto tcp from any to any port 80,443

# UDP-Port (z.B. DNS)
sudo ufw allow 53/udp

# Port-Bereich
sudo ufw allow 8000:8010/tcp

Nach Service-Namen

# Verfügbare Services anzeigen
sudo ufw app list
# Available applications:
#   Apache
#   Apache Full
#   Apache Secure
#   Nginx Full
#   Nginx HTTP
#   Nginx HTTPS
#   OpenSSH

# Service erlauben
sudo ufw allow 'Nginx Full'    # HTTP + HTTPS
sudo ufw allow 'Nginx HTTP'    # nur HTTP
sudo ufw allow 'Nginx HTTPS'   # nur HTTPS

Nach IP-Adresse

# Bestimmte IP komplett erlauben
sudo ufw allow from 203.0.113.10

# IP auf spezifischen Port
sudo ufw allow from 203.0.113.10 to any port 22

# IP-Bereich (CIDR)
sudo ufw allow from 10.0.0.0/24

# Aus einem Subnetz auf SSH
sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp

Verbindungen ablehnen / blockieren

# Port ablehnen (Sender bekommt Rückmeldung)
sudo ufw deny 3306

# Port blockieren (kein Response, Verbindung läuft ins Leere)
sudo ufw reject 3306

# IP blockieren
sudo ufw deny from 203.0.113.99
sudo ufw deny from 203.0.113.0/24

Regeln anzeigen und löschen

# Einfache Übersicht
sudo ufw status

# Mit Nummern (für das Löschen)
sudo ufw status numbered
# Status: active
#
#      To                         Action      From
#      --                         ------      ----
# [ 1] 22/tcp                     ALLOW IN    Anywhere
# [ 2] 80/tcp                     ALLOW IN    Anywhere
# [ 3] 443/tcp                    ALLOW IN    Anywhere

# Ausführlich
sudo ufw status verbose

Regeln löschen

# Nach Nummer löschen
sudo ufw delete 3

# Nach Regel-Definition löschen
sudo ufw delete allow 80/tcp
sudo ufw delete allow 'Nginx HTTP'

# Alle Regeln zurücksetzen (UFW wird deaktiviert!)
sudo ufw reset

Erweiterte Regeln

Ausgehende Verbindungen einschränken

# Standard: alle ausgehenden erlauben
# Restriktiver Modus: nur Bestimmtes erlauben
sudo ufw default deny outgoing

# DNS erlauben
sudo ufw allow out 53

# HTTP/HTTPS für Updates
sudo ufw allow out 80/tcp
sudo ufw allow out 443/tcp

# SSH zu anderen Servern
sudo ufw allow out 22/tcp

Verbindungen auf bestimmte Interfaces einschränken

# Nur auf eth0 erlauben (nicht auf lokalen Interfaces)
sudo ufw allow in on eth0 to any port 443

# Auf Loopback alles erlauben
sudo ufw allow in on lo
sudo ufw allow out on lo

Rate Limiting gegen Brute-Force

# Verbindungsrate begrenzen (max. 6 Verbindungen in 30 Sek)
sudo ufw limit 22/tcp
# oder:
sudo ufw limit OpenSSH

Weiterleitung (Port Forwarding) aktivieren

# In /etc/default/ufw:
sudo nano /etc/default/ufw
# DEFAULT_FORWARD_POLICY="ACCEPT"

# In /etc/ufw/sysctl.conf:
sudo nano /etc/ufw/sysctl.conf
# net/ipv4/ip_forward=1

UFW-Logging

# Logging aktivieren
sudo ufw logging on

# Logging-Level
sudo ufw logging low      # Nur blockierte Pakete
sudo ufw logging medium   # + erlaubte Verbindungen (Standard)
sudo ufw logging high     # Alles
sudo ufw logging full     # Sehr verbose

# Logs anzeigen
sudo tail -f /var/log/ufw.log

# Oder via journalctl
sudo journalctl -k | grep UFW

# Blockierte Verbindungen der letzten Stunde
sudo journalctl -k --since "1 hour ago" | grep "UFW BLOCK"

# Top-Quell-IPs
sudo grep "UFW BLOCK" /var/log/ufw.log | awk '{print $13}' | sort | uniq -c | sort -rn | head

Der Docker-Caveat

Kritisch: Docker modifiziert iptables direkt und umgeht dabei UFW-Regeln. Ein Port, der in Docker exponiert wird (-p 8080:80), ist von außen erreichbar – auch wenn UFW ihn blockiert!

Das Problem demonstriert

# UFW blockt Port 8080
sudo ufw deny 8080/tcp

# Aber: Docker-Container ist trotzdem erreichbar!
docker run -p 8080:80 nginx
curl http://server-ip:8080   # KLAPPT, obwohl UFW es verbietet!

Lösung 1: Nur auf localhost binden

# Container nur auf localhost verfügbar
docker run -p 127.0.0.1:8080:80 nginx

# In compose.yaml:
ports:
  - "127.0.0.1:8080:80"

Nginx leitet dann von außen weiter – UFW-Regeln für Port 80/443 gelten normal.

Lösung 2: DOCKER-USER Chain

# UFW-Regeln für Docker-Traffic hinzufügen
# In /etc/ufw/after.rules am Ende:
sudo nano /etc/ufw/after.rules
# Docker-Traffic kontrollieren
*filter
:DOCKER-USER - [0:0]
-A DOCKER-USER -i eth0 -p tcp --dport 8080 -j DROP
COMMIT
sudo ufw reload

Lösung 3: ufw-docker Tool

# Tool installieren das das Problem automatisch löst
sudo wget -O /usr/local/bin/ufw-docker \
  https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker
sudo chmod +x /usr/local/bin/ufw-docker
sudo ufw-docker install
sudo systemctl restart ufw

Empfehlung: Nutze Lösung 1 (127.0.0.1 Binding) für einfache Setups. Nginx als Reverse Proxy übernimmt dann die Ports 80/443.


Fail2ban-Integration

UFW und Fail2ban ergänzen sich gut: Fail2ban sperrt dynamisch IPs bei zu vielen Fehlversuchen, UFW ist die statische Schicht darunter.

# Fail2ban installieren
sudo apt install -y fail2ban

# Konfiguration
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
bantime  = 3600      # 1 Stunde gesperrt
findtime = 600       # In 10 Minuten
maxretry = 5         # 5 Fehlversuche

# Fail2ban nutzt UFW zum Sperren
banaction = ufw

[sshd]
enabled = true
port    = 22
sudo systemctl enable --now fail2ban

# Status
sudo fail2ban-client status sshd

# IP manuell sperren
sudo fail2ban-client set sshd banip 203.0.113.99

# IP entsperren
sudo fail2ban-client set sshd unbanip 203.0.113.99

Häufige Probleme

Aus dem Server ausgesperrt

Wenn SSH geblockt wurde: Cloud-Provider Web-Konsole nutzen (Hetzner, DigitalOcean, AWS EC2 Console).

# Über Konsole: SSH wieder freigeben
sudo ufw allow 22/tcp
sudo ufw status

UFW blockiert legitimen Traffic

# Ausführlichen Status prüfen
sudo ufw status verbose

# Logs prüfen
sudo grep "UFW BLOCK" /var/log/ufw.log | tail -20

# Temporär deaktivieren zum Testen
sudo ufw disable
# Problem reproduzieren...
sudo ufw enable

Regeln werden nach Neustart nicht geladen

# UFW beim Boot aktivieren
sudo ufw enable
sudo systemctl enable ufw

# Status
sudo systemctl status ufw

Port offen laut ss, aber UFW blockiert

# ss zeigt Server-Sicht (intern)
sudo ss -ltnp | grep :80

# Von außen testen
curl -I http://server-ip
nmap -p 80 server-ip

Rollback

UFW deaktivieren

# UFW deaktivieren (alle Regeln inaktiv, Traffic frei)
sudo ufw disable

UFW komplett zurücksetzen

# Alle Regeln löschen, UFW deaktivieren
sudo ufw reset

UFW deinstallieren

sudo apt purge -y ufw
sudo apt autoremove -y

Schnellstart: Server-Grundkonfiguration

# Komplettes Setup für einen Web-Server (Nginx + SSH)

# 1. Standardregeln
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 2. SSH (anpassen wenn anderer Port!)
sudo ufw allow OpenSSH

# 3. Web-Traffic
sudo ufw allow 'Nginx Full'

# 4. Aktivieren
sudo ufw enable

# 5. Status prüfen
sudo ufw status verbose

Für einen Datenbank-Server (nur aus eigenem Netz zugänglich):

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow from 10.0.0.0/24 to any port 5432  # PostgreSQL nur intern
sudo ufw enable

Fazit

UFW macht iptables handhabbar. Für die meisten Server-Setups reicht:

  • SSH erlauben
  • HTTP/HTTPS erlauben
  • Alles andere ablehnen
  • Fail2ban für Brute-Force-Schutz

Docker-Nutzer sollten besonders den Docker-Caveat beachten.

War dieser Artikel hilfreich?