Files
WikiJS/IT_Abteilung/Security/UFW.md

21 KiB
Raw Blame History

title, description, published, date, tags, editor, dateCreated
title description published date tags editor dateCreated
UFW server firewall Profice true 2026-02-24T08:54:57.458Z 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: Netzwerk-Absicherung, Portfilterung, Zugriffskontrolle für alle Server-Dienste


Inhaltsverzeichnis

  1. Überblick und Funktionsweise
  2. Installation und Ersteinrichtung
  3. Grundlegende Regelverwaltung
  4. Erweiterte Regeln
  5. Anwendungsprofile
  6. Regeln für unsere Server-Dienste
  7. Rate Limiting Verbindungsbegrenzung
  8. Logging und Überwachung
  9. IPv6-Konfiguration
  10. Erweiterte Konfiguration (ufw-Dateien)
  11. Port-Weiterleitung und NAT
  12. Docker und UFW
  13. Fehlerbehebung
  14. Best Practices und Sicherheitshärtung
  15. Schnellreferenz Befehle auf einen Blick

1. Überblick und Funktionsweise

Was ist UFW?

UFW (Uncomplicated Firewall) ist ein benutzerfreundliches Frontend für den Linux-Paketfilter iptables (bzw. nftables auf neueren Systemen). Es vereinfacht die Verwaltung von Firewall-Regeln erheblich, ohne auf die Flexibilität von iptables 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 auch Dienste, die nur lokal benötigt werden.

Ohne Firewall Mit UFW
Alle Ports offen Nur erlaubte Ports offen
PostgreSQL (5432) aus dem Internet erreichbar PostgreSQL nur lokal erreichbar
Jeder Dienst ist ein Angriffsziel Angriffsfläche minimiert
Kein Schutz vor Port-Scans Port-Scans sehen nur erlaubte Dienste

Wie funktioniert UFW?

@startuml

skinparam shadowing false
skinparam roundCorner 10

actor "Internet\n(Anfragen)" as inet

package "Debian Server" {

    [UFW Firewall\n(Paketfilter)] as ufw

    package "Erlaubt" {
        [Port 22  SSH] as ssh
        [Port 80  HTTP] as http
        [Port 443  HTTPS] as https
    }

    package "Blockiert" {
        [Port 5432  PostgreSQL] as pg
        [Port 3000  Gitea intern] as gitea
        [Port 8080  Vaultwarden intern] as vw
    }
}

inet --> ufw
ufw --> ssh : Durchgelassen
ufw --> http : Durchgelassen
ufw --> https : Durchgelassen
ufw -[hidden]-> pg
ufw -[hidden]-> gitea
ufw -[hidden]-> vw

@enduml

Prinzip: UFW prüft jedes eingehende und ausgehende Netzwerkpaket anhand der definierten Regeln. Pakete, die keiner Regel entsprechen, werden gemäß der Standardrichtlinie (Default Policy) behandelt in der Regel verworfen.

Regelverarbeitung

UFW verarbeitet Regeln in der Reihenfolge ihrer Erstellung (von oben nach unten). Die erste zutreffende Regel entscheidet:

  1. Paket kommt an → UFW prüft Regel 1
  2. Trifft Regel 1 zu? → Aktion ausführen (allow/deny), fertig
  3. Trifft nicht zu? → Nächste Regel prüfen
  4. Keine Regel trifft zu → Default Policy anwenden (deny)

Begriffe

Begriff Beschreibung
Eingehend (incoming) Pakete, die von außen zum Server kommen
Ausgehend (outgoing) Pakete, die vom Server nach außen gehen
Allow Verbindung erlauben
Deny Verbindung still verwerfen (kein Feedback)
Reject Verbindung ablehnen (mit Fehlermeldung)
Limit Verbindung erlauben, aber Rate begrenzen
Default Policy Standardverhalten für nicht-geregelte Pakete

2. Installation und Ersteinrichtung

2.1 UFW installieren

sudo apt update
sudo apt install -y ufw

2.2 Aktuellen Status prüfen

sudo ufw status
# Ausgabe: Status: inactive

2.3 Standardrichtlinien setzen (Default Policies)

Bevor die Firewall aktiviert wird, müssen die Standardrichtlinien festgelegt werden:

# Eingehend: ALLES blockieren (Standard)
sudo ufw default deny incoming

# Ausgehend: ALLES erlauben (Standard)
sudo ufw default allow outgoing

Erklärung: Mit diesen Einstellungen wird jeder eingehende Verkehr blockiert, es sei denn, eine explizite Regel erlaubt ihn. Ausgehender Verkehr (Updates, DNS, E-Mail-Versand) bleibt erlaubt.

2.4 SSH erlauben (KRITISCH vor dem Aktivieren!)

# SSH MUSS erlaubt werden, bevor UFW aktiviert wird!
# Sonst sperrt man sich vom Server aus.
sudo ufw allow ssh

Falls SSH auf einem anderen Port läuft:

sudo ufw allow 2222/tcp

2.5 UFW aktivieren

sudo ufw enable

Ausgabe:

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

Warnung: UFW NUR aktivieren, nachdem SSH erlaubt wurde. Bei einer Remote-Verbindung (SSH) ohne SSH-Regel ist der Server nicht mehr erreichbar. In diesem Fall hilft nur noch physischer Zugang oder eine Konsole (KVM/IPMI).

2.6 Status nach Aktivierung prüfen

sudo 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
22/tcp (v6)                ALLOW IN    Anywhere (v6)

2.7 UFW beim Systemstart

UFW startet nach der Aktivierung automatisch beim Booten. Dies wird über den Dienst gesteuert:

# Status prüfen
sudo systemctl status ufw

# Autostart prüfen
sudo systemctl is-enabled ufw
# Ausgabe: enabled

3. Grundlegende Regelverwaltung

3.1 Port erlauben

# 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:6010/tcp

3.2 Port blockieren

# Port blockieren (still, ohne Antwort)
sudo ufw deny 3306

# Port ablehnen (mit ICMP-Fehlermeldung)
sudo ufw reject 3306
Aktion Verhalten Empfehlung
deny Paket wird still verworfen, Absender erhält keine Antwort Empfohlen gibt Angreifern keine Information
reject Paket wird abgelehnt, Absender erhält eine Fehlermeldung Nur für interne Netzwerke hilft beim Debugging

3.3 Dienste nach Name erlauben

UFW kennt viele Dienstnamen aus /etc/services:

sudo ufw allow ssh          # Port 22
sudo ufw allow http         # Port 80
sudo ufw allow https        # Port 443
sudo ufw allow 'DNS'        # Port 53

Verfügbare Dienstnamen anzeigen:

less /etc/services

3.4 Regeln anzeigen

# Kompakte Ansicht
sudo ufw status

# Ausführliche Ansicht
sudo ufw status verbose

# Mit Regelnummern (wichtig zum Löschen)
sudo ufw status numbered

Beispielausgabe mit Nummern:

Status: active

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

3.5 Regeln löschen

# Methode 1: Nach Regelnummer löschen (empfohlen)
sudo ufw status numbered
sudo ufw delete 3

# Methode 2: Regel exakt wiederholen mit 'delete'
sudo ufw delete allow 80/tcp
sudo ufw delete deny 3306

Hinweis: Beim Löschen nach Nummer verschieben sich die Nummern. Immer von der höchsten Nummer nach unten löschen, oder nach jeder Löschung erneut ufw status numbered ausführen.

3.6 Regeln einfügen (an bestimmter Position)

# Regel an Position 1 einfügen (wird als erstes geprüft)
sudo ufw insert 1 deny from 203.0.113.50

# Regel an Position 3 einfügen
sudo ufw insert 3 allow from 192.168.1.0/24 to any port 5432

3.7 UFW zurücksetzen

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

# Danach: Standardrichtlinien neu setzen, Regeln neu erstellen, aktivieren

3.8 UFW deaktivieren (temporär)

# Firewall deaktivieren (Regeln bleiben gespeichert)
sudo ufw disable

# Wieder aktivieren
sudo ufw enable

4. Erweiterte Regeln

4.1 Regeln nach IP-Adresse

# Bestimmte IP erlauben (alle Ports)
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

# Ganzes Subnetz erlauben
sudo ufw allow from 192.168.1.0/24

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

# Bestimmte IP blockieren
sudo ufw deny from 203.0.113.50

# Bestimmte IP komplett sperren (an erster Position!)
sudo ufw insert 1 deny from 203.0.113.50

4.2 Regeln nach Netzwerk-Interface

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

# Nur auf dem Loopback-Interface erlauben
sudo ufw allow in on lo

# Auf einem internen Interface erlauben
sudo ufw allow in on eth1 from 10.0.0.0/8 to any port 5432

4.3 Regeln nach Zieladresse

# Nur an eine bestimmte Server-IP erlauben
sudo ufw allow from 192.168.1.0/24 to 192.168.1.100 port 443 proto tcp

4.4 Ausgehende Regeln

Standardmäßig ist der ausgehende Verkehr erlaubt. Falls eine strengere Kontrolle gewünscht ist:

# Ausgehend: Standardmäßig blockieren
sudo ufw default deny outgoing

# Dann gezielt erlauben:
sudo ufw allow out 53            # DNS
sudo ufw allow out 80/tcp        # HTTP (Updates)
sudo ufw allow out 443/tcp       # HTTPS (Updates)
sudo ufw allow out 587/tcp       # SMTP (E-Mail-Versand)
sudo ufw allow out 123/udp       # NTP (Zeitsynchronisation)
sudo ufw allow out 22/tcp        # SSH ausgehend

Hinweis: Ausgehenden Verkehr zu blockieren erhöht die Sicherheit, erfordert aber eine sorgfältige Planung aller benötigten Dienste. Für die meisten Server ist default allow outgoing ausreichend.

4.5 Regelbeispiele: Kombiniert

# PostgreSQL nur aus dem internen Netz auf Interface eth1
sudo ufw allow in on eth1 from 192.168.1.0/24 to any port 5432 proto tcp

# Webserver nur über HTTPS, HTTP nur für Redirect
sudo ufw allow 443/tcp
sudo ufw allow 80/tcp

# E-Mail-Server nur von bestimmten IPs
sudo ufw allow from 10.0.0.5 to any port 25 proto tcp
sudo ufw allow from 10.0.0.6 to any port 25 proto tcp

5. Anwendungsprofile

5.1 Was sind Anwendungsprofile?

UFW kann Regeln für bekannte Anwendungen als Profile verwalten. Profile definieren Ports und Protokolle in einer benannten Konfiguration.

5.2 Verfügbare Profile anzeigen

sudo ufw app list

Typische Ausgabe auf einem Debian-Server:

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 Profile verwenden

# Anwendungsprofil erlauben
sudo ufw allow 'Nginx Full'
sudo ufw allow 'Nginx HTTPS'
sudo ufw allow 'OpenSSH'

# Anwendungsprofil blockieren
sudo ufw deny 'Nginx HTTP'

# Anwendungsprofil-Regel löschen
sudo ufw delete allow 'Nginx Full'

5.5 Eigene Profile erstellen

Profile werden als Dateien in /etc/ufw/applications.d/ gespeichert:

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

[Gitea Full]
title=Gitea Git Server (Web + SSH)
description=Gitea Webinterface und SSH-Zugang
ports=3000/tcp|22/tcp
sudo nano /etc/ufw/applications.d/vaultwarden
[Vaultwarden]
title=Vaultwarden Password Manager
description=Bitwarden-kompatibler Passwort-Server
ports=8080/tcp

[Vaultwarden Full]
title=Vaultwarden mit WebSocket
description=Vaultwarden Webinterface und WebSocket
ports=8080/tcp|3012/tcp
# Profile aktualisieren
sudo ufw app update Gitea
sudo ufw app update Vaultwarden

# Neue Profile prüfen
sudo ufw app list
sudo ufw app info 'Gitea'

Hinweis: Anwendungsprofile sind für die Dokumentation und Klarheit nützlich, stellen aber keine zusätzliche Sicherheit dar. Sie erstellen dieselben iptables-Regeln wie manuelle Port-Regeln.


6. Regeln für unsere Server-Dienste

6.1 Empfohlenes Regelwerk

Basierend auf den Diensten, die auf diesem Server laufen (SSH, Nginx als Reverse Proxy, PostgreSQL lokal, Gitea, Vaultwarden, Wiki.js, n8n), ergibt sich folgendes Regelwerk:

# ===========================================================
#  UFW-Regelwerk  Produktivserver
# ===========================================================

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

# 2. SSH (Fernzugriff)
sudo ufw limit ssh comment 'SSH - Rate Limited'

# 3. HTTP und HTTPS (Reverse Proxy  Nginx/Caddy)
sudo ufw allow 80/tcp comment 'HTTP - Redirect + Lets Encrypt'
sudo ufw allow 443/tcp comment 'HTTPS - Nginx Reverse Proxy'

# 4. UFW aktivieren
sudo ufw enable

6.2 Was wird NICHT freigegeben

Die folgenden Dienste laufen auf localhost und sind über den Reverse Proxy erreichbar. Sie benötigen keine UFW-Regel:

Dienst Interner Port Zugriff über
Gitea 127.0.0.1:3000 https://git.example.de (Nginx)
Vaultwarden 127.0.0.1:8080 https://vault.example.de (Nginx)
Vaultwarden WS 127.0.0.1:3012 https://vault.example.de (Nginx)
Wiki.js 127.0.0.1:3001 https://wiki.example.de (Nginx)
n8n 127.0.0.1:5678 https://n8n.example.de (Nginx)
PostgreSQL 127.0.0.1:5432 Nur lokal, kein externer Zugriff

Sicherheitsprinzip: Nur der Reverse Proxy (Ports 80/443) ist aus dem Internet erreichbar. Alle internen Dienste binden auf 127.0.0.1 und sind von außen unsichtbar.

6.3 Optionale Regeln

# SSH nur aus dem internen Netzwerk (höhere Sicherheit)
sudo ufw delete allow ssh
sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp comment 'SSH - Nur internes Netz'

# PostgreSQL aus dem internen Netzwerk (falls andere Server darauf zugreifen)
sudo ufw allow from 192.168.1.0/24 to any port 5432 proto tcp comment 'PostgreSQL - Internes Netz'

6.4 Regelwerk prüfen

sudo ufw status verbose

Erwartete Ausgabe:

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

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

Drei Regeln (plus IPv6-Gegenstücke) sauber und minimal.


7. Rate Limiting Verbindungsbegrenzung

7.1 Was ist Rate Limiting?

UFW kann die Anzahl der Verbindungsversuche pro IP-Adresse begrenzen. Wenn eine IP-Adresse innerhalb von 30 Sekunden mehr als 6 Verbindungsversuche auf einem Port unternimmt, wird sie temporär blockiert.

7.2 Rate Limiting aktivieren

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

# Oder für einen bestimmten Port
sudo ufw limit 2222/tcp

7.3 Rate Limiting prüfen

sudo ufw status verbose
To                         Action      From
--                         ------      ----
22/tcp                     LIMIT IN    Anywhere

7.4 Wie UFW Rate Limiting funktioniert

Die Standardwerte sind fest eingestellt:

Parameter Wert
Maximale Verbindungen 6 innerhalb von 30 Sekunden
Aktion bei Überschreitung Verbindung verwerfen (DROP)
Protokoll Gilt pro Quell-IP

Hinweis: Für feingranulares Rate Limiting (andere Schwellenwerte, andere Zeitfenster) ist Fail2Ban besser geeignet. UFW limit ist ein einfacher, effektiver Basisschutz.

7.5 Rate Limiting vs. Fail2Ban

Eigenschaft UFW limit Fail2Ban
Konfigurierbarkeit Fest (6/30s) Voll konfigurierbar
Log-basiert Nein (nur Pakete) Ja (analysiert Logdateien)
Anwendungsebene Nein Ja (erkennt fehlgeschlagene Logins)
Sperrzeit Bis Rate sinkt Konfigurierbar (Minuten bis Tage)
Empfehlung Basisschutz Ergänzend zu UFW verwenden

Empfehlung: Beide kombinieren UFW limit als erste Verteidigungslinie, Fail2Ban für anwendungsspezifischen Schutz.


8. Logging und Überwachung

8.1 Logging aktivieren

# Logging-Stufe setzen
sudo ufw logging on          # Standard (low)
sudo ufw logging low         # Blockierte Pakete loggen
sudo ufw logging medium      # + erlaubte Pakete mit Rate Limiting
sudo ufw logging high        # + alle erlaubten Pakete
sudo ufw logging full        # Maximales Logging (Performance-Auswirkung)

# Logging deaktivieren
sudo ufw logging off
Stufe Was wird geloggt Empfehlung
off Nichts Nicht empfohlen
low Blockierte Pakete Empfohlen für Produktion
medium + Rate-Limited-Pakete Zur Analyse
high + Alle erlaubten Pakete Nur temporär
full Alles Nur zum Debugging

8.2 Logdateien

UFW schreibt in die System-Logdateien:

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

# Oder über journald
sudo journalctl -k | grep UFW

# Letzte 50 blockierte Verbindungen
sudo grep "UFW BLOCK" /var/log/ufw.log | tail -50

# Letzte 50 erlaubte Verbindungen
sudo grep "UFW ALLOW" /var/log/ufw.log | tail -50

8.3 Log-Einträge lesen

Beispiel eines blockierten Pakets:

Feb 24 14:23:15 server kernel: [UFW BLOCK] IN=eth0 OUT= MAC=aa:bb:cc:dd:ee:ff
SRC=203.0.113.50 DST=192.168.1.100 LEN=44 TOS=0x00 PROTO=TCP SPT=54321 DPT=5432
Feld Bedeutung
UFW BLOCK Paket wurde blockiert
IN=eth0 Eingehendes Interface
SRC=203.0.113.50 Quell-IP-Adresse
DST=192.168.1.100 Ziel-IP-Adresse (unser Server)
PROTO=TCP Protokoll
SPT=54321 Quell-Port
DPT=5432 Ziel-Port (hier: PostgreSQL)

8.4 Häufig blockierte Verbindungen analysieren

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

# Top 20 blockierte Ziel-Ports
sudo grep "UFW BLOCK" /var/log/ufw.log | \
  grep -oP "DPT=\K[0-9]+" | sort | uniq -c | sort -rn | head -20

# Blockierungen der letzten Stunde
sudo grep "UFW BLOCK" /var/log/ufw.log | \
  grep "$(date +'%b %d %H')" | wc -l

8.5 Logrotation

UFW-Logs werden automatisch über logrotate verwaltet:

# Konfiguration prüfen
cat /etc/logrotate.d/ufw

Standardmäßig werden die Logs täglich rotiert und 14 Tage aufbewahrt.


9. IPv6-Konfiguration

9.1 IPv6 in UFW aktivieren

UFW unterstützt IPv6 standardmäßig. Die Einstellung ist in der UFW-Konfiguration:

sudo nano /etc/default/ufw
# IPv6 aktivieren (Standard)
IPV6=yes

Nach Änderungen:

sudo ufw disable && sudo ufw enable

9.2 IPv6-Regeln

IPv6-Regeln werden automatisch als Gegenstück zu IPv4-Regeln erstellt:

# Erstellt automatisch eine IPv4- UND IPv6-Regel
sudo ufw allow 443/tcp

# Ausgabe in ufw status:
# 443/tcp                    ALLOW IN    Anywhere
# 443/tcp (v6)               ALLOW IN    Anywhere (v6)

Nur IPv6 erlauben:

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

# IPv6 Loopback
sudo ufw allow from ::1

9.3 IPv6 deaktivieren (falls nicht benötigt)

Falls der Server kein IPv6 nutzt:

sudo nano /etc/default/ufw
IPV6=no
sudo ufw disable && sudo ufw enable

10. Erweiterte Konfiguration (ufw-Dateien)

10.1 Konfigurationsdateien im Überblick

Datei Zweck
/etc/default/ufw Grundeinstellungen (IPv6, Policies, Module)
/etc/ufw/before.rules Regeln VOR den benutzerdefinierten Regeln
/etc/ufw/after.rules Regeln NACH den benutzerdefinierten Regeln
/etc/ufw/user.rules Vom Benutzer erstellte Regeln (automatisch verwaltet)
/etc/ufw/sysctl.conf Kernel-Netzwerkparameter
/etc/ufw/applications.d/ Anwendungsprofile

Wichtig: user.rules und user6.rules werden von UFW automatisch verwaltet. Diese Dateien nicht manuell bearbeiten Änderungen werden beim nächsten ufw-Be