Files
WikiJS/IT_Abteilung/Security/UFW.md

1396 lines
34 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: UFW server firewall Profice
description:
published: true
date: 2026-02-24T08:56:45.279Z
tags:
editor: markdown
dateCreated: 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](#1-überblick-und-funktionsweise)
2. [Installation und Ersteinrichtung](#2-installation-und-ersteinrichtung)
3. [Grundlegende Regelverwaltung](#3-grundlegende-regelverwaltung)
4. [Erweiterte Regeln](#4-erweiterte-regeln)
5. [Anwendungsprofile](#5-anwendungsprofile)
6. [Regelkonfiguration für unsere Dienste](#6-regelkonfiguration-für-unsere-dienste)
7. [Logging und Überwachung](#7-logging-und-überwachung)
8. [IPv6-Konfiguration](#8-ipv6-konfiguration)
9. [Rate Limiting Brute-Force-Schutz](#9-rate-limiting--brute-force-schutz)
10. [Port-Weiterleitung und NAT](#10-port-weiterleitung-und-nat)
11. [UFW und Docker](#11-ufw-und-docker)
12. [Regelreihenfolge und Priorität](#12-regelreihenfolge-und-priorität)
13. [Backup und Wiederherstellung](#13-backup-und-wiederherstellung)
14. [Sicherheitshärtung](#14-sicherheitshärtung)
15. [Fehlerbehebung](#15-fehlerbehebung)
16. [Schnellreferenz Befehle auf einen Blick](#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
```plantuml
@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
```bash
sudo apt update
sudo apt install -y ufw
```
### 2.2 Status prüfen
```bash
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
```bash
# 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!)
```bash
# 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
```bash
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
```bash
# 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)
```bash
# 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)
```bash
# 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
```bash
# 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)
```bash
# 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
```bash
# 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
```bash
# 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:
```bash
# 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
```bash
# 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
```bash
# 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:
```bash
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:
```bash
# 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
```bash
# 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
```bash
# Alle Profile auflisten
sudo ufw app list
# Typische Ausgabe:
# Available applications:
# Nginx Full
# Nginx HTTP
# Nginx HTTPS
# OpenSSH
```
### 5.3 Profildetails anzeigen
```bash
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
```bash
# 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:
```bash
sudo nano /etc/ufw/applications.d/gitea
```
```ini
[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
```
```bash
sudo nano /etc/ufw/applications.d/vaultwarden
```
```ini
[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
```
```bash
sudo nano /etc/ufw/applications.d/wikijs
```
```ini
[Wiki.js]
title=Wiki.js
description=Modernes Wiki-System
ports=3000/tcp
```
```bash
# 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
```bash
# ============================================================
# 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
```bash
# 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
```bash
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
```bash
# 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:
```bash
# 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
```bash
# 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:
```bash
sudo nano /etc/rsyslog.d/20-ufw.conf
```
```
:msg,contains,"[UFW " /var/log/ufw.log
& stop
```
```bash
sudo systemctl restart rsyslog
```
Logrotation für die neue Datei:
```bash
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
```bash
sudo nano /etc/default/ufw
```
```bash
# IPv6-Unterstützung (Standard: yes)
IPV6=yes
```
```bash
sudo ufw disable && sudo ufw enable
```
### 8.2 IPv6-Regeln
UFW erstellt automatisch IPv6-Regeln parallel zu IPv4-Regeln:
```bash
# 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:
```bash
# 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:
```bash
# In /etc/default/ufw
IPV6=no
```
```bash
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
```bash
# 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
```bash
# 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:
```bash
sudo nano /etc/ufw/sysctl.conf
```
```bash
# 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
```bash
sudo nano /etc/default/ufw
```
```bash
# 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:
```bash
sudo nano /etc/ufw/before.rules
```
Vor der Zeile `*filter` folgendes einfügen:
```bash
# 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
```
```bash
# 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)
```bash
# 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:
```yaml
# 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:
```bash
sudo nano /etc/docker/daemon.json
```
```json
{
"iptables": false
}
```
```bash
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
```bash
# ❌ 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
```bash
# 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:
```bash
sudo nano /opt/scripts/ufw-setup.sh
```
```bash
#!/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
```
```bash
sudo chmod +x /opt/scripts/ufw-setup.sh
```
### 13.3 Wiederherstellung
```bash
# 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
```bash
# 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
```bash
# 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:
```bash
sudo nano /etc/ufw/before.rules
```
Folgende Zeilen finden und `ACCEPT` durch `DROP` ersetzen:
```bash
# 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
```
```bash
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
```bash
sudo nano /etc/ufw/sysctl.conf
```
```bash
# 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
```
```bash
sudo ufw disable && sudo ufw enable
```
### 14.5 Regelmäßige Überprüfung (monatlich)
```bash
#!/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 ==="
```
```bash
sudo chmod +x /opt/scripts/ufw-audit.sh
```
---
## 15. Fehlerbehebung
### 15.1 UFW lässt sich nicht aktivieren
```bash
# 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
```bash
# 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
```bash
# 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:
```bash
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`:
```bash
# In /etc/ufw/ufw.conf
ENABLED=no
```
### 15.5 Regelkonflikte erkennen
```bash
# 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
```bash
# 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
```bash
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
```bash
# 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
```bash
sudo ufw default deny incoming # Eingehend blockieren
sudo ufw default allow outgoing # Ausgehend erlauben
sudo ufw default deny routed # Weiterleitung blockieren
```
### Logging und Analyse
```bash
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
```bash
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
```bash
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