CrowdSec auf Ubuntu 24.04 mit Nginx Proxy Manager (Docker) einsetzen
Wenn in einem Homelab mit Nginx Proxy Manager (NPM) auf Docker mehrere Services über die Ports 80 und 443 veröffentlicht werden, ist eine zuverlässige Schutzschicht gegen Brute-Force-Angriffe, Scanner, Bots und Exploits unerlässlich.
In diesem Beitrag zeige ich Schritt für Schritt:
- Installation von CrowdSec auf Ubuntu 24.04
- Einbindung der Docker-Logs von Nginx Proxy Manager
- Einsatz des hostbasierten iptables-Bouncers
- Saubere Integration in ein bestehendes Setup
Internet
↓
Nginx Proxy Manager (Docker)
↓
Docker Logs
↓
CrowdSec Agent (Host)
↓
iptables Bouncer (Host-Firewall)
↓
Angreifer-IP wird geblockt
CrowdSec auf Ubuntu 24.04 installieren
Offizielle Installationsanleitung:

Repository hinzufügen
curl -s https://install.crowdsec.net | sudo bash
Danach installieren:
sudo apt update
sudo apt install crowdsec
Status prüfen:
sudo systemctl status crowdsec
sudo cscli version
Docker-Logs von Nginx Proxy Manager verfügbar machen
In diesem Abschnitt richten wir jetzt CrowdSec so ein, dass es direkt die Logfiles von Nginx Proxy Manager (NPM) auswertet und Angreifer-IP-Adressen über iptables auf dem Host blockiert.
docker-compose.yml
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
# These ports are in format <host-port>:<container-port>
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web Port
# Add any other Stream port you want to expose
# - '21:21' # FTP
environment:
TZ: "Europe/Berlin"
# Uncomment this if you want to change the location of
# the SQLite DB file within the container
# DB_SQLITE_FILE: "/data/database.sqlite"
# Uncomment this if IPv6 is not enabled on your host
# DISABLE_IPV6: 'true'
volumes:
- /opt/docker/volumes/nginx-proxy-manager/data:/data
- /opt/docker/volumes/nginx-proxy-manager/letsencrypt:/etc/letsencrypt
networks:
- proxy
healthcheck:
test: ["CMD", "/usr/bin/check-health"]
interval: 10s
timeout: 3s
networks:
proxy:
external: true
iptables installieren (falls noch nicht vorhanden)
Auf den meisten Ubuntu-Servern ist iptables bereits installiert. Falls nicht:
sudo apt install iptables -y
CrowdSec Firewall-Bouncer installieren
Der Bouncer sorgt dafür, dass erkannte Angreifer-IP-Adressen in iptables eingetragen werden.
sudo apt install crowdsec-firewall-bouncer-iptables -y
Status prüfen
sudo systemctl status crowdsec-firewall-bouncer
Nginx Proxy Manager Collection installieren
Für NPM gibt es eine eigene Collection, die speziell auf dessen Logformat abgestimmt ist:
sudo cscli collections install crowdsecurity/nginx-proxy-manager
Damit werden passende Parser und Szenarien installiert.
Nginx Proxy Manager Logs auf dem Host verfügbar machen
Damit CrowdSec die Logs lesen kann, müssen sie auf dem Host-System verfügbar sein.
Standardmäßig nutzt die offizielle Anleitung von NPM:
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
Die Logs liegen dann im data/logs Verzeichnis innerhalb dieses Ordners, in welchem auch die docker-compose.yml liegt.
Empfohlene Anpassung der docker-compose.yaml
Um die Daten des Nginx Proxy Manager zentrale im Host-System unter /opt/docker/volumes bereitzustellen, kann die Compose-Datei wie folgt angepasst werden:
volumes:
- /opt/docker/volumes/nginx-proxy-manager/data:/data
- /opt/docker/volumes/nginx-proxy-manager/letsencrypt:/etc/letsencrypt
Das vollständige docker-compose.yml ist oben zu finden und kann in folgender Verzeichnisstruktur betrieben werden:
# Verzeichnis für Nginx Proxy Manager - docker-compose.yml
mkdir -p /opt/docker/apps/nginx-proxy-manager
# Verzeichnis für Nginx Proxy Manager - Dateien und Konfiguration
mkdir -p /opt/docker/volumes/nginx-proxy-manager
Was wurde geändert?
- Logs werden direkt nach
/opt/docker/volumes/nginx-proxy-manager/data/logsauf dem Host geschrieben - Bessere Trennung von Konfiguration und Logdaten
- Vereinfachtes Backup der gesamten persistenten Container-Daten
Acquisition-Datei für CrowdSec erstellen
Nun erstellen wir eine neue Konfigurationsdatei für CrowdSec:
sudo nano /etc/crowdsec/acquis.d/npm.yaml
Inhalt:
filenames:
- /opt/docker/volumes/nginx-proxy-manager/data/logs/proxy-host-*_access.log
- /opt/docker/volumes/nginx-proxy-manager/data/logs/proxy-host-*_error.log
labels:
type: nginx-proxy-manager
source: file
Erklärung
proxy-host-1_access.logproxy-host-2_access.log- usw.
Jeder neue Proxy Host in NPM erzeugt eigene Logdateien.
Durch das Wildcard proxy-host-* erkennt CrowdSec automatisch alle aktuellen und zukünftigen Proxy Hosts.
CrowdSec neu starten
sudo systemctl restart crowdsec
Prüfen, ob die Logs eingelesen werden
Wichtig:
Die Dateien erscheinen erst in den Metrics, nachdem sie nach dem Neustart verändert wurden.
Also:
- Entweder warten, bis echter Traffic kommt
- Oder selbst deine Website aufrufen
- Oder Test-Traffic erzeugen
Dann prüfen:
sudo cscli metrics show acquisition
Dort sollten Einträge erscheinen wie:

Zusätzlich können dort auch Standard-Engine-Dateien wie auth.log und syslog erscheinen.
Funktionsweise nach erfolgreicher Einrichtung
Sobald:
- Ein Bot die Seite scannt
- Eine Brute-Force-Anfrage erfolgt
- Ein bekannter Exploit-Versuch erkannt wird
passiert Folgendes:
- CrowdSec erkennt das Muster in den Logs
- Eine Entscheidung wird erstellt
- Der Firewall-Bouncer aktualisiert iptables
- Die IP wird auf dem Docker-Host blockiert
Zusammenfassung
Für Nginx Proxy Manager benötigt man:
- iptables
- crowdsec-firewall-bouncer-iptables
- crowdsecurity/nginx-proxy-manager Collection
- Eine passende acquis.yaml mit proxy-host-Logfiles
Damit erhält man:
- Automatischen Schutz für alle Proxy Hosts
- Hostbasierte IP-Sperren
- Saubere Trennung zwischen Docker und Security-Layer
Allgemeine Status- & Diagnosebefehle
CrowdSec Status prüfen
sudo cscli version
sudo systemctl status crowdsec
Aktive Komponenten anzeigen
sudo cscli metrics
Zeigt:
- Verarbeitete Logs
- Aktive Parser
- Getriggerte Szenarien
- Bouncer-Status
Prüfen, ob Logs eingelesen werden
sudo cscli metrics show acquisition
Sehr wichtig bei NPM – hier siehst du, ob:
/opt/docker/volumes/nginx-proxy-manager/data/logs/proxy-host-1_access.log
wirklich verarbeitet wird.
Entscheidungen & geblockte IPs
Aktuelle Blockierungen anzeigen
sudo cscli decisions list
Mit Details:
sudo cscli decisions list -o human
Nur eine bestimmte IP prüfen:
sudo cscli decisions list -i 1.2.3.4
Manuell eine IP blockieren
sudo cscli decisions add -i 1.2.3.4 --duration 24h
Subnetz blockieren:
sudo cscli decisions add -r 10.10.10.0/24 --duration 12h
Entscheidung entfernen
sudo cscli decisions delete -i 1.2.3.4
Alle lokalen Entscheidungen löschen:
sudo cscli decisions delete --all
Alerts anzeigen
Aktuelle Alerts anzeigen
sudo cscli alerts list
Mit mehr Details:
sudo cscli alerts inspect <alert-id>
Beispiel:
sudo cscli alerts inspect 123
Hier siehst du:
- Welche Szenarien ausgelöst haben
- Welche Logzeilen beteiligt waren
- Welche IP betroffen ist
Sehr hilfreich bei Fehlalarmen.
Szenarien, Parser & Collections verwalten
Installierte Collections anzeigen
sudo cscli collections list
Hub aktualisieren (sehr wichtig!)
sudo cscli hub update
sudo cscli hub upgrade
Installierte Parser anzeigen
sudo cscli parsers list
Installierte Szenarien anzeigen
sudo cscli scenarios list
Einzelnes Szenario deaktivieren
Beispiel:
sudo cscli scenarios disable crowdsecurity/http-probing
Wieder aktivieren:
sudo cscli scenarios enable crowdsecurity/http-probing
Bouncer verwalten
Registrierte Bouncer anzeigen
sudo cscli bouncers list
Beispiel-Ausgabe:
Name IP Address Last API pull
crowdsec-firewall-bouncer 127.0.0.1 2s ago
Bouncer-Key neu generieren
sudo cscli bouncers add firewall-bouncer
Community Blocklist / CAPI
CAPI Status prüfen
sudo cscli capi status
Registrierung prüfen
sudo cscli console status
Debug & Fehlersuche
CrowdSec Live-Log anzeigen
sudo journalctl -u crowdsec -f
Bouncer Live-Log anzeigen
sudo journalctl -u crowdsec-firewall-bouncer -f
Testen, ob ein Logfile korrekt geparst wird
Sehr hilfreich bei NPM:
sudo cscli explain --file /var/log/docker-npm/proxy-host-1_access.log
Oder einzelne Logzeile testen:
echo 'LOGZEILE' | sudo cscli explain
Zeigt:
- Welcher Parser greift
- Welches Szenario ausgelöst würde
- Ob Labels korrekt gesetzt sind
Schnelle Admin-Shortlist (Daily Use)
Für das NPM-Setup sehr nützlich:
sudo cscli metrics
sudo cscli decisions list
sudo cscli alerts list
sudo cscli hub update && sudo cscli hub upgrade
sudo cscli metrics show acquisition
