docs: create IT_Abteilung/Security/UFW
This commit is contained in:
818
IT_Abteilung/Security/UFW.md
Normal file
818
IT_Abteilung/Security/UFW.md
Normal file
@@ -0,0 +1,818 @@
|
|||||||
|
---
|
||||||
|
title: UFW server firewall Profice
|
||||||
|
description:
|
||||||
|
published: true
|
||||||
|
date: 2026-02-24T08:54:57.458Z
|
||||||
|
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:** Netzwerk-Absicherung, Portfilterung, Zugriffskontrolle für alle Server-Dienste
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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. [Regeln für unsere Server-Dienste](#6-regeln-für-unsere-server-dienste)
|
||||||
|
7. [Rate Limiting – Verbindungsbegrenzung](#7-rate-limiting--verbindungsbegrenzung)
|
||||||
|
8. [Logging und Überwachung](#8-logging-und-überwachung)
|
||||||
|
9. [IPv6-Konfiguration](#9-ipv6-konfiguration)
|
||||||
|
10. [Erweiterte Konfiguration (ufw-Dateien)](#10-erweiterte-konfiguration-ufw-dateien)
|
||||||
|
11. [Port-Weiterleitung und NAT](#11-port-weiterleitung-und-nat)
|
||||||
|
12. [Docker und UFW](#12-docker-und-ufw)
|
||||||
|
13. [Fehlerbehebung](#13-fehlerbehebung)
|
||||||
|
14. [Best Practices und Sicherheitshärtung](#14-best-practices-und-sicherheitshärtung)
|
||||||
|
15. [Schnellreferenz – Befehle auf einen Blick](#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?
|
||||||
|
|
||||||
|
```plantuml
|
||||||
|
@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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y ufw
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 Aktuellen Status prüfen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ufw status
|
||||||
|
# Ausgabe: Status: inactive
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3 Standardrichtlinien setzen (Default Policies)
|
||||||
|
|
||||||
|
Bevor die Firewall aktiviert wird, müssen die Standardrichtlinien festgelegt werden:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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!)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ufw allow 2222/tcp
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.5 UFW aktivieren
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Status prüfen
|
||||||
|
sudo systemctl status ufw
|
||||||
|
|
||||||
|
# Autostart prüfen
|
||||||
|
sudo systemctl is-enabled ufw
|
||||||
|
# Ausgabe: enabled
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Grundlegende Regelverwaltung
|
||||||
|
|
||||||
|
### 3.1 Port erlauben
|
||||||
|
|
||||||
|
```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:6010/tcp
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2 Port blockieren
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
less /etc/services
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.4 Regeln anzeigen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Alle Regeln löschen und UFW deaktivieren
|
||||||
|
sudo ufw reset
|
||||||
|
|
||||||
|
# Danach: Standardrichtlinien neu setzen, Regeln neu erstellen, aktivieren
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.8 UFW deaktivieren (temporär)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Firewall deaktivieren (Regeln bleiben gespeichert)
|
||||||
|
sudo ufw disable
|
||||||
|
|
||||||
|
# Wieder aktivieren
|
||||||
|
sudo ufw enable
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Erweiterte Regeln
|
||||||
|
|
||||||
|
### 4.1 Regeln nach IP-Adresse
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ufw app list
|
||||||
|
```
|
||||||
|
|
||||||
|
Typische Ausgabe auf einem Debian-Server:
|
||||||
|
|
||||||
|
```
|
||||||
|
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 Profile verwenden
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo nano /etc/ufw/applications.d/gitea
|
||||||
|
```
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[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
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo nano /etc/ufw/applications.d/vaultwarden
|
||||||
|
```
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[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
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ===========================================================
|
||||||
|
# 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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo nano /etc/default/ufw
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# IPv6 aktivieren (Standard)
|
||||||
|
IPV6=yes
|
||||||
|
```
|
||||||
|
|
||||||
|
Nach Änderungen:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ufw disable && sudo ufw enable
|
||||||
|
```
|
||||||
|
|
||||||
|
### 9.2 IPv6-Regeln
|
||||||
|
|
||||||
|
IPv6-Regeln werden automatisch als Gegenstück zu IPv4-Regeln erstellt:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo nano /etc/default/ufw
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
IPV6=no
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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
|
||||||
Reference in New Issue
Block a user