<?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>Fail2ban – Serverküche</title><link>https://serverkueche.de/tags/fail2ban/</link><description>Fail2ban – 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>Sat, 18 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://serverkueche.de/tags/fail2ban/index.xml" rel="self" type="application/rss+xml"/><item><title>Fail2ban einrichten: Brute-Force-Angriffe automatisch blocken</title><link>https://serverkueche.de/tutorials/fail2ban-einrichten/</link><pubDate>Sat, 18 Jul 2026 00:00:00 +0000</pubDate><author>feedback@serverkueche.de (Serverküche)</author><guid>https://serverkueche.de/tutorials/fail2ban-einrichten/</guid><description>Fail2ban überwacht deine Logs und sperrt IPs nach zu vielen Fehlversuchen – mit sicherer Whitelist für die eigene Adresse, damit du dich nicht aussperrst.</description><content:encoded><![CDATA[<p>Sieh dir nach ein paar Tagen im Internet einmal <code>journalctl -u ssh</code> an: Hunderte
Login-Versuche von fremden IPs, im Sekundentakt. Solange dein SSH auf
<a href="/tutorials/ssh-absichern/">Schlüssel-Login umgestellt</a> ist, kommt davon keiner rein –
aber es rauscht im Log und frisst Ressourcen. <strong>Fail2ban</strong> liest diese Logs mit und
<strong>sperrt automatisch</strong>, wer es zu oft erfolglos probiert.</p>
<h2 id="was-bauen-wir">Was bauen wir?</h2>
<p>Am Ende überwacht <strong>Fail2ban 1.1</strong> auf deinem <strong>Debian 13</strong> die SSH-Anmeldungen und
sperrt nach zu vielen Fehlversuchen die angreifende IP für eine festgelegte Zeit –
per Firewall-Regel. Deine <strong>eigene IP steht auf einer Whitelist</strong>, damit dich das nie
selbst trifft. Du kannst Sperren einsehen, manuell setzen und wieder aufheben.</p>
<h2 id="voraussetzungen">Voraussetzungen</h2>
<ul>
<li>Ein <a href="/tutorials/ssh-absichern/">abgesicherter Server</a> (Schlüssel-Login) mit
<a href="/tutorials/firewall-ufw-einrichten/">aktiver Firewall</a></li>
<li>Deine <strong>eigene öffentliche IP</strong> – finde sie z. B. über
<a href="https://www.wieistmeineip.de">wieistmeineip.de</a> oder <code>curl -s ifconfig.me</code> von
deinem lokalen Rechner</li>
</ul>
<h2 id="schritt-für-schritt">Schritt für Schritt</h2>
<p>Bevor wir konfigurieren, drei Begriffe, die das ganze Werkzeug erklären:</p>
<ul>
<li><strong>Filter</strong> – ein Muster, das eine „fehlgeschlagene Anmeldung&quot; im Log erkennt (für
SSH bringt Fail2ban das fertig mit).</li>
<li><strong>Jail</strong> („Gefängnis&quot;) – verbindet einen Filter mit einer Log-Quelle und den
Regeln „wie oft in welchem Zeitraum&quot;. Das <code>sshd</code>-Jail überwacht die SSH-Logins.</li>
<li><strong>Action</strong> – was beim Überschreiten passiert: Standardmäßig eine <strong>Firewall-Regel</strong>,
die die IP für <code>bantime</code> blockt.</li>
</ul>
<p>Kurz: Filter erkennt Fehlversuche → Jail zählt sie → Action sperrt. Alles, was du
unten konfigurierst, ist eine dieser drei Stellschrauben.</p>
<h3 id="schritt-1-fail2ban-installieren">Schritt 1: Fail2ban installieren</h3>
<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 apt update
</span></span><span class="line"><span class="cl">sudo apt install -y fail2ban</span></span></code></pre></div>
</div>
<p>Prüfe die Version:</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">fail2ban-client --version</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">Fail2Ban v1.1.0</span></span></code></pre></div>
</div>
<h3 id="schritt-2-eigene-konfiguration-in-jaillocal">Schritt 2: Eigene Konfiguration in jail.local</h3>
<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>Nie jail.conf bearbeiten
  </p>
  <div class="prose-kitchen text-sm">Die mitgelieferte <code>/etc/fail2ban/jail.conf</code> wird bei Updates überschrieben. Eigene
Einstellungen gehören <strong>immer</strong> in <code>/etc/fail2ban/jail.local</code> – diese Datei bleibt
erhalten und überschreibt die Standardwerte.</div>
</div>
<p>Lege die Datei an:</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 nano /etc/fail2ban/jail.local</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">INI</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="k">[DEFAULT]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Wie lange gesperrt wird</span>
</span></span><span class="line"><span class="cl"><span class="na">bantime</span> <span class="o">=</span> <span class="s">1h</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Zeitfenster, in dem die Fehlversuche zählen</span>
</span></span><span class="line"><span class="cl"><span class="na">findtime</span> <span class="o">=</span> <span class="s">10m</span>
</span></span><span class="line"><span class="cl"><span class="c1"># So viele Fehlversuche sind erlaubt, dann Ban</span>
</span></span><span class="line"><span class="cl"><span class="na">maxretry</span> <span class="o">=</span> <span class="s">5</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Deine eigene(n) IP(s) – wird NIE gesperrt</span>
</span></span><span class="line"><span class="cl"><span class="na">ignoreip</span> <span class="o">=</span> <span class="s">127.0.0.1/8 ::1 DEINE_EIGENE_IP</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">[sshd]</span>
</span></span><span class="line"><span class="cl"><span class="na">enabled</span> <span class="o">=</span> <span class="s">true</span></span></span></code></pre></div>
</div>
<p>Zeile für Zeile:</p>
<ul>
<li><strong><code>bantime = 1h</code></strong> – Sperrdauer. Für hartnäckige Fälle siehe die Eskalation in
Schritt 5.</li>
<li><strong><code>findtime</code> + <code>maxretry</code></strong> – „5 Fehlversuche innerhalb von 10 Minuten → Ban&quot;.</li>
<li><strong><code>ignoreip</code></strong> – die wichtigste Zeile: Trage hier <strong>deine eigene IP</strong> ein, damit du
dich nicht selbst aussperrst. Hast du eine wechselnde IP zu Hause, nutze besser den
Zugang über einen festen Punkt (später VPN) statt einer weiten Freigabe.</li>
<li><strong><code>[sshd] enabled = true</code></strong> – aktiviert das SSH-Gefängnis („Jail&quot;).</li>
</ul>
<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>Erst die eigene IP eintragen
  </p>
  <div class="prose-kitchen text-sm">Setze deine eigene IP in <code>ignoreip</code>, <strong>bevor</strong> du Fail2ban startest – sonst kann dich
schon ein eigener Tippfehler beim Login aussperren. Die Adresse, von der du gerade
verbunden bist, zeigt dir das erste Feld von <code>echo &quot;$SSH_CLIENT&quot;</code>.</div>
</div>
<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>Debian 13 liest das systemd-Journal
  </p>
  <div class="prose-kitchen text-sm">Auf Debian 13 nutzt Fail2ban standardmäßig das <strong>systemd-Journal</strong> als Quelle – du
musst <strong>keinen <code>logpath</code></strong> (etwa <code>/var/log/auth.log</code>) angeben. Die Datei existiert auf
modernen Systemen oft gar nicht mehr; das Journal ist die richtige Quelle und
funktioniert ohne Zusatzkonfiguration.</div>
</div>
<h3 id="schritt-3-dienst-starten-und-aktivieren">Schritt 3: Dienst starten und aktivieren</h3>
<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 systemctl <span class="nb">enable</span> --now fail2ban</span></span></code></pre></div>
</div>
<p><code>enable --now</code> startet den Dienst sofort <strong>und</strong> sorgt dafür, dass er nach einem
Reboot automatisch wieder läuft. Prüfe, dass er sauber läuft:</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 systemctl status fail2ban</span></span></code></pre></div>
</div>
<p>Du solltest <code>active (running)</code> sehen. Nach jeder Änderung an <code>jail.local</code> lädst du
die Konfiguration mit <code>sudo systemctl reload fail2ban</code> neu.</p>
<h3 id="schritt-4-status-prüfen">Schritt 4: Status prüfen</h3>
<p>So siehst du, welche Jails aktiv sind:</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 fail2ban-client 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">Status
</span></span><span class="line"><span class="cl">|- Number of jail:	1
</span></span><span class="line"><span class="cl">`- Jail list:	sshd</span></span></code></pre></div>
</div>
<p>Und die Details des SSH-Jails:</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 fail2ban-client status sshd</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">Status for the jail: sshd
</span></span><span class="line"><span class="cl">|- Filter
</span></span><span class="line"><span class="cl">|  |- Currently failed:	0
</span></span><span class="line"><span class="cl">|  |- Total failed:	0
</span></span><span class="line"><span class="cl">|  `- Journal matches:	_SYSTEMD_UNIT=ssh.service + _COMM=sshd
</span></span><span class="line"><span class="cl">`- Actions
</span></span><span class="line"><span class="cl">   |- Currently banned:	0
</span></span><span class="line"><span class="cl">   |- Total banned:	0
</span></span><span class="line"><span class="cl">   `- Banned IP list:</span></span></code></pre></div>
</div>
<p>Die Zeile <code>Journal matches</code> bestätigt, dass Fail2ban das systemd-Journal liest.
<code>Currently banned</code> steigt, sobald jemand zu oft danebengreift.</p>
<h3 id="schritt-5-sperren-verwalten--und-bans-eskalieren">Schritt 5: Sperren verwalten – und Bans eskalieren</h3>
<p>Eine IP von Hand entsperren (z. B. wenn ein Kollege sich vertippt 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">sudo fail2ban-client <span class="nb">set</span> sshd unbanip 203.0.113.45</span></span></code></pre></div>
</div>
<p>Eine IP sofort sperren:</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 fail2ban-client <span class="nb">set</span> sshd banip 203.0.113.45</span></span></code></pre></div>
</div>
<p>Gegen besonders hartnäckige Angreifer lohnt sich <strong>eskalierende Sperrzeit</strong>: Wer
wiederkommt, wird länger gesperrt. Ergänze im <code>[DEFAULT]</code>-Block:</p>
<div class="sk-code">
  <span class="sk-code-head">INI</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="na">bantime.increment</span> <span class="o">=</span> <span class="s">true</span>
</span></span><span class="line"><span class="cl"><span class="na">bantime.maxtime</span> <span class="o">=</span> <span class="s">1w</span></span></span></code></pre></div>
</div>
<p>Damit verdoppelt Fail2ban die Sperrzeit bei jedem erneuten Auffallen derselben IP –
bis maximal eine Woche. Nach der Änderung <code>sudo systemctl reload fail2ban</code>.</p>
<h2 id="wenn-es-nicht-funktioniert">Wenn es nicht funktioniert</h2>
<p><strong>Symptom:</strong> Du hast dich selbst ausgesperrt.</p>
<p><strong>Ursache &amp; Lösung:</strong> <code>ignoreip</code> fehlte oder enthielt die falsche IP. Verbinde dich
über die <strong>Konsole im netcup SCP</strong> (unabhängig von SSH) und entsperre dich mit
<code>sudo fail2ban-client set sshd unbanip DEINE_EIGENE_IP</code>. Trage deine IP anschließend in
<code>ignoreip</code> ein und lade neu. Deshalb steht die Whitelist in Schritt 2 an erster Stelle.</p>
<p><strong>Symptom:</strong> <code>fail2ban.service</code> startet nicht (<code>systemctl status</code> zeigt „failed&quot;).</p>
<p><strong>Ursache &amp; Lösung:</strong> Fast immer ein Tippfehler in <code>jail.local</code>. Prüfe die Syntax mit
<code>sudo fail2ban-client -t</code> (Testmodus) – der Befehl nennt die fehlerhafte Zeile.</p>
<p><strong>Symptom:</strong> Es wird nie jemand gesperrt, obwohl das Log voller Fehlversuche ist.</p>
<p><strong>Ursache &amp; Lösung:</strong> Prüfe mit <code>sudo fail2ban-client status sshd</code>, ob <code>Total failed</code>
überhaupt steigt. Bleibt es bei 0, findet der Filter die Einträge nicht – meist, weil
eine veraltete Anleitung einen <code>logpath</code> auf eine nicht existierende Datei gesetzt
hat. Auf Debian 13 den <code>logpath</code> aus <code>jail.local</code> <strong>entfernen</strong> und das Journal nutzen
(Schritt 2).</p>
<p><strong>Symptom:</strong> Sperren „wirken&quot; nicht – die IP verbindet sich weiter.</p>
<p><strong>Ursache &amp; Lösung:</strong> Fail2ban trägt seine Blockregeln in dieselbe Firewall
(nftables/iptables) ein wie UFW. Prüfe mit <code>sudo nft list ruleset | grep f2b</code> (bzw.
<code>sudo iptables -L -n | grep f2b</code>), ob die <code>f2b</code>-Ketten existieren. Fehlen sie, hakt
das Zusammenspiel mit der Firewall – Dienst neu starten und Logs ansehen.</p>
<h2 id="wartung--backups">Wartung &amp; Backups</h2>
<ul>
<li><strong>Sperren im Blick behalten:</strong> <code>sudo fail2ban-client status sshd</code> zeigt jederzeit,
wie viele IPs aktuell gesperrt sind. Ein Blick ins Journal (<code>journalctl -u fail2ban</code>)
zeigt die Historie.</li>
<li><strong>Weitere Jails:</strong> Sobald Dienste mit eigenem Login dazukommen (z. B. eine Web-App),
kannst du passende Jails aktivieren – nach demselben Muster wie <code>[sshd]</code>.</li>
<li><strong><code>jail.local</code> sichern:</strong> Deine Konfiguration ist schnell wiederhergestellt, gehört
aber ins Backup deiner Server-Konfiguration.</li>
<li><strong>Ausblick CrowdSec:</strong> Fail2ban schützt deinen Host anhand <em>deiner</em> Logs. Der
moderne Nachfolger <strong>CrowdSec</strong> ergänzt das später um eine <em>kollaborative</em>
Angriffsabwehr (geteilte Blocklisten) – wir bauen ihn in einem eigenen Rezept auf,
sobald der Reverse Proxy steht. Für den Einstieg ist Fail2ban genau richtig.</li>
</ul>
<p>Damit ist das Sicherheits-Fundament komplett: Schlüssel-Login, zwei Firewall-Ebenen
(<a href="/tutorials/firewall-ufw-einrichten/">UFW</a> +
<a href="/tutorials/netcup-firewall-einrichten/">netcup-Firewall</a>),
<a href="/tutorials/automatische-updates-unattended-upgrades/">automatische Updates</a> und
aktiver Brute-Force-Schutz. Dein Server ist jetzt nicht nur eingerichtet, sondern
solide abgesichert.</p>
]]></content:encoded></item></channel></rss>