<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Crowdsec – Serverküche</title><link>https://serverkueche.de/tags/crowdsec/</link><description>Crowdsec – Neueste Beiträge von Serverküche</description><generator>Hugo</generator><language>de-DE</language><managingEditor>feedback@serverkueche.de (Serverküche)</managingEditor><webMaster>feedback@serverkueche.de (Serverküche)</webMaster><copyright>2026 Serverküche</copyright><lastBuildDate>Fri, 24 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://serverkueche.de/tags/crowdsec/index.xml" rel="self" type="application/rss+xml"/><item><title>CrowdSec: moderne, kollaborative Angriffsabwehr</title><link>https://serverkueche.de/tutorials/crowdsec-einrichten/</link><pubDate>Fri, 24 Jul 2026 00:00:00 +0000</pubDate><author>feedback@serverkueche.de (Serverküche)</author><guid>https://serverkueche.de/tutorials/crowdsec-einrichten/</guid><description>CrowdSec mit dem Traefik-Bouncer einrichten: Angriffe aus den Zugriffs-Logs erkennen, Angreifer per 403 blocken und von der Community-Blocklist profitieren.</description><content:encoded><![CDATA[<p><a href="/tutorials/fail2ban-einrichten/">Fail2ban</a> blockt Brute-Force auf deinen SSH-Zugang – aber
was ist mit den Scannern, die den ganzen Tag deine Web-Apps nach Lücken abklopfen? CrowdSec
schließt genau diese Lücke: Es erkennt Angriffe in den Zugriffs-Logs von Traefik und sperrt
die Angreifer, bevor sie deine Anwendungen überhaupt erreichen.</p>
<h2 id="was-bauen-wir">Was bauen wir?</h2>
<p>Am Ende läuft ein <strong>CrowdSec-Agent</strong> neben deinem Traefik, der die <strong>Zugriffs-Logs</strong>
mitliest, verdächtiges Verhalten anhand von <strong>Szenarien</strong> erkennt (Port-Scans, Path-Probing,
bekannte CVE-Ausnutzung, Login-Brute-Force) und Angreifer-IPs auf eine Sperrliste setzt. Ein
<strong>Bouncer</strong> – hier als Traefik-Plugin – setzt diese Entscheidungen durch: Eine gesperrte IP
bekommt bei <strong>jeder</strong> deiner Apps nur noch <code>403 Forbidden</code>. Getestet mit <strong>CrowdSec v1.7.8</strong>,
dem <strong>Traefik-Bouncer-Plugin v1.6.0</strong> und <strong>Traefik v3.7</strong>.</p>
<p>So greifen die Teile ineinander:</p>
<ul>
<li><strong>Agent + Local API (LAPI):</strong> liest die Logs, wertet sie gegen die Szenarien aus und
verwaltet die aktiven Sperren („Decisions&quot;). Das ist der Container, den wir aufsetzen.</li>
<li><strong>Bouncer:</strong> fragt die LAPI bei jeder Anfrage „ist diese IP gesperrt?&quot; und blockt bei Ja.
Der Traefik-Bouncer läuft als Plugin direkt im Reverse Proxy – kein zusätzlicher Container.</li>
<li><strong>Community-Blocklist:</strong> CrowdSec meldet (anonymisiert) erkannte Angriffe an das zentrale
Netzwerk und bekommt dafür eine <strong>von allen Nutzern gespeiste Blocklist</strong> zurück. IPs, die
andernorts schon als bösartig auffielen, sind bei dir dann von vornherein gesperrt. Genau
das ist das „kollaborativ&quot; im Titel.</li>
</ul>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-sky-300 bg-sky-50 dark:border-sky-800 dark:bg-sky-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">ℹ️</span>CrowdSec statt fail2ban – oder zusätzlich?
  </p>
  <div class="prose-kitchen text-sm">CrowdSec ersetzt fail2ban nicht, es ergänzt es. <strong>fail2ban</strong> ist unschlagbar einfach für
<strong>einen Dienst auf dem Host</strong> (SSH). <strong>CrowdSec</strong> spielt seine Stärke bei <strong>HTTP-Apps hinter
dem Reverse Proxy</strong> aus: ein Bouncer schützt alle Apps auf einmal, die Szenarien sind
gepflegt und aktuell, und die Community-Blocklist bekommst du gratis dazu. Die saubere
Aufteilung: <strong>fail2ban bleibt auf SSH</strong>, <strong>CrowdSec übernimmt die Web-Ebene</strong>. Beide dürfen
parallel laufen.</div>
</div>
<h2 id="voraussetzungen">Voraussetzungen</h2>
<ul>
<li>Ein laufender <a href="/tutorials/reverse-proxy-traefik/">Reverse Proxy mit Traefik</a> (das
<code>proxy</code>-Netz und der Resolver <code>le</code> stammen von dort) mit mindestens einer App dahinter.</li>
<li><a href="/tutorials/fail2ban-einrichten/">Fail2ban</a> für den SSH-Schutz – CrowdSec kümmert sich
hier um die HTTP-Ebene, nicht um SSH.</li>
<li>Grundwissen zu <a href="/tutorials/docker-compose-grundlagen/">Docker Compose</a> und ein
abgesicherter Server mit aktiver <a href="/tutorials/firewall-ufw-einrichten/">Firewall</a>.</li>
</ul>
<div class="not-prose my-6 overflow-hidden rounded-xl border border-paprika-200 bg-paprika-50 dark:border-paprika-800 dark:bg-paprika-900/20">
  <div class="flex items-center justify-between border-b border-paprika-200 bg-paprika-100 px-4 py-1.5 text-xs font-semibold uppercase tracking-wide text-paprika-700 dark:border-paprika-800 dark:bg-paprika-900/40 dark:text-paprika-300">
    <span>🍳 Empfehlung</span>
    <span title="Mit * markierte Links sind Affiliate-Links.">Anzeige</span>
  </div>
  <div class="flex flex-col gap-4 p-4 sm:flex-row sm:items-center sm:justify-between">
    <div>
      <p class="text-lg font-bold text-slate-900 dark:text-white">VPS 2000 G12</p>
      <p class="mt-1 text-sm text-slate-600 dark:text-slate-300">8 vCore · 16 GB RAM · 512 GB NVMe</p>
      <p class="mt-1 text-sm font-semibold text-paprika-700 dark:text-paprika-400">ab 19,24 €/Monat</p>
      <p class="mt-2 text-sm text-slate-600 dark:text-slate-400">CrowdSec läuft mit wenigen hundert MB neben deinem bestehenden App-Stack – der VPS 2000 hat dafür genug Reserve.</p>
    </div>
    <a href="https://www.netcup.com/de/server/vps/vps-2000-g12-12m?ref=44083" rel="sponsored noopener" target="_blank"
   class="inline-flex shrink-0 items-center justify-center rounded-lg bg-paprika-600 px-5 py-2.5 font-semibold text-white transition-colors hover:bg-paprika-700">
  Zu netcup →
</a>

  </div><div class="px-4 pb-4"><p class="not-prose my-3 flex flex-wrap items-center gap-x-2 gap-y-1 rounded-lg border border-herb-500/40 bg-herb-50 px-3 py-2 text-sm text-slate-700 dark:bg-herb-900/20 dark:text-slate-200">
  <span>💶 <strong>5 € Gutschein</strong> für netcup-Neukunden:</span>
  <code class="rounded bg-white px-2 py-0.5 font-mono text-sm font-semibold text-herb-800 dark:bg-slate-800 dark:text-herb-400">36nc17844976032</code>
  <span class="text-xs text-slate-500 dark:text-slate-400">(nur Neukunden, keine Domains)</span>
</p></div>
</div>

<h2 id="schritt-für-schritt">Schritt für Schritt</h2>
<h3 id="schritt-1-traefiks-zugriffs-logs-einschalten">Schritt 1: Traefiks Zugriffs-Logs einschalten</h3>
<p>CrowdSec kann nur erkennen, was es sieht – und es sieht Angriffe über <strong>Traefiks
Zugriffs-Logs</strong>. Die sind standardmäßig aus. Öffne die <code>compose.yaml</code> deines Traefik
(aus dem <a href="/tutorials/reverse-proxy-traefik/">Traefik-Tutorial</a>, Ordner <code>~/traefik</code>) und
ergänze im <code>command</code>-Block diese drei Zeilen:</p>
<div class="sk-code">
  <span class="sk-code-head">YAML</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;--accesslog=true&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;--accesslog.filepath=/var/log/traefik/access.log&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;--accesslog.format=json&#34;</span></span></span></code></pre></div>
</div>
<p>Das JSON-Format ist wichtig – die CrowdSec-Parser erwarten es so. Damit sowohl Traefik
(schreibend) als auch CrowdSec (lesend) an dieselbe Datei kommen, legst du sie auf einen
festen Host-Pfad. Ergänze im <code>volumes</code>-Block von Traefik:</p>
<div class="sk-code">
  <span class="sk-code-head">YAML</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/var/log/traefik:/var/log/traefik</span></span></span></code></pre></div>
</div>
<p>Lege das Verzeichnis auf dem Host an und starte Traefik neu:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo mkdir -p /var/log/traefik
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> ~/traefik <span class="o">&amp;&amp;</span> docker compose up -d</span></span></code></pre></div>
</div>
<p>Ruf einmal eine deiner Apps auf und prüfe, dass Zeilen ankommen:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">tail -n <span class="m">2</span> /var/log/traefik/access.log</span></span></code></pre></div>
</div>
<p>Du solltest JSON-Zeilen mit <code>&quot;ClientHost&quot;</code>, <code>&quot;RequestPath&quot;</code> und <code>&quot;DownstreamStatus&quot;</code> sehen.
Bleibt die Datei leer, stimmt der Pfad im Volume nicht, oder es kam schlicht noch keine
Anfrage.</p>
<h3 id="schritt-2-den-crowdsec-container-aufsetzen">Schritt 2: Den CrowdSec-Container aufsetzen</h3>
<p>CrowdSec bekommt einen eigenen Ordner. Erzeuge zuerst einen <strong>Bouncer-Schlüssel</strong> – mit ihm
authentifiziert sich später der Traefik-Bouncer an der LAPI:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir -p ~/crowdsec <span class="o">&amp;&amp;</span> <span class="nb">cd</span> ~/crowdsec
</span></span><span class="line"><span class="cl">openssl rand -hex <span class="m">32</span></span></span></code></pre></div>
</div>
<p>Kopiere die Ausgabe; sie kommt gleich an <strong>zwei</strong> Stellen zum Einsatz. Lege die
<strong>Acquisition</strong> an – sie sagt CrowdSec, welche Datei mit welchem Log-Typ zu lesen ist:</p>
<div class="sk-code">
  <span class="sk-code-head">YAML</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># ~/crowdsec/acquis.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">filenames</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="l">/var/log/traefik/access.log</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">traefik</span></span></span></code></pre></div>
</div>
<p>Jetzt die <code>compose.yaml</code>. Ersetze <code>DEIN_BOUNCER_KEY</code> durch den erzeugten Schlüssel:</p>
<div class="sk-code">
  <span class="sk-code-head">YAML</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">crowdsec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">crowdsecurity/crowdsec:v1.7.8</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l">crowdsec</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">COLLECTIONS</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;crowdsecurity/traefik&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">BOUNCER_KEY_TRAEFIK</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;DEIN_BOUNCER_KEY&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">GID</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;1000&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">./acquis.yaml:/etc/crowdsec/acquis.d/traefik.yaml:ro</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/var/log/traefik:/var/log/traefik:ro</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">crowdsec-db:/var/lib/crowdsec/data/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">crowdsec-config:/etc/crowdsec/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">networks</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">proxy]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">crowdsec-db</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">crowdsec-config</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">networks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">proxy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">external</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div>
</div>
<p>Was hier wichtig ist:</p>
<ul>
<li><strong><code>COLLECTIONS: crowdsecurity/traefik</code></strong> installiert beim ersten Start die passende
Sammlung aus Parsern und Szenarien für Traefik-Logs (inklusive der HTTP-Basisszenarien).</li>
<li><strong><code>BOUNCER_KEY_TRAEFIK</code></strong> registriert direkt beim Start einen Bouncer namens <code>TRAEFIK</code>
mit <em>deinem</em> Schlüssel – das spart den Weg über <code>cscli bouncers add</code>.</li>
<li><strong><code>GID: &quot;1000&quot;</code></strong> lässt den CrowdSec-Prozess unter dieser Gruppe laufen. <code>1000</code> ist der übliche
Default für den ersten Nutzer; läuft Traefik als root, ist die <code>access.log</code> meist world-readable
und die GID ohnehin egal. Ist sie enger gesetzt, prüfe mit <code>ls -l /var/log/traefik/access.log</code>
und trag die GID der <strong>Gruppe der Datei</strong> ein.</li>
<li>Das Log ist <strong>nur lesend</strong> (<code>:ro</code>) eingebunden. CrowdSec hängt im <strong><code>proxy</code>-Netz</strong>, damit
der Traefik-Bouncer die LAPI später unter <code>crowdsec:8080</code> erreicht.</li>
</ul>
<p>Starte den Container und prüfe, dass alles greift:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose up -d
</span></span><span class="line"><span class="cl">docker <span class="nb">exec</span> crowdsec cscli collections list</span></span></code></pre></div>
</div>
<p>Die Traefik-Collection und die HTTP-Szenarien sollten als <code>enabled</code> erscheinen:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl"> crowdsecurity/base-http-scenarios    ✔️  enabled
</span></span><span class="line"><span class="cl"> crowdsecurity/http-cve               ✔️  enabled
</span></span><span class="line"><span class="cl"> crowdsecurity/traefik                ✔️  enabled</span></span></code></pre></div>
</div>
<p>Prüfe, dass die <strong>Community-Blocklist</strong> aktiv ist – das kostet nichts und ist der halbe
Nutzen von CrowdSec:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker <span class="nb">exec</span> crowdsec cscli capi status</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">You can successfully interact with Central API (CAPI)
</span></span><span class="line"><span class="cl">Sharing signals is enabled
</span></span><span class="line"><span class="cl">Pulling community blocklist is enabled
</span></span><span class="line"><span class="cl">Pulling blocklists from the console is enabled</span></span></code></pre></div>
</div>
<p><code>Pulling community blocklist is enabled</code> bestätigt, dass du die kollektive Sperrliste der
CrowdSec-Community beziehst – Angreifer, die anderswo auffällig wurden, sind bei dir schon
gesperrt, bevor sie es überhaupt versuchen.</p>
<h3 id="schritt-3-den-traefik-bouncer-einbauen">Schritt 3: Den Traefik-Bouncer einbauen</h3>
<p>Jetzt der Teil, der die Sperren durchsetzt. Der Bouncer ist ein <strong>Traefik-Plugin</strong> und
besteht aus zwei Ergänzungen an deinem Traefik: das Plugin laden und eine Middleware
definieren, die auf <strong>alle</strong> Apps wirkt.</p>
<p>Lade das Plugin, indem du im <code>command</code>-Block von <code>~/traefik/compose.yaml</code> ergänzt:</p>
<div class="sk-code">
  <span class="sk-code-head">YAML</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;--experimental.plugins.bouncer.modulename=github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;--experimental.plugins.bouncer.version=v1.6.0&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;--entrypoints.websecure.http.middlewares=crowdsec@file&#34;</span></span></span></code></pre></div>
</div>
<p>Die letzte Zeile hängt die Bouncer-Middleware <strong>global an den <code>websecure</code>-Entrypoint</strong> –
damit läuft jede HTTPS-Anfrage an jede App durch den Bouncer, ohne dass du jede App einzeln
anfassen musst. Die Middleware selbst definierst du über den <strong>File-Provider</strong>.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-amber-400 bg-amber-50 dark:border-amber-700 dark:bg-amber-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">⚠️</span>Vorhandene Entrypoint-Middlewares nicht überschreiben
  </p>
  <div class="prose-kitchen text-sm"><code>--entrypoints.websecure.http.middlewares</code> ist <strong>einwertig</strong>: Hast du im
<a href="/tutorials/reverse-proxy-traefik/">Traefik-Aufbau</a> an diesem Entrypoint schon
Middlewares gesetzt (etwa Security-Header), überschreibt ein <strong>zweites</strong> Flag den vorhandenen
Wert – dann fallen deine bisherigen Middlewares still weg. Setz also kein zweites Flag, sondern
erweitere den bestehenden Wert <strong>komma-separiert</strong>, z. B.
<code>--entrypoints.websecure.http.middlewares=header@file,crowdsec@file</code>. Nur wenn an diesem
Entrypoint bisher <strong>keine</strong> Middleware hängt, fügst du das Flag wie oben neu hinzu.</div>
</div>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-amber-400 bg-amber-50 dark:border-amber-700 dark:bg-amber-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">⚠️</span>Kein zweites File-Provider-Flag
  </p>
  <div class="prose-kitchen text-sm">Der <a href="/tutorials/reverse-proxy-traefik/">Traefik-Aufbau</a> hat den File-Provider in aller Regel
schon aktiv (etwa als <code>--providers.file.filename=…</code> oder <code>--providers.file.directory=…</code>).
Traefik erlaubt <strong>nicht</strong> gleichzeitig <code>filename</code> und <code>directory</code> – ergänze also <strong>kein</strong>
zweites Flag blind. Lege die folgende Middleware-Datei entweder in dein <strong>bestehendes</strong>
dynamic-Verzeichnis, oder – falls dein Provider auf eine einzelne <code>filename</code>-Datei zeigt –
schreib den <code>http.middlewares</code>-Block einfach dort hinein. Die Pfade unten (<code>~/traefik/dynamic</code>
bzw. <code>/etc/traefik/dynamic</code>) gelten nur, falls du schon ein Verzeichnis nutzt.</div>
</div>
<p>Lege die Middleware an (Pfad an deinen bestehenden File-Provider angepasst):</p>
<div class="sk-code">
  <span class="sk-code-head">YAML</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># ~/traefik/dynamic/crowdsec.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">http</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">middlewares</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">crowdsec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">plugin</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">bouncer</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">crowdsecMode</span><span class="p">:</span><span class="w"> </span><span class="l">stream</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">crowdsecLapiScheme</span><span class="p">:</span><span class="w"> </span><span class="l">http</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">crowdsecLapiHost</span><span class="p">:</span><span class="w"> </span><span class="l">crowdsec:8080</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">crowdsecLapiKey</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;DEIN_BOUNCER_KEY&#34;</span></span></span></code></pre></div>
</div>
<p><code>crowdsecLapiKey</code> ist <strong>derselbe</strong> Schlüssel wie in Schritt 2 – der Bouncer weist sich damit
bei der LAPI aus. Mit <code>crowdsecMode: stream</code> zieht der Bouncer die Sperrliste in einem festen
Intervall komplett vor und beantwortet jede Anfrage aus dem lokalen Cache – der vom Plugin
empfohlene Modus, weil er die LAPI nicht bei jedem Request belastet.</p>
<p>Sorg dafür, dass Traefik das Verzeichnis auch <strong>sieht</strong>. Nutzt dein bestehender File-Provider
schon ein gemountetes dynamic-Verzeichnis, liegt die neue Datei ohnehin darin – dann ist hier
nichts zu tun. Legst du das Verzeichnis neu an, ergänze es im <code>volumes</code>-Block von Traefik:</p>
<div class="sk-code">
  <span class="sk-code-head">YAML</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">./dynamic:/etc/traefik/dynamic:ro</span></span></span></code></pre></div>
</div>
<p>Starte Traefik neu, damit es das Plugin herunterlädt und die Middleware lädt:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> ~/traefik <span class="o">&amp;&amp;</span> docker compose up -d
</span></span><span class="line"><span class="cl">docker compose logs -f traefik</span></span></code></pre></div>
</div>
<p>Im Log darf <strong>kein</strong> <code>ERR</code> zum Plugin oder zur Middleware stehen (Traefik v3 loggt bei
Standard-Level nur Fehler – eine ruhige Ausgabe ist das gute Zeichen). Prüfe von der
CrowdSec-Seite, dass der Bouncer sich verbunden hat:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker <span class="nb">exec</span> crowdsec cscli bouncers list</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl"> Name     IP Address  Valid  Last API pull         Type
</span></span><span class="line"><span class="cl"> TRAEFIK  172.19.0.2  ✔️      2026-07-23T10:49:58Z  Crowdsec-Bouncer-Traefik-Plugin</span></span></code></pre></div>
</div>
<p>Ein gesetztes <code>Last API pull</code> beweist: Das Plugin spricht mit der LAPI.</p>
<h3 id="schritt-4-scharf-schalten-und-die-sperre-testen">Schritt 4: Scharf schalten und die Sperre testen</h3>
<p>Ruf eine deiner Apps auf – sie sollte <strong>ganz normal</strong> antworten:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -s -o /dev/null -w <span class="s2">&#34;%{http_code}\n&#34;</span> https://DEINE_APP.DEINE_DOMAIN/</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">200</span></span></code></pre></div>
</div>
<p>Jetzt sperrst du testweise eine IP von Hand und schaust, ob der Bouncer sie aussperrt. Nimm
deine eigene öffentliche IP (<code>curl -s https://ifconfig.me</code>):</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker <span class="nb">exec</span> crowdsec cscli decisions add --ip DEINE_TEST_IP --duration 5m --reason <span class="s2">&#34;test&#34;</span></span></span></code></pre></div>
</div>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-amber-400 bg-amber-50 dark:border-amber-700 dark:bg-amber-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">⚠️</span>Neue Sperren greifen nicht sofort
  </p>
  <div class="prose-kitchen text-sm">Der Bouncer holt sich die Entscheidungen im Hintergrund ab und <strong>cached</strong> sie – bis eine
frische Sperre wirkt, können <strong>bis zu ~60 Sekunden</strong> vergehen. Das ist kein Fehler, sondern
gewollt (weniger Last auf der LAPI). Im <strong>stream</strong>-Modus kommt die Verzögerung vom
Pull-Intervall (<code>updateIntervalSeconds</code>, Default 60 Sekunden), im <strong>live</strong>-Modus vom
Per-IP-Cache jeder Entscheidung (<code>defaultDecisionSeconds</code>, Default 60 Sekunden). Im echten
Betrieb ist das irrelevant; beim Testen musst du kurz warten. Wer die Reaktionszeit drücken
will, senkt den jeweils passenden Wert – also <code>updateIntervalSeconds</code> (stream) bzw.
<code>defaultDecisionSeconds</code> (live) – in der Middleware, statt den Modus zu wechseln.</div>
</div>
<p>Nach der Wartezeit bekommt die gesperrte IP nur noch:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -s -o /dev/null -w <span class="s2">&#34;%{http_code}\n&#34;</span> https://DEINE_APP.DEINE_DOMAIN/</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">403</span></span></code></pre></div>
</div>
<p>Heb die Test-Sperre wieder auf:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker <span class="nb">exec</span> crowdsec cscli decisions delete --ip DEINE_TEST_IP</span></span></code></pre></div>
</div>
<h3 id="schritt-5-echte-angriffe-erkennen-lassen">Schritt 5: Echte Angriffe erkennen lassen</h3>
<p>Der eigentliche Sinn: CrowdSec sperrt <strong>von selbst</strong>, ohne dass du Regeln schreibst. Sobald
ein Scanner deine Domain nach Pfaden abklopft (viele <code>404</code> in kurzer Zeit), greift das
Szenario <code>crowdsecurity/http-probing</code>. So sieht eine echte, automatisch erkannte Sperre aus:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker <span class="nb">exec</span> crowdsec cscli alerts list</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl"> ID  value              reason                       country  as                      decisions
</span></span><span class="line"><span class="cl"> 4   Ip:109.250.21.197  crowdsecurity/http-probing   DE       8881 1&amp;1 Versatel GmbH  ban:1</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker <span class="nb">exec</span> crowdsec cscli decisions list</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl"> Source    Scope:Value        Reason                       Action  Country  AS
</span></span><span class="line"><span class="cl"> crowdsec  Ip:109.250.21.197  crowdsecurity/http-probing   ban     DE       8881 1&amp;1 Versatel GmbH</span></span></code></pre></div>
</div>
<p>CrowdSec reichert die Sperre automatisch um <strong>Land und Provider (AS)</strong> an. Neben den selbst
erkannten Angriffen tauchen hier mit der Zeit auch Sperren mit der Quelle
<code>lists:crowdsecurity/...</code> auf – das ist die <strong>Community-Blocklist</strong>: IPs, die weltweit schon
negativ aufgefallen sind, blockst du, bevor sie dich das erste Mal treffen.</p>
<p>Wer die Sperren lieber grafisch statt in <code>cscli</code>-Tabellen sieht, meldet die Instanz kostenlos
in der <a href="https://app.crowdsec.net/">CrowdSec-Console</a> an (der Enroll-Befehl steht in „Wartung &amp;
Backups&quot;). Dort erscheinen dieselben Entscheidungen aufbereitet:</p>
<p><figure class="my-6"><img src="/tutorials/crowdsec-einrichten/crowdsec-console-decisions_hu_edda9bf11738a503.webp" srcset="/tutorials/crowdsec-einrichten/crowdsec-console-decisions_hu_c4a4dc9c1c0bad75.webp 480w, /tutorials/crowdsec-einrichten/crowdsec-console-decisions_hu_edda9bf11738a503.webp 768w, /tutorials/crowdsec-einrichten/crowdsec-console-decisions_hu_c963e2d6d8f9a3d2.webp 1200w, /tutorials/crowdsec-einrichten/crowdsec-console-decisions_hu_7abd8b2f243af422.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="360"
    data-full="/tutorials/crowdsec-einrichten/crowdsec-console-decisions_hu_c6e0877ac3db367b.webp"
    alt="Die CrowdSec-Console listet die aktiven Sperren als Tabelle: mehrere IP-Adressen mit der Aktion „ban&quot;, einer Ablaufzeit und dem auslösenden Szenario http-probing, jeweils „via crowdsec&quot;" title="Die CrowdSec-Console (optional, kostenlos): dieselben Entscheidungen wie in cscli, nur grafisch"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Die CrowdSec-Console (optional, kostenlos): dieselben Entscheidungen wie in cscli, nur grafisch</figcaption></figure></p>
<p>Die mit der Traefik-Collection installierten HTTP-Szenarien decken das ab, was echte Scanner
den ganzen Tag versuchen: das <strong>Abklopfen nicht existierender Pfade</strong> (<code>http-probing</code>), das
Suchen nach <strong>sensiblen Dateien und Backdoors</strong>, <strong>Path-Traversal-</strong> und <strong>SQL-Injection-/
XSS-Sondierungen</strong>, verdächtige <strong>User-Agents</strong> bekannter Scanner sowie die Ausnutzung
<strong>bekannter CVEs</strong> (aus der Collection <code>crowdsecurity/http-cve</code>). Welche Szenarien aktiv sind,
zeigt <code>docker exec crowdsec cscli scenarios list</code>.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-herb-400 bg-herb-50 dark:border-herb-700 dark:bg-herb-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">🧑‍🍳</span>Noch eine Stufe schärfer: AppSec (WAF)
  </p>
  <div class="prose-kitchen text-sm">Über das reine IP-Blocking hinaus kann CrowdSec als <strong>Web Application Firewall</strong> arbeiten und
bösartige Requests direkt am Inhalt erkennen (Virtual Patching). Das Traefik-Plugin
unterstützt diesen AppSec-Modus (ab Plugin 1.2.0 und CrowdSec 1.6.0). Für den Einstieg reicht
das hier gezeigte Szenario-basierte Blocking; AppSec ist der lohnende nächste Ausbauschritt,
wenn eine besonders exponierte App zusätzlichen Schutz braucht.</div>
</div>
<p>Ob CrowdSec deine Logs überhaupt liest, zeigt die Metrik-Übersicht:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker <span class="nb">exec</span> crowdsec cscli metrics</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">| Source                           | Lines read | Lines parsed |
</span></span><span class="line"><span class="cl">| file:/var/log/traefik/access.log | 54         | 54           |</span></span></code></pre></div>
</div>
<p>Steht dort <code>Lines read: 0</code>, kommt kein Log an – dann zurück zu Schritt 1.</p>
<h3 id="schritt-6-dich-selbst-nicht-aussperren">Schritt 6: Dich selbst nicht aussperren</h3>
<p>Ein Fehlalarm gegen deine eigene Wartungs-IP ist ärgerlich. Trag deine feste IP als
<strong>vertrauenswürdig</strong> in die Middleware ein – der Bouncer prüft sie dann gar nicht erst.
Ergänze in <code>~/traefik/dynamic/crowdsec.yaml</code> unter <code>bouncer:</code>:</p>
<div class="sk-code">
  <span class="sk-code-head">YAML</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">          </span><span class="nt">clientTrustedIPs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span>- <span class="s2">&#34;DEINE_FESTE_IP/32&#34;</span></span></span></code></pre></div>
</div>
<p>Hast du dich doch einmal selbst gesperrt, hebt ein Befehl die Sperre sofort auf – und im
Notfall kommst du über die <a href="/tutorials/netcup-snapshots-scp/">VNC-Konsole im SCP</a> immer noch
auf den Server:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker <span class="nb">exec</span> crowdsec cscli decisions delete --ip DEINE_IP   <span class="c1"># eine IP</span>
</span></span><span class="line"><span class="cl">docker <span class="nb">exec</span> crowdsec cscli decisions delete --all           <span class="c1"># alle Sperren</span></span></span></code></pre></div>
</div>
<h2 id="wenn-es-nicht-funktioniert">Wenn es nicht funktioniert</h2>
<p><strong>Symptom:</strong> Eine frisch gesetzte Sperre wirkt nicht, die IP bekommt weiter <code>200</code>.</p>
<p><strong>Ursache &amp; Lösung:</strong> Der Bouncer cached die Entscheidungen und zieht neue im
stream-Modus erst nach dem Pull-Intervall (bis zu ~60 Sekunden). Kurz warten. Wer die
Reaktionszeit drücken will, senkt <code>updateIntervalSeconds</code> in der Middleware (Schritt 3).</p>
<p><strong>Symptom:</strong> <code>cscli metrics</code> zeigt für die Log-Datei <code>Lines read: 0</code>.</p>
<p><strong>Ursache &amp; Lösung:</strong> CrowdSec liest die Logs nicht. Prüfe, dass Traefik wirklich nach
<code>/var/log/traefik/access.log</code> schreibt (Schritt 1), dass <strong>beide</strong> Container denselben
Host-Pfad einbinden und dass die <code>acquis.yaml</code> genau diesen Pfad nennt.</p>
<p><strong>Symptom:</strong> Nach dem Neustart von Traefik bekommen <strong>alle</strong> Apps einen Fehler oder laden nicht.</p>
<p><strong>Ursache &amp; Lösung:</strong> Im <strong>stream</strong>-Modus (oben gesetzt) kann der Bouncer nach mehreren
fehlgeschlagenen LAPI-Pulls dichtmachen – gesteuert über <code>updateMaxFailure</code>. Ist die
CrowdSec-LAPI nicht erreichbar, blockt der Bouncer dann im Zweifel, statt ungeschützt
durchzulassen. Das ist sicher, macht CrowdSec aber zu einer <strong>kritischen Komponente</strong>: Läuft
der <code>crowdsec</code>-Container nicht, ist deine Seite betroffen. Prüfe mit <code>docker ps</code>, dass er
<code>Up</code> ist; <code>restart: unless-stopped</code> (oben gesetzt) holt ihn nach einem Neustart automatisch
zurück.</p>
<p><strong>Symptom:</strong> CrowdSec sperrt lauter harmlose oder gar keine echten Besucher – die erkannte
IP ist immer die deines CDNs.</p>
<p><strong>Ursache &amp; Lösung:</strong> Sitzt ein CDN wie Cloudflare <strong>vor</strong> Traefik, sieht Traefik nur dessen
IP. Dann die echte Client-IP aus dem <code>X-Forwarded-For</code>-Header lesen lassen: In der Middleware
<code>forwardedHeadersTrustedIPs</code> mit den CDN-Netzen füllen – sonst sperrst du am Ende das CDN.
Direkt an netcup (ohne CDN) ist hier nichts zu tun.</p>
<p><strong>Symptom:</strong> <code>docker compose up -d</code> bei Traefik meldet einen Plugin-Fehler.</p>
<p><strong>Ursache &amp; Lösung:</strong> Traefik lädt das Plugin beim Start aus dem Netz. Prüfe, dass der Server
raus darf (die <a href="/tutorials/netcup-firewall-einrichten/">netcup-Firewall</a> sperrt <strong>ausgehend</strong>
nichts, UFW ebenso wenig) und dass <code>modulename</code> und <code>version</code> exakt stimmen.</p>
<h2 id="wartung--backups">Wartung &amp; Backups</h2>
<ul>
<li>
<p><strong>Szenarien aktuell halten.</strong> CrowdSecs Stärke sind gepflegte Erkennungsregeln – zieh sie
regelmäßig nach: <code>docker exec crowdsec cscli hub update &amp;&amp; docker exec crowdsec cscli hub upgrade</code>. Das Image (<code>crowdsecurity/crowdsec</code>) und die <strong>Plugin-Version</strong> (<code>v1.6.0</code>) hebst
du bewusst an; lies bei Hauptversionen die Release-Notes. CrowdSec entwickelt sich zügig –
ein guter Kandidat für regelmäßige Versionsprüfung.</p>
</li>
<li>
<p><strong>Zugriffs-Log rotieren.</strong> Traefiks <code>/var/log/traefik/access.log</code> wächst sonst unbegrenzt.
Richte eine logrotate-Regel ein – zwingend mit <strong><code>copytruncate</code></strong>: Diese Variante kopiert
die Datei weg und leert das Original <em>an Ort und Stelle</em>, statt es umzubenennen und neu
anzulegen. Nur so behält CrowdSecs Tail den Dateizugriff (bei rename/create verlöre es den
Handle und läse nichts mehr). Lege <code>/etc/logrotate.d/traefik</code> an:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/var/log/traefik/access.log {
</span></span><span class="line"><span class="cl">    daily
</span></span><span class="line"><span class="cl">    rotate 7
</span></span><span class="line"><span class="cl">    compress
</span></span><span class="line"><span class="cl">    missingok
</span></span><span class="line"><span class="cl">    notifempty
</span></span><span class="line"><span class="cl">    copytruncate
</span></span><span class="line"><span class="cl">}</span></span></code></pre></div>
</div>
<p>CrowdSec liest nach dem Truncate an der wieder wachsenden Datei ganz normal weiter – ein
Neustart des Containers ist nicht nötig.</p>
</li>
<li>
<p><strong>fail2ban bleibt.</strong> Nimm fail2ban nicht heraus – es schützt weiter deinen SSH-Zugang auf
Host-Ebene, während CrowdSec die Web-Apps abdeckt. Zwei Werkzeuge, zwei Zuständigkeiten.</p>
</li>
<li>
<p><strong>Backups.</strong> Sichern musst du vor allem deine <strong>Konfiguration</strong>: den Ordner <code>~/crowdsec</code>
(<code>compose.yaml</code>, <code>acquis.yaml</code>) und <code>~/traefik/dynamic/crowdsec.yaml</code> mit dem Bouncer-Key.
Nimm sie in dein <a href="/tutorials/backups-mit-restic/">Restic-Backup</a> auf. Die Sperrlisten selbst
sind flüchtig und bauen sich von allein wieder auf – kein Backup nötig.</p>
</li>
<li>
<p><strong>Optional: das CrowdSec-Dashboard.</strong> Wer die Angriffe grafisch sehen will, meldet die
Instanz kostenlos in der <a href="https://app.crowdsec.net/">CrowdSec Console</a> an
(<code>docker exec crowdsec cscli console enroll DEIN_ENROLL_KEY</code>). Die Community-Blocklist läuft
auch ohne Anmeldung.</p>
</li>
<li>
<p><strong>In dein Monitoring einbinden.</strong> <code>cscli metrics</code> liefert dir Zahlen fürs Terminal; für
Dauerbeobachtung stellt CrowdSec einen Prometheus-Endpunkt bereit (in der Config unter
<code>prometheus:</code> aktivieren), den du an deinen
<a href="/tutorials/monitoring-grafana-prometheus/">Grafana-Stack</a> hängen kannst. Dann siehst du
Sperren nach Herkunft und Szenario auf einen Blick:</p>
<p><figure class="my-6"><img src="/tutorials/crowdsec-einrichten/crowdsec-grafana-dashboard_hu_8bd997c51a0109f8.webp" srcset="/tutorials/crowdsec-einrichten/crowdsec-grafana-dashboard_hu_85da309d33836a60.webp 480w, /tutorials/crowdsec-einrichten/crowdsec-grafana-dashboard_hu_8bd997c51a0109f8.webp 768w, /tutorials/crowdsec-einrichten/crowdsec-grafana-dashboard_hu_12642426104bdc6e.webp 1200w, /tutorials/crowdsec-einrichten/crowdsec-grafana-dashboard_hu_77ebda5030498e47.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="294"
    data-full="/tutorials/crowdsec-einrichten/crowdsec-grafana-dashboard_hu_3ffd0326f36807b2.webp"
    alt="Ein Grafana-Dashboard mit CrowdSec-Metriken: rund 15.000 aktive Sperren gesamt, aufgeschlüsselt nach Herkunft (Community-Blocklist vs. lokal erkannt) und nach Szenario wie ssh:bruteforce, generic:scan und http-probing" title="CrowdSec in Grafana: aktive Sperren nach Herkunft und Szenario, gespeist aus dem Prometheus-Endpunkt"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">CrowdSec in Grafana: aktive Sperren nach Herkunft und Szenario, gespeist aus dem Prometheus-Endpunkt</figcaption></figure></p>
</li>
<li>
<p><strong>Ehrlich zum Aufwand:</strong> Nach dem Aufsetzen läuft CrowdSec weitgehend allein. Plane einmal
im Monat den <code>hub upgrade</code> und einen Blick auf <code>cscli metrics</code> und die Container-Version ein.</p>
</li>
</ul>
]]></content:encoded></item></channel></rss>