Files

34 KiB
Raw Permalink Blame History

title, description, published, date, tags, editor, dateCreated
title description published date tags editor dateCreated
UFW server firewall Profice true 2026-02-24T08:56:45.279Z markdown 2026-02-24T08:54:57.458Z

UFW Firewall Vollständige Server-Dokumentation

Systemumgebung: Debian-basierter Server (Debian 12 / Ubuntu 22.04+) Firewall: UFW (Uncomplicated Firewall) Frontend für iptables/nftables Einsatz: Netzwerksicherheit, Zugriffssteuerung, Portfilterung für alle Serverdienste


Inhaltsverzeichnis

  1. Überblick und Funktionsweise
  2. Installation und Ersteinrichtung
  3. Grundlegende Regelverwaltung
  4. Erweiterte Regeln
  5. Anwendungsprofile
  6. Regelkonfiguration für unsere Dienste
  7. Logging und Überwachung
  8. IPv6-Konfiguration
  9. Rate Limiting Brute-Force-Schutz
  10. Port-Weiterleitung und NAT
  11. UFW und Docker
  12. Regelreihenfolge und Priorität
  13. Backup und Wiederherstellung
  14. Sicherheitshärtung
  15. Fehlerbehebung
  16. Schnellreferenz Befehle auf einen Blick

1. Überblick und Funktionsweise

Was ist UFW?

UFW (Uncomplicated Firewall) ist ein benutzerfreundliches Frontend für die Linux-Kernel-Firewall (iptables/nftables). Es vereinfacht die Erstellung und Verwaltung von Firewall-Regeln erheblich, ohne auf die Leistungsfähigkeit des darunterliegenden Paketfilters zu verzichten.

Warum eine Firewall?

Ein Server ohne Firewall ist wie ein Haus mit offenen Türen. Jeder Dienst, der auf einem Port lauscht, ist aus dem gesamten Internet erreichbar. Eine Firewall kontrolliert, welcher Netzwerkverkehr den Server erreichen darf und welcher blockiert wird.

Architektur

@startuml

skinparam shadowing false
skinparam roundCorner 10

package "Debian Server" {

    [UFW\n(Firewall-Frontend)] as ufw
    [iptables / nftables\n(Kernel-Paketfilter)] as iptables

    package "Geschützte Dienste" {
        [SSH\nPort 22] as ssh
        [Nginx\nPort 80/443] as nginx
        [Gitea\nPort 3000] as gitea
        [PostgreSQL\nPort 5432] as pg
        [Vaultwarden\nPort 8080] as vw
    }

    ufw --> iptables : Regeln übersetzen
    iptables --> ssh
    iptables --> nginx
    iptables --> gitea
    iptables --> pg
    iptables --> vw
}

cloud "Internet" as inet
actor "Administrator\n(SSH)" as admin
actor "Angreifer" as attacker

admin --> ufw : Port 22 erlaubt
inet --> ufw : Port 80/443 erlaubt
attacker --> ufw : Port 5432 blockiert

@enduml

UFW vs. iptables vs. nftables

Eigenschaft UFW iptables nftables
Benutzerfreundlichkeit Sehr hoch Niedrig Mittel
Lernkurve Flach Steil Mittel
Leistung Sehr gut Sehr gut Sehr gut
Flexibilität Gut (deckt 95% der Fälle ab) Maximal Maximal
Regelverwaltung Einfache Befehle Komplexe Syntax Moderne Syntax
Standard auf Debian/Ubuntu Verfügbar Ja (Backend) Ja (ab Debian 11)

Empfehlung: UFW ist für die allermeisten Server-Setups ausreichend und der einfachste Weg zu einer sicheren Firewall. Für komplexe Netzwerk-Setups (Multi-NIC, komplexes NAT, Traffic Shaping) kann direktes nftables notwendig sein.

Grundprinzip: Default Deny

Die wichtigste Regel der Firewall-Konfiguration:

  • Eingehender Verkehr: Standardmäßig blockiert (deny)
  • Ausgehender Verkehr: Standardmäßig erlaubt (allow)
  • Explizite Regeln: Nur die tatsächlich benötigten Ports werden geöffnet

2. Installation und Ersteinrichtung

2.1 UFW installieren

sudo apt update
sudo apt install -y ufw

2.2 Status prüfen

sudo ufw status
# Ausgabe: Status: inactive

Wichtig: UFW ist nach der Installation standardmäßig deaktiviert. Regeln können auch im deaktivierten Zustand hinzugefügt werden und werden beim Aktivieren sofort wirksam.

2.3 Standardrichtlinien setzen

# Eingehenden Verkehr blockieren
sudo ufw default deny incoming

# Ausgehenden Verkehr erlauben
sudo ufw default allow outgoing

# Weitergeleiteten Verkehr blockieren (optional, Standard auf Debian)
sudo ufw default deny routed

2.4 SSH-Zugang erlauben (KRITISCH VOR dem Aktivieren!)

# SSH erlauben (Standard-Port 22)
sudo ufw allow ssh

# Oder mit benutzerdefiniertem Port
sudo ufw allow 2222/tcp

Warnung: Wenn UFW aktiviert wird, ohne eine SSH-Regel zu erstellen, wird die aktuelle SSH-Verbindung getrennt und der Server ist nicht mehr erreichbar. Immer zuerst SSH erlauben.

2.5 UFW aktivieren

sudo ufw enable

Bestätigungsabfrage:

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

UFW ist jetzt aktiv und startet automatisch bei jedem Systemstart.

2.6 Status und Regeln anzeigen

# Kompakte Ansicht
sudo ufw status

# Detaillierte Ansicht mit Regelnummern
sudo ufw status numbered

# Ausführliche Ansicht
sudo ufw status verbose

Beispielausgabe von sudo ufw status verbose:

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)

3. Grundlegende Regelverwaltung

3.1 Ports erlauben (ALLOW)

# Einzelnen Port erlauben (TCP und UDP)
sudo ufw allow 80

# Nur TCP
sudo ufw allow 80/tcp

# Nur UDP
sudo ufw allow 53/udp

# Port-Bereich erlauben
sudo ufw allow 6000:6100/tcp

# Dienst nach Name erlauben
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https

3.2 Ports blockieren (DENY)

# Port blockieren (Paket wird stillschweigend verworfen)
sudo ufw deny 23/tcp

# Port ablehnen mit Antwort (REJECT  Absender wird informiert)
sudo ufw reject 23/tcp
Aktion Verhalten Verwendung
deny Paket wird stillschweigend verworfen Standard Angreifer erhält keine Information
reject Paket wird mit ICMP-Antwort abgelehnt Für interne Netzwerke, schnellere Timeout-Erkennung

3.3 Regeln entfernen

# Methode 1: Regel exakt angeben
sudo ufw delete allow 80/tcp

# Methode 2: Nach Regelnummer (empfohlen)
sudo ufw status numbered
# Ausgabe:
# [1] 22/tcp    ALLOW IN    Anywhere
# [2] 80/tcp    ALLOW IN    Anywhere
# [3] 443/tcp   ALLOW IN    Anywhere

sudo ufw delete 2
# Entfernt Regel [2] (Port 80/tcp)

Hinweis: Nach dem Löschen einer Regel verschieben sich die Nummern. Bei mehreren Löschungen immer von der höchsten Nummer beginnen oder jeweils status numbered neu prüfen.

3.4 Regeln einfügen (an bestimmter Position)

# Regel an Position 1 einfügen (wird als Erstes ausgewertet)
sudo ufw insert 1 deny from 203.0.113.50

3.5 UFW deaktivieren und zurücksetzen

# Deaktivieren (Regeln bleiben erhalten)
sudo ufw disable

# Vollständig zurücksetzen (alle Regeln werden gelöscht!)
sudo ufw reset

4. Erweiterte Regeln

4.1 IP-basierte Regeln

# Bestimmte IP erlauben
sudo ufw allow from 192.168.1.100

# Bestimmte IP auf bestimmtem Port erlauben
sudo ufw allow from 192.168.1.100 to any port 22

# Subnetz erlauben
sudo ufw allow from 192.168.1.0/24

# Subnetz auf bestimmtem Port erlauben
sudo ufw allow from 10.0.0.0/8 to any port 5432 proto tcp

# Bestimmte IP blockieren
sudo ufw deny from 203.0.113.50

# Bestimmte IP ablehnen
sudo ufw reject from 203.0.113.50

4.2 Interface-basierte Regeln

Bei Servern mit mehreren Netzwerkschnittstellen:

# Nur auf einem bestimmten Interface erlauben
sudo ufw allow in on eth0 to any port 80
sudo ufw allow in on eth1 to any port 5432

# Loopback-Interface (für lokale Dienste)
sudo ufw allow in on lo

4.3 Richtungsspezifische Regeln

# Eingehend erlauben
sudo ufw allow in on eth0 to any port 443

# Ausgehend blockieren (z. B. bestimmten ausgehenden Port sperren)
sudo ufw deny out to any port 25

4.4 Protokoll-spezifische Regeln

# Nur TCP
sudo ufw allow proto tcp from any to any port 80

# Nur UDP
sudo ufw allow proto udp from any to any port 53

# ICMP (Ping)  wird über /etc/ufw/before.rules gesteuert
# Siehe Abschnitt 14.3

4.5 Zusammengesetzte Regeln (Vollständige Syntax)

Die vollständige Syntax erlaubt präzise Regeln:

sudo ufw allow proto tcp from 192.168.1.0/24 to 192.168.1.100 port 5432
#             │          │                     │                │
#             Protokoll  Quell-Netzwerk        Ziel-IP          Ziel-Port

Weitere Beispiele:

# PostgreSQL nur aus dem lokalen Netz
sudo ufw allow proto tcp from 192.168.1.0/24 to any port 5432

# HTTP/HTTPS von überall
sudo ufw allow proto tcp from any to any port 80,443

# DNS (TCP und UDP)
sudo ufw allow proto tcp from any to any port 53
sudo ufw allow proto udp from any to any port 53

4.6 Multiport-Regeln

# Mehrere Ports in einer Regel (durch Komma getrennt)
sudo ufw allow proto tcp from any to any port 80,443,8080

# Port-Bereich
sudo ufw allow 6000:6100/tcp

5. Anwendungsprofile

5.1 Was sind Anwendungsprofile?

UFW kann mit Anwendungsprofilen arbeiten, die vordefinierte Port-Konfigurationen enthalten. Anwendungen registrieren ihre Profile in /etc/ufw/applications.d/.

5.2 Verfügbare Profile anzeigen

# Alle Profile auflisten
sudo ufw app list

# Typische Ausgabe:
# Available applications:
#   Nginx Full
#   Nginx HTTP
#   Nginx HTTPS
#   OpenSSH

5.3 Profildetails anzeigen

sudo ufw app info "Nginx Full"
# Ausgabe:
# Profile: Nginx Full
# Title: Web Server (Nginx, HTTP + HTTPS)
# Description: Small, but very powerful and efficient web server
#
# Ports:
#   80,443/tcp

5.4 Profil verwenden

# Profil erlauben
sudo ufw allow "Nginx Full"
sudo ufw allow "OpenSSH"

# Profil blockieren
sudo ufw deny "Nginx HTTP"

# Profil-Regel entfernen
sudo ufw delete allow "Nginx Full"

5.5 Eigene Profile erstellen

Profile für benutzerdefinierte Dienste erstellen:

sudo nano /etc/ufw/applications.d/gitea
[Gitea]
title=Gitea Git Server
description=Selbst gehostete Git-Plattform
ports=3000/tcp

[Gitea SSH]
title=Gitea SSH
description=Git SSH-Zugang
ports=22/tcp
sudo nano /etc/ufw/applications.d/vaultwarden
[Vaultwarden]
title=Vaultwarden Password Manager
description=Selbst gehosteter Bitwarden-kompatibler Server
ports=8080/tcp

[Vaultwarden WebSocket]
title=Vaultwarden WebSocket
description=Vaultwarden Live-Sync
ports=3012/tcp
sudo nano /etc/ufw/applications.d/wikijs
[Wiki.js]
title=Wiki.js
description=Modernes Wiki-System
ports=3000/tcp
# Profile neu laden
sudo ufw app update Gitea
sudo ufw app update Vaultwarden

# Profil verwenden
sudo ufw allow Gitea

6. Regelkonfiguration für unsere Dienste

6.1 Übersicht aller Dienste und Ports

Dienst Port Protokoll Zugriff Regel nötig?
SSH 22 TCP Eingeschränkt (Admin-IPs oder VPN) Ja
HTTP 80 TCP Öffentlich (Redirect auf HTTPS) Ja
HTTPS 443 TCP Öffentlich Ja
Gitea 3000 TCP Nur lokal (hinter Reverse Proxy) Nein (Standard: deny)
Vaultwarden 8080 TCP Nur lokal (hinter Reverse Proxy) Nein (Standard: deny)
Vaultwarden WS 3012 TCP Nur lokal (hinter Reverse Proxy) Nein (Standard: deny)
Wiki.js 3000 TCP Nur lokal (hinter Reverse Proxy) Nein (Standard: deny)
PostgreSQL 5432 TCP Nur lokal (localhost) Nein (Standard: deny)
n8n 5678 TCP Nur lokal (hinter Reverse Proxy) Nein (Standard: deny)

Prinzip: Nur die Ports öffnen, die tatsächlich von außen erreichbar sein müssen. Dienste hinter dem Reverse Proxy (Nginx/Caddy) werden nicht direkt exponiert.

6.2 Empfohlene Firewall-Regeln

# ============================================================
# UFW-Regeln für diesen Server
# ============================================================

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

# 2. SSH  Zugang für Administration
sudo ufw limit ssh
# Oder eingeschränkt auf bestimmte IPs:
# sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp
# sudo ufw allow from 10.8.0.0/24 to any port 22 proto tcp  # VPN

# 3. HTTP und HTTPS  Öffentlicher Webzugang
sudo ufw allow http
sudo ufw allow https

# 4. Aktivieren
sudo ufw enable

Das ist alles. Dienste wie Gitea, Vaultwarden, Wiki.js und PostgreSQL lauschen nur auf 127.0.0.1 und sind hinter dem Reverse Proxy geschützt. Für sie werden keine UFW-Regeln benötigt.

6.3 Optionale zusätzliche Regeln

# PostgreSQL aus dem internen Netz (falls nötig)
sudo ufw allow from 192.168.1.0/24 to any port 5432 proto tcp

# Monitoring (z. B. Prometheus Node Exporter)
sudo ufw allow from 192.168.1.50 to any port 9100 proto tcp

# E-Mail-Versand (SMTP ausgehend  ist standardmäßig erlaubt)
# Falls ausgehend blockiert ist:
# sudo ufw allow out 587/tcp

6.4 Regeln anzeigen und prüfen

sudo ufw status numbered verbose

Erwartete Ausgabe:

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)

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

7. Logging und Überwachung

7.1 Logging aktivieren

# Logging-Level setzen
sudo ufw logging on         # Standard (low)
sudo ufw logging low        # Blockierte Pakete
sudo ufw logging medium     # Blockierte + nicht zugeordnete Pakete
sudo ufw logging high       # Alle Pakete (Vorsicht: große Logdateien!)
sudo ufw logging full       # Maximal (nur für Debugging)

# Logging deaktivieren
sudo ufw logging off
Level Was wird geloggt Logvolumen
off Nichts Keins
low Blockierte Pakete, die einer Regel entsprechen Niedrig
medium Blockierte + ungültige + neue Verbindungen Mittel
high Alle Pakete (mit und ohne Rate Limiting) Hoch
full Wie high, ohne Rate Limiting Sehr hoch

Empfehlung: low für den Produktivbetrieb. medium oder high nur temporär zur Diagnose.

7.2 Logdateien lesen

UFW schreibt in die Kernel-Log-Datei:

# UFW-Einträge anzeigen
sudo grep "UFW" /var/log/kern.log | tail -30

# Oder über den Syslog
sudo grep "UFW" /var/log/syslog | tail -30

# Live-Überwachung
sudo tail -f /var/log/kern.log | grep "UFW"

# Nur blockierte Pakete
sudo grep "UFW BLOCK" /var/log/kern.log | tail -20

# Nur erlaubte Pakete (bei medium+ Logging)
sudo grep "UFW ALLOW" /var/log/kern.log | tail -20

7.3 Log-Einträge verstehen

Beispiel eines blockierten Pakets:

Feb 24 14:32:15 server kernel: [UFW BLOCK] IN=eth0 OUT= MAC=... SRC=203.0.113.50 DST=192.168.1.100 LEN=44 TOS=0x00 PREC=0x00 TTL=54 ID=12345 PROTO=TCP SPT=54321 DPT=5432 WINDOW=1024 RES=0x00 SYN URGP=0
Feld Bedeutung Beispielwert
UFW BLOCK Aktion (BLOCK, ALLOW, AUDIT) Paket wurde blockiert
IN=eth0 Eingehendes Interface eth0
SRC= Quell-IP-Adresse 203.0.113.50
DST= Ziel-IP-Adresse 192.168.1.100
PROTO= Protokoll TCP
SPT= Quell-Port 54321
DPT= Ziel-Port 5432 (PostgreSQL!)
SYN TCP-Flag Verbindungsaufbau

In diesem Beispiel hat jemand von IP 203.0.113.50 versucht, direkt auf PostgreSQL (Port 5432) zuzugreifen, und die Firewall hat den Zugriff blockiert.

7.4 Angriffsanalyse-Befehle

# Top 10 der am häufigsten angegriffenen Ports
sudo grep "UFW BLOCK" /var/log/kern.log | \
  grep -oP "DPT=\K[0-9]+" | \
  sort | uniq -c | sort -rn | head -10

# Top 10 der blockierten Quell-IPs
sudo grep "UFW BLOCK" /var/log/kern.log | \
  grep -oP "SRC=\K[0-9.]+" | \
  sort | uniq -c | sort -rn | head -10

# Blockierte Pakete der letzten 24 Stunden zählen
sudo grep "UFW BLOCK" /var/log/kern.log | \
  grep "$(date +%b\ %d)" | wc -l

7.5 Eigene UFW-Logdatei einrichten

Um UFW-Logs von den Kernel-Logs zu trennen:

sudo nano /etc/rsyslog.d/20-ufw.conf
:msg,contains,"[UFW " /var/log/ufw.log
& stop
sudo systemctl restart rsyslog

Logrotation für die neue Datei:

sudo nano /etc/logrotate.d/ufw
/var/log/ufw.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    postrotate
        /usr/sbin/invoke-rc.d rsyslog rotate > /dev/null 2>&1 || true
    endscript
}

8. IPv6-Konfiguration

8.1 IPv6-Unterstützung prüfen und aktivieren

sudo nano /etc/default/ufw
# IPv6-Unterstützung (Standard: yes)
IPV6=yes
sudo ufw disable && sudo ufw enable

8.2 IPv6-Regeln

UFW erstellt automatisch IPv6-Regeln parallel zu IPv4-Regeln:

# Diese Regel erstellt sowohl IPv4- als auch IPv6-Einträge
sudo ufw allow 80/tcp

# Ergebnis in 'ufw status':
# 80/tcp        ALLOW IN    Anywhere
# 80/tcp (v6)   ALLOW IN    Anywhere (v6)

Nur IPv6-spezifische Regeln:

# Bestimmte IPv6-Adresse erlauben
sudo ufw allow from 2001:db8::/32 to any port 22

# IPv6-Adresse blockieren
sudo ufw deny from 2001:db8::1

8.3 IPv6 deaktivieren (falls nicht benötigt)

Falls der Server kein IPv6 verwendet:

# In /etc/default/ufw
IPV6=no
sudo ufw disable && sudo ufw enable

9. Rate Limiting Brute-Force-Schutz

9.1 Was ist Rate Limiting?

UFW bietet eingebautes Rate Limiting: Wenn eine IP-Adresse innerhalb von 30 Sekunden mehr als 6 Verbindungsversuche startet, wird sie temporär blockiert.

9.2 Rate Limiting aktivieren

# SSH mit Rate Limiting schützen
sudo ufw limit ssh

# Oder mit benutzerdefiniertem Port
sudo ufw limit 2222/tcp

# Rate Limiting mit Protokoll
sudo ufw limit proto tcp from any to any port 22

9.3 Rate Limiting vs. Fail2Ban

Eigenschaft UFW Rate Limiting Fail2Ban
Konfigurierbarkeit Fest (6 Versuche / 30 Sek.) Frei konfigurierbar
Sperrzeit Automatisch (Minuten) Konfigurierbar (Stunden/Tage)
Log-Analyse Nein (Paketebene) Ja (analysiert Logdateien)
Anwendungsspezifisch Nur Ports Alle Dienste (SSH, Gitea, Vaultwarden)
Ressourcenverbrauch Minimal Gering

Empfehlung: Beide zusammen verwenden. UFW Rate Limiting als erste Verteidigungslinie auf Paketebene, Fail2Ban als intelligentere zweite Stufe, die Anmeldeversuche auf Anwendungsebene analysiert.

9.4 Bestehende Allow-Regel durch Limit ersetzen

# Alte Regel entfernen
sudo ufw delete allow ssh

# Neue Regel mit Rate Limiting
sudo ufw limit ssh

10. Port-Weiterleitung und NAT

10.1 IP-Forwarding aktivieren

Für Port-Weiterleitung muss IP-Forwarding im Kernel aktiv sein:

sudo nano /etc/ufw/sysctl.conf
# IPv4-Forwarding aktivieren
net/ipv4/ip_forward=1

# IPv6-Forwarding (falls benötigt)
# net/ipv6/conf/default/forwarding=1

10.2 UFW für Forwarding konfigurieren

sudo nano /etc/default/ufw
# Standardrichtlinie für weitergeleiteten Verkehr
DEFAULT_FORWARD_POLICY="DROP"
# Auf "ACCEPT" setzen, falls dieser Server als Router dient

10.3 Port-Weiterleitung über before.rules

Für NAT und Port-Weiterleitung müssen die Regeln direkt in /etc/ufw/before.rules eingetragen werden:

sudo nano /etc/ufw/before.rules

Vor der Zeile *filter folgendes einfügen:

# NAT-Tabelle für Port-Weiterleitung
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

# Port 8443 von außen → Port 443 auf internem Server
-A PREROUTING -i eth0 -p tcp --dport 8443 -j DNAT --to-destination 192.168.1.50:443

# Masquerading für weitergeleiteten Verkehr
-A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

COMMIT
# Weitergeleiteten Verkehr in der UFW erlauben
sudo ufw route allow proto tcp from any to 192.168.1.50 port 443

# Änderungen anwenden
sudo ufw disable && sudo ufw enable

10.4 Routed-Regeln (für VPN, Container)

# Verkehr zwischen Interfaces erlauben (z. B. VPN → LAN)
sudo ufw route allow in on tun0 out on eth0

# Verkehr aus einem Docker-Netzwerk erlauben
sudo ufw route allow in on docker0 out on eth0

# Bestimmten weitergeleiteten Port erlauben
sudo ufw route allow proto tcp from any to any port 80

11. UFW und Docker

11.1 Das Docker-UFW-Problem

Docker manipuliert iptables-Regeln direkt und umgeht dabei UFW. Das bedeutet, dass ein Docker-Container mit -p 5432:5432 auch dann von außen erreichbar ist, wenn UFW Port 5432 blockiert.

11.2 Lösung: Ports nur auf localhost binden (empfohlen)

Die einfachste und sicherste Lösung:

# docker-compose.yml
services:
  vaultwarden:
    ports:
      # ✅ RICHTIG: Nur lokal erreichbar
      - "127.0.0.1:8080:80"

      # ❌ FALSCH: Von überall erreichbar (umgeht UFW!)
      # - "8080:80"

11.3 Alternative: Docker-iptables deaktivieren

Docker so konfigurieren, dass es die iptables-Regeln nicht manipuliert:

sudo nano /etc/docker/daemon.json
{
  "iptables": false
}
sudo systemctl restart docker

Warnung: Mit "iptables": false funktionieren Docker-Netzwerke nicht mehr automatisch. Container können sich nicht mehr untereinander oder mit dem Internet verbinden, ohne manuelle Regeln. Diese Option nur verwenden, wenn man die Netzwerk-Konfiguration vollständig selbst verwalten möchte.

11.4 Empfohlene Praxis für diesen Server

Dienst Port-Binding Erklärung
Vaultwarden 127.0.0.1:8080:80 Nur über Reverse Proxy
Vaultwarden WS 127.0.0.1:3012:3012 Nur über Reverse Proxy
n8n (falls Docker) 127.0.0.1:5678:5678 Nur über Reverse Proxy

So sind die Dienste nur lokal erreichbar, und der Reverse Proxy (Nginx/Caddy) stellt den öffentlichen HTTPS-Zugang bereit.


12. Regelreihenfolge und Priorität

12.1 Wie UFW Regeln auswertet

UFW wertet Regeln von oben nach unten aus. Die erste zutreffende Regel wird angewendet, alle weiteren ignoriert.

Eingehendes Paket
       │
       ▼
  Regel 1 ──▶ Trifft zu? → Aktion ausführen (STOP)
       │ Nein
       ▼
  Regel 2 ──▶ Trifft zu? → Aktion ausführen (STOP)
       │ Nein
       ▼
     ...
       │ Nein
       ▼
  Standardrichtlinie ──▶ deny incoming (Paket verworfen)

12.2 Reihenfolge ist wichtig Beispiel

# ❌ FALSCH: Die Allow-Regel kommt zuerst → IP wird NICHT blockiert
sudo ufw allow 80/tcp                    # Regel [1]
sudo ufw deny from 203.0.113.50          # Regel [2]  wird nie erreicht für Port 80

# ✅ RICHTIG: Die Deny-Regel muss VOR der Allow-Regel stehen
sudo ufw insert 1 deny from 203.0.113.50 # Regel [1]  wird zuerst geprüft
sudo ufw allow 80/tcp                    # Regel [2]

12.3 Verarbeitungsreihenfolge im Detail

UFW verarbeitet Regeln in dieser Reihenfolge:

  1. /etc/ufw/before.rules Regeln vor den Benutzerregeln (z. B. ICMP, Loopback)
  2. Benutzerregeln Die mit ufw allow/deny erstellten Regeln (in user.rules)
  3. /etc/ufw/after.rules Regeln nach den Benutzerregeln
  4. Standardrichtlinie deny incoming / allow outgoing

13. Backup und Wiederherstellung

13.1 Konfigurationsdateien sichern

# Vollständiges Backup der UFW-Konfiguration
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
sudo mkdir -p /backup/ufw

sudo tar -czf "/backup/ufw/ufw_backup_${TIMESTAMP}.tar.gz" \
  /etc/ufw/ /etc/default/ufw

echo "Backup erstellt: /backup/ufw/ufw_backup_${TIMESTAMP}.tar.gz"

13.2 Regeln als reproduzierbares Skript pflegen

Die beste Methode ist, die Regeln als Skript zu dokumentieren:

sudo nano /opt/scripts/ufw-setup.sh
#!/bin/bash
# ===========================================================
# UFW-Firewall-Setup für unseren Server
# Zuletzt aktualisiert: DATUM
# ===========================================================

set -e

echo "UFW wird konfiguriert..."

# Zurücksetzen
sudo ufw --force reset

# Standardrichtlinien
sudo ufw default deny incoming
sudo ufw default allow outgoing

# SSH mit Rate Limiting
sudo ufw limit ssh

# Web (HTTP + HTTPS)
sudo ufw allow http
sudo ufw allow https

# Logging
sudo ufw logging on

# Aktivieren
sudo ufw --force enable

echo "UFW-Konfiguration abgeschlossen:"
sudo ufw status verbose
sudo chmod +x /opt/scripts/ufw-setup.sh

13.3 Wiederherstellung

# Aus dem Archiv wiederherstellen
sudo ufw disable
sudo tar -xzf /backup/ufw/ufw_backup_YYYYMMDD.tar.gz -C /
sudo ufw enable
sudo ufw status verbose

# Oder: Skript erneut ausführen
sudo /opt/scripts/ufw-setup.sh

13.4 Regeln auf einen neuen Server übertragen

# Auf dem alten Server
scp /etc/ufw/user.rules benutzer@neuer-server:/tmp/
scp /etc/ufw/user6.rules benutzer@neuer-server:/tmp/

# Auf dem neuen Server
sudo cp /tmp/user.rules /etc/ufw/
sudo cp /tmp/user6.rules /etc/ufw/
sudo ufw disable && sudo ufw enable

14. Sicherheitshärtung

14.1 Checkliste

  • Standardrichtlinie: deny incoming, allow outgoing
  • SSH erlaubt (bevor UFW aktiviert wird)
  • Nur benötigte Ports geöffnet (22, 80, 443)
  • Docker-Ports nur auf localhost gebunden
  • Rate Limiting auf SSH aktiviert
  • Fail2Ban zusätzlich installiert
  • Logging auf low aktiviert
  • IPv6 konfiguriert oder deaktiviert
  • ICMP-Regeln geprüft
  • Regelmäßige Überprüfung der aktiven Regeln
  • Backup der Firewall-Konfiguration vorhanden
  • Keine überflüssigen Regeln vorhanden

14.2 Minimale Angriffsfläche prüfen

# Alle offenen Ports auf dem System anzeigen (OHNE Firewall-Sicht)
sudo ss -tlnp

# Was die Firewall durchlässt
sudo ufw status

# Offene Ports von außen testen (von einem anderen Rechner)
nmap -sT server-ip

14.3 ICMP (Ping) konfigurieren

Standardmäßig erlaubt UFW ICMP (Ping). Um Ping zu blockieren:

sudo nano /etc/ufw/before.rules

Folgende Zeilen finden und ACCEPT durch DROP ersetzen:

# Ok ICMP codes for INPUT
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j DROP
-A ufw-before-input -p icmp --icmp-type time-exceeded -j DROP
-A ufw-before-input -p icmp --icmp-type parameter-problem -j DROP
-A ufw-before-input -p icmp --icmp-type echo-request -j DROP
sudo ufw disable && sudo ufw enable

Hinweis: Das Blockieren von Ping kann die Netzwerkdiagnose erschweren. In den meisten Fällen ist es sinnvoller, Ping zu erlauben.

14.4 Kernel-Netzwerkparameter härten

sudo nano /etc/ufw/sysctl.conf
# Schutz vor IP-Spoofing
net/ipv4/conf/all/rp_filter=1
net/ipv4/conf/default/rp_filter=1

# ICMP-Redirects ignorieren
net/ipv4/conf/all/accept_redirects=0
net/ipv4/conf/default/accept_redirects=0

# Source-Routing deaktivieren
net/ipv4/conf/all/accept_source_route=0
net/ipv4/conf/default/accept_source_route=0

# SYN-Flood-Schutz
net/ipv4/tcp_syncookies=1

# Broadcast-Ping ignorieren (Smurf-Schutz)
net/ipv4/icmp_echo_ignore_broadcasts=1

# Log Martians (ungültige Quelladressen loggen)
net/ipv4/conf/all/log_martians=1
net/ipv4/conf/default/log_martians=1
sudo ufw disable && sudo ufw enable

14.5 Regelmäßige Überprüfung (monatlich)

#!/bin/bash
# /opt/scripts/ufw-audit.sh  Monatlicher Firewall-Check

echo "=== UFW-Sicherheitsaudit $(date) ==="

echo -e "\n--- Aktive Regeln ---"
sudo ufw status numbered verbose

echo -e "\n--- Offene Ports auf dem System ---"
sudo ss -tlnp | grep -v "127.0.0" | grep LISTEN

echo -e "\n--- Blockierte Pakete (letzte 24h) ---"
BLOCKED=$(sudo grep "UFW BLOCK" /var/log/kern.log 2>/dev/null | \
  grep "$(date +%b\ %d)" | wc -l)
echo "Blockierte Pakete heute: $BLOCKED"

echo -e "\n--- Top 5 Angreifer-IPs ---"
sudo grep "UFW BLOCK" /var/log/kern.log 2>/dev/null | \
  grep "$(date +%b\ %d)" | \
  grep -oP "SRC=\K[0-9.]+" | \
  sort | uniq -c | sort -rn | head -5

echo -e "\n--- Top 5 angegriffene Ports ---"
sudo grep "UFW BLOCK" /var/log/kern.log 2>/dev/null | \
  grep "$(date +%b\ %d)" | \
  grep -oP "DPT=\K[0-9]+" | \
  sort | uniq -c | sort -rn | head -5

echo -e "\n=== Audit abgeschlossen ==="
sudo chmod +x /opt/scripts/ufw-audit.sh

15. Fehlerbehebung

15.1 UFW lässt sich nicht aktivieren

# Fehlermeldung: "ERROR: problem running ufw-init"

# 1. iptables-Module prüfen und laden
sudo modprobe ip_tables
sudo modprobe ip6_tables
sudo modprobe nf_conntrack

# 2. iptables/nftables prüfen
sudo iptables -L -n
sudo nft list ruleset

# 3. UFW erneut versuchen
sudo ufw enable

15.2 Dienst ist trotz Allow-Regel nicht erreichbar

# 1. Läuft der Dienst?
sudo systemctl status nginx
sudo ss -tlnp | grep :80

# 2. Auf welcher Adresse lauscht der Dienst?
sudo ss -tlnp | grep :80
# "127.0.0.1:80" → Nur lokal erreichbar (Problem!)
# "0.0.0.0:80" → Von überall erreichbar ✅

# 3. Firewall-Regel vorhanden?
sudo ufw status | grep 80

# 4. Wird der Verkehr blockiert?
sudo grep "UFW BLOCK.*DPT=80" /var/log/kern.log | tail -5

# 5. Von außen testen
nmap -p 80 server-ip

15.3 Dienst ist trotz Deny erreichbar

# Häufigste Ursache: Docker umgeht UFW

# Docker iptables-Regeln prüfen
sudo iptables -L DOCKER -n -v 2>/dev/null

# Port-Binding prüfen
sudo ss -tlnp | grep :PORTNUMMER
# Falls "0.0.0.0:PORT" → Docker bindet auf allen Interfaces

# Lösung: Port nur auf localhost binden (siehe Abschnitt 11)

15.4 SSH-Verbindung nach UFW-Aktivierung verloren

Falls der Zugriff gesperrt ist:

  1. Konsole/KVM/IPMI verwenden (physischer oder virtueller Zugang)
  2. Am Server anmelden und UFW deaktivieren:
sudo ufw disable
sudo ufw allow ssh
sudo ufw enable

Falls keine Konsole verfügbar ist:

  • Recovery-Modus des Hosters nutzen
  • Festplatte in ein Rettungssystem mounten
  • /etc/ufw/user.rules bearbeiten oder UFW deaktivieren über /etc/ufw/ufw.conf:
# In /etc/ufw/ufw.conf
ENABLED=no

15.5 Regelkonflikte erkennen

# Alle Regeln mit Nummern anzeigen
sudo ufw status numbered

# Typischer Konflikt:
# [1] DENY IN    203.0.113.0/24       → Blockt das gesamte Subnetz
# [2] ALLOW IN   203.0.113.50 port 22 → Wird NICHT erreicht!

# Lösung: Spezifische Allow-Regel VOR die Deny-Regel setzen
sudo ufw insert 1 allow from 203.0.113.50 to any port 22

15.6 UFW nach Kernel-Update reparieren

# Kernel-Module neu laden
sudo modprobe ip_tables
sudo modprobe ip6_tables
sudo modprobe nf_conntrack

# UFW neu starten
sudo ufw disable
sudo ufw enable

16. Schnellreferenz Befehle auf einen Blick

Grundbefehle

sudo ufw enable                      # Aktivieren
sudo ufw disable                     # Deaktivieren
sudo ufw reset                       # Alle Regeln löschen
sudo ufw reload                      # Regeln neu laden
sudo ufw status                      # Status anzeigen
sudo ufw status numbered             # Mit Regelnummern
sudo ufw status verbose              # Ausführlich

Regeln verwalten

# Erlauben
sudo ufw allow 80/tcp                # Port
sudo ufw allow ssh                   # Dienst
sudo ufw allow from 192.168.1.0/24   # Subnetz
sudo ufw allow from 10.0.0.1 to any port 22  # IP + Port
sudo ufw allow "Nginx Full"          # Anwendungsprofil

# Blockieren
sudo ufw deny 23/tcp                 # Port
sudo ufw deny from 203.0.113.50      # IP

# Rate Limiting
sudo ufw limit ssh                   # Brute-Force-Schutz

# Entfernen
sudo ufw delete allow 80/tcp         # Nach Regel
sudo ufw delete 3                    # Nach Nummer

# Einfügen
sudo ufw insert 1 deny from 1.2.3.4 # An Position 1

Standardrichtlinien

sudo ufw default deny incoming       # Eingehend blockieren
sudo ufw default allow outgoing      # Ausgehend erlauben
sudo ufw default deny routed         # Weiterleitung blockieren

Logging und Analyse

sudo ufw logging on                  # Aktivieren (low)
sudo ufw logging medium              # Detaillierter

# Logs lesen
sudo grep "UFW BLOCK" /var/log/kern.log | tail -20
sudo tail -f /var/log/kern.log | grep "UFW"

# Top-Angreifer
sudo grep "UFW BLOCK" /var/log/kern.log | grep -oP "SRC=\K[0-9.]+" | sort | uniq -c | sort -rn | head -10

Anwendungsprofile

sudo ufw app list                    # Alle Profile
sudo ufw app info "Nginx Full"       # Profildetails
sudo ufw allow "OpenSSH"             # Profil verwenden

Empfohlenes Regelset für diesen Server

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw limit ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw logging on
sudo ufw enable

Wichtige Dateipfade

/etc/ufw/
├── before.rules          # Regeln vor Benutzerregeln (ICMP, Loopback, NAT)
├── after.rules           # Regeln nach Benutzerregeln
├── before6.rules         # IPv6-Regeln vor Benutzerregeln
├── after6.rules          # IPv6-Regeln nach Benutzerregeln
├── user.rules            # Benutzerregeln (IPv4)  von ufw verwaltet
├── user6.rules           # Benutzerregeln (IPv6)  von ufw verwaltet
├── ufw.conf              # UFW-Aktivierungsstatus
├── sysctl.conf           # Kernel-Netzwerkparameter
└── applications.d/       # Anwendungsprofile
    ├── openssh-server
    └── nginx

/etc/default/ufw          # Grundeinstellungen (IPv6, Policy, Module)
/var/log/kern.log          # Firewall-Logs (UFW BLOCK/ALLOW)
/var/log/ufw.log           # Eigene Logdatei (falls konfiguriert)

Letzte Aktualisierung: 24.02.2026 Autor: Administrator Version: 1.0