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.
Traefik – Der Cloud Native Application Proxy
Traefik ist ein moderner HTTP Reverse Proxy und Load Balancer, der das Deployment von Microservices vereinfacht. Integriert sich mit Docker, Kubernetes und mehr.

🤔 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. 🎉

CrowdSec – Open Source & Kollaborative Sicherheit
CrowdSec ist ein kostenloses, quelloffenes IPS/IDS, das Schwarmintelligenz nutzt, um deine Infrastruktur zu schĂĽtzen.
Migration vom Nginx Proxy Manager zu Traefik
Wie ich meinen Reverse Proxy von Nginx Proxy Manager auf Traefik umgestellt habe – und warum.

🛡️ 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:

  1. Erkennung: CrowdSec analysiert deine Logs (z.B. Traefik Access Logs) und erkennt verdächtiges Verhalten.
  2. Entscheidung: Basierend auf definierten Szenarien (z.B. "mehr als 10 fehlgeschlagene Logins in 30 Sekunden") trifft CrowdSec eine Entscheidung.
  3. Durchsetzung: Ein sogenannter Bouncer setzt die Entscheidung durch – zum Beispiel durch Blockieren der IP.
  4. 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:

FeatureFail2banCrowdSec
ArchitekturMonolithischAgent + Bouncer (entkoppelt)
SprachePythonGo (deutlich performanter)
Community Blocklists❌✅ (zentrales Threat Intelligence)
Dashboard❌ (nur CLI)✅ (Web-Konsole)
Docker-SupportUmständlichErstklassig
SzenarienRegex-basiertYAML-basierte Szenarien mit Buckets
PerformanceMäßig bei vielen LogsSehr 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.

Docker: Einfache Bereitstellung von Diensten
Docker macht das Deployment von Services einfach und reproduzierbar. So steigst du ein.

🚀 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:

  1. Traefik Bouncer Plugin (empfohlen) – läuft direkt in Traefik als Middleware
  2. 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:

  1. Du teilst erkannte Angriffe (anonymisiert) mit der Community
  2. 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.php suchen (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:

  1. Sicherstellen, dass Traefik den X-Forwarded-For Header setzt
  2. Die forwardedHeadersTrustedIPs im Bouncer Plugin korrekt konfigurieren
  3. Optional: Traefik's proxyProtocol konfigurieren, 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_on in 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.

DKIM, DMARC und SPF: Der Schutzschild deiner E-Mail-Kommunikation
SchĂĽtze deine E-Mails vor Phishing und Spoofing mit DKIM, DMARC und SPF.

đź’ˇ 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! đź’¬

Artikel teilen:Share article: