TL;DR: CrowdSec ist wie ein Community-gesteuertes Immunsystem für dein Homelab. In Kombination mit Traefik blockst du automatisch Brute-Force-Angriffe, Scanner und bekannte Angreifer-IPs – und das alles mit ein paar Zeilen Docker Compose. Hier erfährst du, wie du CrowdSec aufsetzt, den Traefik Bouncer konfigurierst und dein Netzwerk aktiv verteidigst.
🤔 Warum reicht Traefik allein nicht aus?
Traefik ist ein fantastischer Reverse Proxy. Er kümmert sich um SSL-Zertifikate, Routing und Load Balancing. Aber eines kann er von Haus aus nicht: böswillige Anfragen erkennen und blockieren.
Klar, du kannst IP-Whitelists konfigurieren oder Rate Limiting einschalten. Aber was ist mit Brute-Force-Angriffen auf deine Dienste? Was ist mit Bots, die bekannte Schwachstellen scannen? Was ist mit IPs, die weltweit als bösartig bekannt sind?
Genau hier kommt CrowdSec ins Spiel. Und ja – es ist kostenlos und Open Source. 🎉


🛡️ Was ist CrowdSec?
CrowdSec ist ein kollaboratives Intrusion Prevention System (IPS). Stell dir eine Art Fail2ban vor, aber auf Steroiden und mit Community-Power. Die Grundidee ist simpel:
- Erkennung: CrowdSec analysiert deine Logs (z.B. Traefik Access Logs) und erkennt verdächtiges Verhalten.
- Entscheidung: Basierend auf definierten Szenarien (z.B. "mehr als 10 fehlgeschlagene Logins in 30 Sekunden") trifft CrowdSec eine Entscheidung.
- Durchsetzung: Ein sogenannter Bouncer setzt die Entscheidung durch – zum Beispiel durch Blockieren der IP.
- Community: Erkannte Angreifer werden (anonymisiert) mit der Community geteilt. Du profitierst also vom Wissen aller anderen CrowdSec-Nutzer.
🔄 CrowdSec vs. Fail2ban – Was ist der Unterschied?
Klingt erstmal nach Fail2ban, oder? Aber es gibt ein paar entscheidende Unterschiede:
| Feature | Fail2ban | CrowdSec |
|---|---|---|
| Architektur | Monolithisch | Agent + Bouncer (entkoppelt) |
| Sprache | Python | Go (deutlich performanter) |
| Community Blocklists | ❌ | ✅ (zentrales Threat Intelligence) |
| Dashboard | ❌ (nur CLI) | ✅ (Web-Konsole) |
| Docker-Support | Umständlich | Erstklassig |
| Szenarien | Regex-basiert | YAML-basierte Szenarien mit Buckets |
| Performance | Mäßig bei vielen Logs | Sehr gut dank Go |
Kurz gesagt: CrowdSec ist moderner, skalierbarer und durch die Community-Blocklists deutlich effektiver.
⚙️ Die Architektur: Agent + Bouncer
Bevor wir in die Konfiguration einsteigen, lass uns kurz die Architektur verstehen. CrowdSec besteht aus zwei Hauptkomponenten:
1. CrowdSec Agent (Security Engine)
Der Agent liest deine Log-Dateien, analysiert sie anhand von Parsern und Szenarien, und trifft Entscheidungen. Er ist das "Gehirn" des Systems.
2. Bouncer
Der Bouncer ist der "TĂĽrsteher". Er fragt den Agent nach aktuellen Entscheidungen und setzt sie durch. FĂĽr Traefik gibt es einen eigenen Traefik Bouncer Plugin, das sich direkt als Middleware einklinkt.
Das Schöne an dieser Architektur: Agent und Bouncer sind entkoppelt. Du kannst einen Agent auf deinem Server laufen lassen und mehrere Bouncer an verschiedenen Stellen einsetzen.
🚀 Los geht's: Docker Compose Setup
Jetzt wird's spannend! Hier ist das komplette Setup mit Traefik und CrowdSec in Docker Compose. Ich gehe davon aus, dass du Traefik bereits am Laufen hast – falls nicht, schau dir meinen Artikel zur Migration von Nginx Proxy Manager zu Traefik an.
Verzeichnisstruktur
traefik/
├── docker-compose.yml
├── traefik/
│ ├── traefik.yml # Statische Konfiguration
│ ├── dynamic/
│ │ └── middlewares.yml # Dynamische Middleware-Konfig
│ └── logs/
│ └── access.log # Traefik Access Log (wichtig!)
└── crowdsec/
├── config/
│ └── acquis.yaml # Log-Quellen für CrowdSec
└── data/ # CrowdSec Datenbank
Docker Compose
Hier kommt die docker-compose.yml. Achte besonders auf die Volumes – CrowdSec muss Zugriff auf die Traefik Access Logs haben:
services:
traefik:
image: traefik:v3.3
container_name: traefik
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik/traefik.yml:/etc/traefik/traefik.yml:ro
- ./traefik/dynamic:/etc/traefik/dynamic:ro
- ./traefik/logs:/var/log/traefik
- ./traefik/acme.json:/acme.json
networks:
- proxy
labels:
- "traefik.enable=true"
depends_on:
- crowdsec
crowdsec:
image: crowdsecurity/crowdsec:latest
container_name: crowdsec
restart: unless-stopped
environment:
- COLLECTIONS=crowdsecurity/traefik crowdsecurity/http-cve crowdsecurity/base-http-scenarios
- GID=${GID-1000}
- BOUNCER_KEY_traefik=${CROWDSEC_BOUNCER_KEY}
volumes:
# CrowdSec config und data
- ./crowdsec/config:/etc/crowdsec
- ./crowdsec/data:/var/lib/crowdsec/data
# Zugriff auf Traefik Logs – das ist der Schlüssel!
- ./traefik/logs:/var/log/traefik:ro
networks:
- proxy
ports:
- "127.0.0.1:8080:8080" # API nur lokal erreichbar
networks:
proxy:
external: true
⚠️ Wichtig: Die Umgebungsvariable CROWDSEC_BOUNCER_KEY musst du in einer .env-Datei definieren oder beim ersten Start generieren lassen. Dazu gleich mehr.
📝 Traefik für CrowdSec vorbereiten
Damit CrowdSec die Traefik-Logs lesen kann, musst du das Access Logging in Traefik aktivieren. Hier die relevanten Teile der traefik.yml:
# traefik/traefik.yml
api:
dashboard: true
insecure: false
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: ":443"
http:
tls:
certResolver: letsencrypt
middlewares:
- crowdsec@file # CrowdSec Middleware global aktivieren!
providers:
docker:
exposedByDefault: false
network: proxy
file:
directory: /etc/traefik/dynamic
watch: true
certificatesResolvers:
letsencrypt:
acme:
email: [email protected]
storage: /acme.json
httpChallenge:
entryPoint: web
# Access Log – MUSS aktiviert sein für CrowdSec!
accessLog:
filePath: "/var/log/traefik/access.log"
format: json
filters:
statusCodes:
- "200-599"
fields:
headers:
defaultMode: drop
names:
User-Agent: keep
X-Forwarded-For: keep
Ganz wichtig hier: Das Access Log muss im JSON-Format geschrieben werden. CrowdSec hat spezielle Parser fĂĽr Traefik-JSON-Logs.
đź”§ CrowdSec Konfiguration
acquis.yaml – Wo kommen die Logs her?
CrowdSec braucht eine Konfiguration, die ihm sagt, welche Logs es lesen soll. Erstelle die Datei crowdsec/config/acquis.yaml:
# crowdsec/config/acquis.yaml
filenames:
- /var/log/traefik/access.log
labels:
type: traefik
Das war's. CrowdSec weiĂź jetzt, dass es die Traefik-Logs lesen soll und wendet automatisch die passenden Parser an (die wir ĂĽber die COLLECTIONS-Umgebungsvariable installiert haben).
Bouncer Key generieren
Beim ersten Start von CrowdSec musst du einen API-Key fĂĽr den Bouncer generieren. Wenn du BOUNCER_KEY_traefik als Umgebungsvariable setzt, wird der Key beim ersten Start automatisch erstellt. Alternativ:
# Container starten
docker compose up -d crowdsec
# Bouncer Key manuell generieren
docker exec crowdsec cscli bouncers add traefik-bouncer
# Ausgabe: API key for 'traefik-bouncer':
# abc123def456...
# Diesen Key notieren!
🔌 Traefik Bouncer Plugin konfigurieren
Jetzt kommt der entscheidende Teil: Das Traefik Bouncer Plugin. Es gibt zwei Wege, CrowdSec mit Traefik zu verbinden:
- Traefik Bouncer Plugin (empfohlen) – läuft direkt in Traefik als Middleware
- Standalone Bouncer – separater Container mit iptables
Wir nehmen den Plugin-Ansatz, weil er eleganter ist und keine extra Netzwerk-Berechtigungen braucht.
FĂĽge das Plugin in deine traefik.yml ein (im experimental-Block):
# In traefik.yml ergänzen:
experimental:
plugins:
crowdsec:
moduleName: github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin
version: v1.3.5
Und die Middleware-Konfiguration in traefik/dynamic/middlewares.yml:
# traefik/dynamic/middlewares.yml
http:
middlewares:
crowdsec:
plugin:
crowdsec:
enabled: true
crowdsecLapiScheme: http
crowdsecLapiHost: crowdsec:8080
crowdsecLapiKey: ${CROWDSEC_BOUNCER_KEY}
forwardedHeadersTrustedIPs:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
clientTrustedIPs:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
forwardedHeadersCustomName: X-Forwarded-For
crowdsecMode: live
updateIntervalSeconds: 15
defaultDecisionSeconds: 60
crowdsecLapiTLSInsecureVerify: false
Die forwardedHeadersTrustedIPs und clientTrustedIPs sind wichtig, damit CrowdSec die echte Client-IP aus den Proxy-Headern auslesen kann, statt immer nur die interne Docker-IP zu sehen.
📊 CrowdSec Console & Community Blocklists
Einer der größten Vorteile von CrowdSec ist die Community. Wenn du deine CrowdSec-Instanz bei der CrowdSec Console anmeldest, passieren zwei coole Dinge:
- Du teilst erkannte Angriffe (anonymisiert) mit der Community
- Du erhältst Community-Blocklists – IP-Adressen, die von anderen CrowdSec-Nutzern weltweit als bösartig erkannt wurden
# Bei der Console anmelden
docker exec crowdsec cscli console enroll YOUR_ENROLLMENT_KEY
# Console Enrollment bestätigen auf https://app.crowdsec.net
# Danach CrowdSec neustarten
docker compose restart crowdsec
In der Console siehst du dann ein Dashboard mit:
- Aktive Entscheidungen (geblockte IPs)
- Erkannte Szenarien
- Deine installierten Collections und Parser
- Community Blocklist Status
Kostenlos bekommst du bereits eine solide Community-Blocklist. Für umfangreichere Listen gibt es auch Premium-Optionen, aber für ein Homelab reicht Free völlig.
đź§Ş Testen: Funktioniert alles?
Jetzt kommt der spaßige Teil – wir wollen sicherstellen, dass alles funktioniert!
1. Status prĂĽfen
# CrowdSec Status
docker exec crowdsec cscli metrics
# Installierte Collections anzeigen
docker exec crowdsec cscli collections list
# Aktive Entscheidungen (geblockte IPs)
docker exec crowdsec cscli decisions list
# Bouncer Status
docker exec crowdsec cscli bouncers list
2. Manuell eine IP bannen
# Test-IP bannen (nimm eine IP, die dir nicht gehört!)
docker exec crowdsec cscli decisions add --ip 1.2.3.4 --reason "test ban" --duration 5m
# PrĂĽfen ob sie geblockt wird
docker exec crowdsec cscli decisions list
# Wieder entbannen
docker exec crowdsec cscli decisions delete --ip 1.2.3.4
3. Nikto oder ähnlichen Scanner laufen lassen
Wenn du wirklich sehen willst, ob CrowdSec Angriffe erkennt, kannst du von einem anderen Gerät einen Scanner laufen lassen:
# Von einem ANDEREN Gerät in deinem Netzwerk:
# ACHTUNG: Nur gegen deine eigene Infrastruktur!
nikto -h https://deine-domain.de
# Oder einfach viele schnelle Requests:
for i in $(seq 1 50); do curl -s -o /dev/null https://deine-domain.de/wp-login.php; done
Nach ein paar Sekunden solltest du in den CrowdSec-Logs sehen, dass die IP erkannt und geblockt wird:
# CrowdSec Logs beobachten
docker logs -f crowdsec
# Neue Entscheidungen prĂĽfen
docker exec crowdsec cscli decisions list
🎯 Real-World-Szenarien: Was CrowdSec blockt
Nachdem ich CrowdSec seit einigen Wochen laufen habe, hier ein paar Dinge, die es in meinem Homelab erkannt und geblockt hat:
- HTTP Brute Force: Bots, die Login-Seiten mit Credential Stuffing angreifen
- Path Traversal Versuche: Anfragen wie
/../../etc/passwd - CVE Exploits: Scanner, die bekannte Schwachstellen wie Log4Shell oder Spring4Shell testen
- WordPress Scanner: Bots die nach
/wp-admin,/xmlrpc.phpsuchen (auch wenn du gar kein WordPress nutzt!) - SSH Brute Force: Klassische Passwort-Angriffe (wenn du CrowdSec auch fĂĽr SSH konfigurierst)
- Aggressive Crawler: Bots, die deine Seite mit hunderten Requests pro Sekunde absaugen
Die Community-Blocklists sorgen zusätzlich dafür, dass bekannte Angreifer-IPs schon geblockt werden, bevor sie überhaupt bei dir anklopfen. Das ist der wahre Gamechanger.
⚠️ Troubleshooting & Tipps
CrowdSec sieht nur Docker-interne IPs
Das ist das häufigste Problem. Wenn CrowdSec statt der echten Client-IP nur 172.18.0.x sieht, dann musst du:
- Sicherstellen, dass Traefik den
X-Forwarded-ForHeader setzt - Die
forwardedHeadersTrustedIPsim Bouncer Plugin korrekt konfigurieren - Optional: Traefik's
proxyProtocolkonfigurieren, wenn du einen vorgelagerten Proxy hast
# In traefik.yml - entryPoints Konfiguration:
entryPoints:
websecure:
address: ":443"
forwardedHeaders:
trustedIPs:
- "10.0.0.0/8"
- "172.16.0.0/12"
- "192.168.0.0/16"
CrowdSec findet keine Logs
PrĂĽfe, ob die Volumes korrekt gemountet sind:
# Sind die Logs im Container sichtbar?
docker exec crowdsec ls -la /var/log/traefik/
# Parser-Status prĂĽfen
docker exec crowdsec cscli parsers list
# Acquisition config prĂĽfen
docker exec crowdsec cat /etc/crowdsec/acquis.yaml
Bouncer kann sich nicht mit CrowdSec verbinden
Stell sicher, dass:
- Beide Container im selben Docker-Netzwerk sind
- Der API-Key korrekt ist
- CrowdSec vor Traefik startet (daher
depends_onin der Compose-Datei)
đź”’ Bonus: NĂĽtzliche CrowdSec Collections
Ăśber die Standard-Collections hinaus gibt es noch einige, die sich fĂĽr ein Homelab lohnen:
# Weitere Collections installieren
docker exec crowdsec cscli collections install crowdsecurity/whitelist-good-actors
docker exec crowdsec cscli collections install crowdsecurity/appsec-virtual-patching
docker exec crowdsec cscli collections install crowdsecurity/appsec-generic-rules
# Alle installierten Collections anzeigen
docker exec crowdsec cscli collections list
whitelist-good-actors ist besonders wichtig – es verhindert, dass Suchmaschinen-Bots wie Googlebot oder Bingbot versehentlich geblockt werden.

đź’ˇ Fazit
CrowdSec ist ein absoluter Game Changer für jedes Homelab. Die Kombination aus lokaler Log-Analyse und Community-gesteuerter Threat Intelligence macht es zu einem mächtigen Werkzeug, das weit über das hinausgeht, was Fail2ban bieten kann.
Hier nochmal die wichtigsten Punkte zusammengefasst:
- âś… Einfaches Setup mit Docker Compose
- âś… Traefik Plugin fĂĽr nahtlose Integration als Middleware
- âś… Community Blocklists fĂĽr proaktiven Schutz
- âś… Kostenlos und Open Source
- âś… Deutlich moderner als Fail2ban
- âś… Web-Console fĂĽr den Ăśberblick
Wenn du bereits Traefik als Reverse Proxy einsetzt, gibt es eigentlich keinen Grund, CrowdSec nicht zu nutzen. In weniger als 30 Minuten hast du eine solide Sicherheitsschicht, die dein Homelab aktiv gegen Angriffe verteidigt.
Hast du Fragen oder Probleme bei der Einrichtung? Schreib mir gerne in die Kommentare! đź’¬
Mehr Artikel entdecken
Zod: Runtime Validation for TypeScript 🛡️
TypeScript types vanish at runtime. Zod gives you real runtime validation — no more blind trust in API responses or user input.
Traefik + CrowdSec: Securing Your Homelab Against Attacks 🛡️
CrowdSec with Traefik in Docker: Automatically protect your homelab against brute-force attacks, scanners, and known malicious IPs.