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.