
NGINX Proxy Manager mit CrowdSec absichern - Docker-Setup unter Ubuntu schützen
Mach deinen Docker-Server mit CrowdSec zur aktiven Firewall – automatisch Angriffe erkennen, blockieren und Logs auswerten.
In dieser Schritt-für-Schritt-Anleitung zeige ich dir, wie du deinen Docker Compose-Stack unter Ubuntu 22.04 LTS mit CrowdSec und dem Firewall Bouncer absicherst – inklusive praktischer Beispiele, Konfigurationsdateien und Tipps zur Integration in die CrowdSec Cloud-Konsole.
Voraussetzungen
- Betriebssystem: Ubuntu 22.04 LTS (Docker-Host)
- Installiertes Docker & Docker Compose
- Root-Zugriff bzw. Sudo-Rechte auf dem Host-System
- Optional: Zugang zur CrowdSec Cloud Konsole für die Registrierung der Security Engine
Systemübersicht
Um besser zu verstehen, wie die einzelnen Komponenten miteinander verbunden sind, zeigt das folgende Schema den Aufbau und die Datenflüsse deines CrowdSec-Setups im Docker-Umfeld auf Ubuntu 22.04:
- CrowdSec-Engine läuft in einem Docker-Container - verarbeitet Logfiles über gemountete Volumes (z. B.
auth.log
,syslog
, NPM-Logs) - Firewall Bouncer läuft direkt auf dem Host-System - kommuniziert über API mit der CrowdSec-Engine (im Container)
- Logdateien stammen aus dem Docker-Host (z. B.
/var/log/syslog
,/var/log/auth.log
) - weiteren Docker-Containern wie z. B. Nginx Proxy Manager (über Volume-Mounts)
- Socket-Proxy ermöglicht sicheren, eingeschränkten Zugriff auf den Docker-Socket - CrowdSec liest daraus Container-Metadaten

Diese Visualisierung hilft dir, die Architektur besser zu verstehen und gegebenenfalls zu erweitern – z. B. um zusätzliche Bouncer oder Logquellen.
Anleitung zur Einrichtung
Installation CrowdSec Container
Zunächst gilt es, ein verfügbares Subnetz zu ermitteln, das anschließend in der Datei docker-compose.yaml
verwendet wird. Führe dazu auf dem Docker-Host folgenden Befehl aus:
sudo docker network inspect $(sudo docker network ls -q)|grep -E "Subnet"
Eine mögliche Darstellung der Ausgabe könnte folgendermaßen sein.

In der Datei docker-compose.yaml
sollten das Subnetz, die Container-IP-Adresse sowie die Gateway-IP-Adresse durch Adressen eines verfügbaren Subnetzes ersetzt werden. Im gezeigten Beispiel kam das Subnetz 172.28.5.0/16
zum Einsatz.
version: '3'
services:
crowdsec:
image: crowdsecurity/crowdsec:latest
restart: unless-stopped
environment:
COLLECTIONS: "crowdsecurity/linux"
DOCKER_HOST: tcp://socket-proxy:2375
volumes:
- crowdsec-db:/var/lib/crowdsec/data/
- crowdsec-config:/etc/crowdsec/
- /etc/crowdsec/acquis.yaml:/etc/crowdsec/acquis.yaml
- /var/log/syslog:/var/log/syslog:ro
- /var/log/auth.log:/var/log/auth.log:ro
depends_on:
- socket-proxy
networks:
crowdsec:
ipv4_address: 172.28.5.254
socket-proxy:
restart: always
image: lscr.io/linuxserver/socket-proxy:latest
environment:
INFO: 1
CONTAINERS: 1
POST: 0
BUILD: 0
COMMIT: 0
CONFIGS: 0
DISTRIBUTION: 0
EXEC: 0
GRPC: 0
IMAGES: 0
NETWORKS: 0
NODES: 0
PLUGINS: 0
SERVICES: 0
SESSION: 0
SWARM: 0
SYSTEM: 0
TASKS: 0
VOLUMES: 0
volumes:
- '/var/run/docker.sock:/var/run/docker.sock:ro'
read_only: true
tmpfs:
- /run
networks:
crowdsec:
volumes:
crowdsec-db:
crowdsec-config:
networks:
crowdsec:
driver: bridge
ipam:
config:
- subnet: 172.28.0.0/16
gateway: 172.28.5.1
external: false
Die Konfigurationsdatei /etc/crowdsec/acquis.yaml
auf dem Docker-Host anlegen:
sudo mkdir -p /etc/crowdsec && sudo touch /etc/crowdsec/acquis.yaml
und folgenden Content einfügen:
filenames:
- /var/log/auth.log
- /var/log/syslog
labels:
type: syslog
---
Den Container Stack erstellen:
sudo docker compose up -d
Installation Firewall Bouncer
Der Firewall Bouncer wird direkt auf dem Docker-Host eingerichtet. Um das Repository sowie den erforderlichen GPG-Schlüssel zu installieren, führe die folgenden Befehle aus:
curl -s https://install.crowdsec.net | sudo sh
Nachdem das Repository hinzugefügt wurde, führe die Installation von CrowdSec Firewall Bouncer durch.
sudo apt update && sudo apt install crowdsec-firewall-bouncer-iptables
Konfiguriere den Bouncer anschließend so, dass er mit der lokalen API des CrowdSec-Containers kommuniziert. Erstelle dazu zunächst mithilfe von cscli ein API-Token für den Bouncer.
sudo docker exec -t crowdsec-crowdsec-1 cscli bouncers add HostFirewallBouncer
Ein neuer API-Schlüssel für den Bouncer „HostFirewallBouncer“ wird generiert und ausschließlich einmalig angezeigt.

Konfiguriere anschließend den Bouncer so, dass er das Token zur Authentifizierung bei der lokalen CrowdSec-API nutzt. Öffne dazu die Datei sudo nano /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml
und passe die Werte für api_url, api_key sowie iptables_chains an. In diesem Beispiel wurde IPv6 zusätzlich über disable_ipv6 deaktiviert:
mode: iptables
piddir: /var/run/
update_frequency: 10s
daemonize: true
log_mode: file
log_dir: /var/log/
log_level: info
api_url: http://172.28.5.254:8080/
api_key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
disable_ipv6: true
#if present, insert rule in those chains
iptables_chains:
- INPUT
- DOCKER-USER
Jetzt starte den Bouncer mit folgendem Befehl:
sudo systemctl start crowdsec-firewall-bouncer.service
Danach überprüfe den aktuellen Status:
sudo systemctl status crowdsec-firewall-bouncer.service
Das Ergebnis könnte dann ungefähr folgendermaßen aussehen:

Läuft der Dienst, sollte es eine neue Firewall Chain mit dem Namen “DOCKER-USER” geben. Das kann wie folgt geprüft werden:
sudo iptables -L -n
Das Ergebnis sollte so oder ähnlich ausschauen:

Das IP-Set crowdsec-blacklist sollte jetzt ebenfalls eine Auflistung der gesperrten IP-Adressen enthalten. Dies lässt sich wie folgt überprüfen:
sudo ipset -L crowdsec-blacklists
Es werden dabei alle IP-Adressen der Liste crowdsec-blacklists
aufgelistet.

Einrichtung Nginx Proxy Manager
Um die Logdaten aller virtuellen Hosts zentral über den Nginx Proxy Manager (NPM) an den CrowdSec-Dienst zur Analyse und automatischen Erkennung sowie Blockierung verdächtiger Aktivitäten weiterzuleiten, sind einige Anpassungen an der Konfiguration erforderlich.
Zunächst wird auf dem Hostsystem ein zentraler Ordner für die Logdateien der virtuellen Hosts erstellt:
sudo mkdir -p /var/log/crowdsec/proxy
Anschließend wird in der docker-compose.yaml
des NPM-Containers ein zusätzlicher Volume-Eintrag hinzugefügt, um die Logdateien bereitzustellen. Danach muss der Container neu gestartet werden:
volumes:
- /var/log/crowdsec/proxy:/data/logs
Damit CrowdSec diese Logs verarbeiten kann, wird auf dem Host in der Konfigurationsdatei /etc/crowdsec/acquis.yaml
folgender Abschnitt am Ende ergänzt:
filenames:
- /var/log/crowdsec/proxy/*.log
labels:
type: nginx-proxy-manager
---
Zum Abschluss wird die docker-compose.yaml
des CrowdSec-Stacks erweitert, um die neue Logquelle einzubinden und die passende Collection zu aktivieren. Danach sollte der Stack neu gestartet werden:
environment:
COLLECTIONS: "crowdsecurity/linux crowdsecurity/nginx-proxy-manager"
volumes:
- /var/log/crowdsec/proxy/:/var/log/proxy/:ro
Nachdem alle Konfigurationsschritte erfolgreich abgeschlossen wurden, kann ein abschließender Funktionstest durchgeführt werden, um die Integration von CrowdSec zu überprüfen.
Setzte dazu deine eigene öffentliche IP testweise für 4 Minuten auf die Bannliste. Ersetze die IP-Adresse durch deine aktuelle IP-Adresse:
sudo docker exec -t crowdsec-crowdsec-1 cscli decisions add --ip 79.247.206.115 --duration 4m
Rufe anschließend deine Website auf und überprüfe die Erreichbarkeit. Wenn die Einrichtung korrekt war, sollte sowohl der HTTP-Zugriff als auch jede andere Verbindung zu dem Server für die festgelegte Dauer von vier Minuten blockiert sein.
Um alle derzeit aktiven Sperren in Crowdsec anzuzeigen, verwende folgenden Befehl:
sudo docker exec -t crowdsec-crowdsec-1 cscli decisions list
Szenarios Erweiterung
Enroll Cloud Console
Melde dich in der Cloud-Konsole an und navigiere zum Bereich Engine. Klicke dort auf “Add Security Engine”.

Füge nun auf deinem Docker-Host die CrowdSec Engine hinzu:
sudo docker exec -t crowdsec-crowdsec-1 cscli console enroll -e context <KEY>
Die Ausgabe sollte in etwa wie folgt aussehen:

Bestätige anschließend die Anmeldung im CrowdSec-Portal über “Accept Enrollment”:

Zum Abschluss den CrowdSec-Container neu starten:
E-Mail-Benachrichtigungen
Verbinde dich mit dem CrowdSec Docker-Container:
sudo docker exec -it crowdsec-crowdsec-1 bash
Füge in der Datei /etc/crowdsec/profiles.yaml
den folgenden Abschnitt hinzu (bzw. entferne das Kommentarzeichen, falls bereits vorhanden):
notifications:
- email_default
Bearbeite die Datei /etc/crowdsec/notifications/email.yaml
und trage die Zugangsdaten deines SMTP-Servers ein:
smtp_host: # example: smtp.gmail.com
smtp_username: # Replace with your actual username
smtp_password: # Replace with your actual password
smtp_port: # Common values are any of [25, 465, 587, 2525]
auth_type: # Valid choices are "none", "crammd5", "login", "plain"
sender_name: "CrowdSec"
sender_email: # example:
email_subject: "CrowdSec Notification"
receiver_emails:
# -
# One of "ssltls", "starttls", "none"
encryption_type: "ssltls"
Starte den CrowdSec-Container neu, damit die Änderungen wirksam werden.
sudo docker restart crowdsec-crowdsec-1
Um sicherzustellen, dass die E-Mail-Benachrichtigungen korrekt funktionieren, kannst du eine Testnachricht manuell auslösen:
sudo docker exec -it crowdsec-crowdsec-1 cscli decisions add -i 10.255.255.1 --reason "E-Mail-Test" -t ban
Wenn alles richtig eingerichtet ist, solltest du in Kürze eine Test-E-Mail an die konfigurierte Empfängeradresse erhalten. Falls keine E-Mail ankommt, überprüfe die Logs des Containers mit:
sudo docker logs crowdsec-crowdsec-1
Abschließend kann die Fake-Entscheidung mit sudo docker exec -it crowdsec-crowdsec-1 cscli decisions delete -i 10.255.255.1
entfernen werden.
Whitelist DynDNS IP-Adresse
Führe folgenden Befehl auf dem Docker-Host aus, um eine Shell im Container zu öffnen:
sudo docker exec -it crowdsec-crowdsec-1 bash
Erstelle den benötigten Ordner und eine leere Whitelist-Datei:
mkdir -p /etc/crowdsec/postoverflows/s01-whitelist && touch /etc/crowdsec/postoverflows/s01-whitelist/FQDN-whitelist.yaml
Öffne die Datei FQDN-whitelist.yaml
mit dem Editor vi
:
vi /etc/crowdsec/postoverflows/s01-whitelist/FQDN-whitelist.yaml
Füge den folgenden Inhalt ein und ersetze foo.com
durch deinen tatsächlichen FQDN:
name: me/FQDN-whitlists
description: "Whitelist postoverflows from FQDN"
whitelist:
reason: "do whitelistings by FQDN"
expression:
- evt.Overflow.Alert.Source.IP in LookupHost("foo.com")
Beende die Container-Shell mit exit
und führe einen Neustart des CrowdSec Container durch:
sudo docker restart crowdsec-crowdsec-1
Mit dem folgenden Befehl kann geprüft werden, ob die Regel geladen wurde:
sudo docker exec -it crowdsec-crowdsec-1 cscli postoverflows list
Führe einen Funktionstest der FQDN-Whitelist durch, indem du zunächst die IP-Adresse deines FQDNs ermittelst und anschließend eine manuelle Entscheidung für die geblockte IP hinzufügst:
dig +short foo.com
oder durch:
host foo.com
Angenommen, die IP ist 203.0.113.42
, füge dann testweise eine Entscheidung hinzu:
sudo docker exec -it crowdsec-crowdsec-1 cscli decisions add -i 203.0.113.42 --reason "Test block" -t ban
Prüfe, ob die Whitelist gegriffen hat:
sudo docker logs -f crowdsec-crowdsec-1
Ist die Regel richtig eingestellt, wird die Entscheidung von der Whitelist übergangen oder nicht berücksichtigt. In diesem Fall erhältst du weder eine Benachrichtigung noch wird eine Blockierung durchgeführt.
Danach kann der Testeintrag wieder gelöscht werden.
sudo docker exec -it crowdsec-crowdsec-1 cscli decisions delete -i 203.0.113.42
Abschluss
Damit ist das Tutorial zu “NGINX Proxy Manager mit CrowdSec absichern: Docker-Setup unter Ubuntu 22.04 schützen” abgeschlossen. Wenn Sie Fragen haben, senden Sie eine Mail an ralf.kirchner@ksite.de