Zum Inhalt springen
Aktueller Gutschein:10 % RabattIn der Bestellung einlösen

Fail2ban: Angriffe auf SSH automatisch blockieren

Fail2ban beobachtet fehlgeschlagene Anmeldungen und sperrt Angreifer automatisch. Installation unter Ubuntu 24.04 und Debian 13, jail.local Zeile für Zeile erklärt, recidive, Entsperren einer IP und Fehlerbehebung.

  • Fortgeschrittene
  • ~20 Min.
  • Aktualisiert am 9.10.2026

Fail2ban beobachtet die Anmeldeaufzeichnungen und sperrt eine IP-Adresse vorübergehend in der Firewall, wenn sie immer wieder ein falsches Passwort eingibt. Sie installieren es, legen sinnvolle Regeln fest, einschließlich einer härteren Strafe für Wiederholungstäter, und lernen, wie Sie eine Adresse entsperren, falls es Sie selbst trifft.

Was Sie brauchen

  • Ein StormHost-VPS mit Ubuntu 24.04 oder Debian 13
  • Eine SSH-Verbindung als root (Anleitung)
  • Die geöffnete Browser-Konsole, falls Sie sich selbst sperren
  • Etwa 20 Minuten

Was fail2ban tut#

Fail2ban arbeitet mit Jails. Jedes Jail überwacht einen Dienst und hat drei Teile:

TeilWas er tutBeispiel für SSH
FilterErkennt einen fehlgeschlagenen Versuch in den Aufzeichnungen und extrahiert daraus die IP-Adresse.Zeilen Failed password for root from 198.51.100.25.
Log-Quelle (Backend)Woher die Aufzeichnungen gelesen werden: aus dem Systemjournal oder einer Datei.Das Journal des SSH-Dienstes.
Aktion (banaction)Was mit einer Adresse passiert, die das Limit überschreitet.Fügt sie zu den gesperrten Adressen in der Firewall (nftables) hinzu.

Wenn eine Adresse innerhalb von findtime maxretry Fehlversuche macht, sperrt fail2ban sie für bantime. Ist die Zeit abgelaufen, entsperrt es sie von selbst.

Fail2ban ersetzt keinen SSH-Schlüssel

Fail2ban bremst Angreifer und hält die Logs sauber, schützt aber nicht vollständig davor, dass ein schwaches Passwort erraten wird. Die beste Kombination ist ein SSH-Schlüssel mit ausgeschalteten Passwörtern plus fail2ban.

Installation#

Das gilt für Ubuntu 24.04 und Debian 13.

  1. Aktualisieren Sie die Paketliste und installieren Sie fail2ban:

    bash
    apt update
    apt install fail2ban
    • fail2ban – das Programm selbst. Als Abhängigkeit wird auch python3-systemd installiert, womit es das Systemjournal lesen kann.
  2. Prüfen Sie, dass das Werkzeug nft, das fail2ban zum Sperren verwendet, verfügbar ist:

    bash
    command -v nft || apt install nftables
    • command -v nft – gibt den Pfad zum Programm nft aus, falls es existiert.
    • || – der nächste Befehl läuft nur, wenn der vorherige fehlgeschlagen ist, also wenn nft fehlt.
    • apt install nftables – installiert das Werkzeug. Die Installation schaltet keine Regeln ein und ändert UFW nicht.
  3. Prüfen Sie, dass der Dienst läuft:

    bash
    systemctl status fail2ban

    Suchen Sie die Zeile Active: active (running). Beenden Sie die Ausgabe mit q.

Direkt nach der Installation schützt fail2ban SSH bereits mit den Standardeinstellungen der Distribution: Das Jail sshd ist eingeschaltet, liest Aufzeichnungen aus dem Systemjournal und sperrt über nftables. Die Standardsperre dauert aber nur 10 Minuten, passen Sie die Einstellungen also an.

Warum jail.local und nicht jail.conf#

Die Standardeinstellungen stehen in /etc/fail2ban/jail.conf und in /etc/fail2ban/jail.d/defaults-debian.conf. Bearbeiten Sie diese Dateien nicht; ein Paket-Update könnte sie überschreiben. Ihre eigenen Einstellungen gehören in /etc/fail2ban/jail.local. Fail2ban liest die Dateien in der Reihenfolge jail.conf › jail.d/*.conf › jail.local › jail.d/*.local, und ein späterer Wert überschreibt immer einen früheren.

Konfiguration Zeile für Zeile#

  1. Erstellen Sie die Datei:

    bash
    nano /etc/fail2ban/jail.local
  2. Fügen Sie dies ein:

    /etc/fail2ban/jail.localini
    [DEFAULT]
    # Adressen, die nie gesperrt werden (durch Leerzeichen getrennt)
    ignoreip = 127.0.0.1/8 ::1
    # Dauer der ersten Sperre
    bantime = 1h
    # Zeitfenster, in dem Fehlversuche gezaehlt werden
    findtime = 10m
    # Anzahl der Fehlversuche, die eine Sperre ausloest
    maxretry = 5
    # Wiederholungstaeter laenger sperren
    bantime.increment = true
    bantime.factor = 1
    bantime.maxtime = 1w
    
    [sshd]
    enabled = true
    port = ssh
    backend = systemd
    
    [recidive]
    enabled = true
    backend = auto
    logpath = /var/log/fail2ban.log
    banaction = %(banaction_allports)s
    bantime = 1w
    findtime = 1d
    maxretry = 5
  3. Speichern Sie (Strg+O, Eingabe) und schließen Sie den Editor (Strg+X).

Abschnitte in eckigen Klammern: [DEFAULT] gilt für alle Jails; [sshd] und [recidive] gelten nur für das jeweilige Jail und haben Vorrang vor [DEFAULT].

EinstellungWas sie tutEmpfohlener WertWann ändern
ignoreipAdressen und Bereiche, die fail2ban nie sperrt. Durch Leerzeichen getrennt. 127.0.0.1/8 ::1 ist der VPS selbst.127.0.0.1/8 ::1Fügen Sie Ihre IP-Adresse nur hinzu, wenn sie statisch ist (ein Büro, ein eigener Server). Fügen Sie nicht die dynamische Adresse eines Heimanschlusses hinzu; nach einer Weile bekommt sie jemand anderes.
bantimeWie lange eine Adresse gesperrt bleibt. Einheiten: m Minuten, h Stunden, d Tage, w Wochen. Der Standard ist 10m.1hKürzer (30m), wenn Sie sich oft vertippen und die Konsole nicht griffbereit haben.
findtimeDas Zeitfenster, in dem Fehlversuche gezählt werden.10mLänger (1h) gegen langsame Angriffe, die alle paar Minuten ein Passwort probieren.
maxretryWie viele Fehlversuche innerhalb von findtime zu einer Sperre führen. Mit 3 sperren Sie sich durch einen Tippfehler selbst; mit 10 bekommt ein Angreifer mehr Versuche.53 für SSH mit ausgeschalteten Passwörtern (ein legitimer Benutzer mit Schlüssel macht keine Fehler).
bantime.incrementJede weitere Sperre derselben Adresse dauert länger. Fail2ban führt die Historie in einer Datenbank.truefalse, wenn Sie immer dieselbe Zeit möchten.
bantime.factorDer Wachstumsfaktor. Mit dem Wert 1 wächst die Zeit 1, 2, 4, 8… × bantime.1Höher (2) für schnelleres Wachstum.
bantime.maxtimeDie Obergrenze, über die die Sperrzeit nicht hinauswächst.1wLänger (4w) für sehr hartnäckige Angreifer.
enabledSchaltet das Jail ein. Jails sind standardmäßig aus.truefalse schaltet das Jail vorübergehend aus.
portWelche Ports für die Adresse gesperrt werden. ssh bedeutet Port 22.sshLäuft SSH auf einem anderen Port, schreiben Sie ihn als Zahl, zum Beispiel 2222 (siehe unten).
backendWoher Aufzeichnungen gelesen werden. systemd = das Systemjournal, auto = die Datei aus logpath.systemd für sshd, auto für recidiveNie, außer Sie wissen, warum. Debian 13 hat keine Datei /var/log/auth.log, SSH muss also das Journal lesen.
logpathDie Datei mit den Aufzeichnungen (nur für backend = auto)./var/log/fail2ban.logÄndert sich nicht.
banactionWie gesperrt wird. %(banaction_allports)s = alle Ports sperren, nicht nur SSH.%(banaction_allports)sÄndert sich nicht.

Recidive: härtere Strafe für Wiederholungstäter#

Das Jail recidive liest die eigenen Aufzeichnungen von fail2ban (/var/log/fail2ban.log). Erhält dieselbe Adresse innerhalb von findtime (1 Tag) mindestens maxretry (5) Sperren in einem beliebigen Jail, sperrt recidive sie für bantime (1 Woche) und auf allen Ports. Ein Angreifer, der immer wiederkommt, verliert so den Zugriff auf den VPS vollständig.

Deshalb liest recidive eine Datei (backend = auto) und nicht das Journal: Fail2ban schreibt seine Aufzeichnungen in die Datei /var/log/fail2ban.log, nicht ins Journal.

Damit fail2ban sich die Sperrhistorie lange genug merkt (für bantime.increment und für die Wiederherstellung wochenlanger Sperren nach einem Neustart), verlängern Sie die Aufbewahrung in der Datenbank:

bash
nano /etc/fail2ban/fail2ban.local
/etc/fail2ban/fail2ban.localini
[Definition]
dbpurgeage = 8d
EinstellungWas sie tutEmpfohlener WertWann ändern
dbpurgeageNach welcher Zeit alte Sperreinträge aus der Datenbank /var/lib/fail2ban/fail2ban.sqlite3 gelöscht werden. Der Standard ist 1d.8dImmer etwas länger als das längste bantime und bantime.maxtime.

Starten und prüfen#

  1. Prüfen Sie die Konfiguration:

    bash
    fail2ban-client -t
    • -t – Konfigurationstest. Bei Erfolg gibt er OK: configuration test is successful aus. Bei einem Fehler nennt er Datei und Problem.
  2. Starten Sie fail2ban neu, damit es die neuen Einstellungen lädt:

    bash
    systemctl restart fail2ban
  3. Listen Sie die aktiven Jails auf:

    bash
    fail2ban-client status
    Ausgabetext
    Status
    |- Number of jail:	2
    `- Jail list:	recidive, sshd
  4. Zeigen Sie den Status des Jails sshd:

    bash
    fail2ban-client status sshd
    Ausgabetext
    Status for the jail: sshd
    |- Filter
    |  |- Currently failed:	2
    |  |- Total failed:	57
    |  `- Journal matches:	_SYSTEMD_UNIT=ssh.service + _COMM=sshd
    `- Actions
       |- Currently banned:	3
       |- Total banned:	12
       `- Banned IP list:	198.51.100.25 198.51.100.40 198.51.100.77
ZeileBedeutung
Currently failedWie viele Adressen gerade mindestens einen Fehlversuch im Fenster findtime haben, aber noch nicht gesperrt sind.
Total failedDie Anzahl der seit dem Start von fail2ban erfassten Fehlversuche.
Journal matchesWelche Journaleinträge das Jail liest. Unter Ubuntu kann es abweichen (sshd.service); das beeinflusst die Funktion nicht.
Currently bannedWie viele Adressen gerade gesperrt sind.
Total bannedWie viele Sperren es seit dem Start gab.
Banned IP listDie Liste der aktuell gesperrten Adressen.

IP-Adresse entsperren#

Wenn Sie sich selbst gesperrt haben, melden Sie sich über die Browser-Konsole an (oder aus einem anderen Netz, zum Beispiel über mobile Daten) und verwenden Sie einen dieser Befehle:

BefehlWas er tut
fail2ban-client set sshd unbanip 198.51.100.25Entsperrt die Adresse im Jail sshd.
fail2ban-client unban 198.51.100.25Entsperrt die Adresse in allen Jails (einschließlich recidive) und löscht sie aus der Datenbank.
fail2ban-client unban --allEntsperrt alle Adressen in allen Jails. Angreifer werden bei weiteren Versuchen erneut gesperrt.
fail2ban-client banned 198.51.100.25Zeigt, in welchen Jails die Adresse gesperrt ist.

Ersetzen Sie 198.51.100.25 durch Ihre öffentliche IP-Adresse. Kennen Sie sie nicht, finden Sie sie in der Banned IP list nach der Uhrzeit (Sperreinträge: grep "Ban " /var/log/fail2ban.log | tail), oder öffnen Sie auf dem Computer, von dem Sie sich verbinden, eine beliebige Seite „Wie ist meine IP-Adresse“.

Ihre Adresse finden Sie auch, während Sie per SSH angemeldet sind: echo $SSH_CLIENT gibt als ersten Wert die Adresse aus, von der Sie sich verbinden.

Woran Sie erkennen, dass Sie selbst gesperrt sind#

  • SSH meldet plötzlich Connection refused oder Connection timed out, obwohl es eben noch funktioniert hat.
  • Aus einem anderen Netz (mobile Daten) verbinden Sie sich problemlos.
  • Hat recidive Sie gesperrt, funktionieren für Sie auch andere Dienste auf dem VPS nicht (Website, Gameserver), während sie bei anderen funktionieren.
  • In der Konsole sehen Sie Ihre Adresse in der Ausgabe von fail2ban-client status sshd.

Der Kundenbereich und Passwortänderungen

Die Registerkarten Dateien und Datenbank melden sich per SSH mit einem Passwort am VPS an. Wenn Sie das Root-Passwort ändern und die Registerkarten mehrmals versuchen, sich mit dem alten anzumelden, kann fail2ban auch die Adresse sperren, von der sich der Kundenbereich verbindet. Tragen Sie deshalb direkt nach der Passwortänderung das neue unter Dateien › Zugangsdaten ändern ein. Funktioniert die Registerkarte bereits nicht mehr, führen Sie fail2ban-client unban --all aus und geben Sie die Zugangsdaten erneut ein.

SSH auf einem anderen Port#

Wenn Sie SSH verschoben haben (zum Beispiel auf 2222), aktualisieren Sie die Zeile im Abschnitt [sshd] der jail.local:

/etc/fail2ban/jail.localini
[sshd]
enabled = true
port = 2222
backend = systemd
  • port = 2222 – fail2ban sperrt diesen Port für den Angreifer. Mit dem falschen Port hätte eine Sperre keine Wirkung. Mehrere Ports trennen Sie mit Komma: port = 22,2222.

Führen Sie dann fail2ban-client -t und systemctl restart fail2ban aus.

Weitere Jails: Nginx#

Wenn Sie auf dem VPS eine Website mit Nginx betreiben, können Sie auch sie überwachen. Fügen Sie in jail.local hinzu:

/etc/fail2ban/jail.localini
[nginx-http-auth]
enabled = true
backend = auto

[nginx-botsearch]
enabled = true
backend = auto
JailWas es überwacht
nginx-http-authFalsche Passwörter auf passwortgeschützten Seiten (HTTP Basic Auth).
nginx-botsearchBots, die nach bekannten verwundbaren Adressen suchen (/wp-login.php, /phpmyadmin und so weiter).
  • backend = auto – Nginx schreibt in die Datei /var/log/nginx/error.log, nicht ins Journal. Ohne diese Zeile würde das Jail unter Ubuntu das Journal lesen und nichts finden.

Fail2ban und die Firewall#

Fail2ban sperrt über nftables in seiner eigenen Tabelle f2b-table. Es funktioniert daher neben UFW und der Firewall im Kundenbereich und überschreibt keine davon. Die gesperrten Adressen sehen Sie mit:

bash
nft list table inet f2b-table
  • nft list table inet f2b-table – gibt die Tabelle von fail2ban aus, einschließlich der Sets (addr-set-sshd …) mit den gesperrten Adressen.

Wenn Sie die gesperrten Adressen direkt in ufw status sehen möchten, setzen Sie in [DEFAULT] die Zeile banaction = ufw (UFW muss eingeschaltet sein). Setzen Sie dann auch für das Jail recidive banaction = ufw. Das standardmäßige nftables ist allerdings schneller, und wir empfehlen es.

Fail2ban schützt nur, was im VPS läuft. Die Firewall im Kundenbereich steuert es nicht.

Überprüfung#

  1. Versuchen Sie, eine Testadresse von Hand zu sperren:

    bash
    fail2ban-client set sshd banip 198.51.100.25
  2. Prüfen Sie, dass sie in der Firewall steht: nft list table inet f2b-table muss die Adresse 198.51.100.25 enthalten.

  3. Entsperren Sie sie: fail2ban-client set sshd unbanip 198.51.100.25.

  4. Prüfen Sie nach ein bis zwei Stunden fail2ban-client status sshd. Auf einem öffentlichen VPS sind Total failed und Total banned in der Regel bald ungleich null.

Fehlerbehebung#

fail2ban-client -t meldet einen Fehler#

Die Ausgabe nennt Datei und Abschnitt. Meist ist es ein Tippfehler in einem Einstellungsnamen, ein fehlendes = oder ein Wert ohne Einheit. Korrigieren Sie die Datei und führen Sie den Test erneut aus.

Have not found any log file for sshd jail#

Das Jail sshd versucht, die Datei /var/log/auth.log zu lesen, die unter Debian 13 nicht existiert. Der Abschnitt [sshd] muss backend = systemd enthalten.

No module named 'asynchat' (Ubuntu 24.04)#

Die ursprüngliche fail2ban-Version in Ubuntu 24.04 funktionierte nicht mit Python 3.12. Die Korrektur ist in den Distributions-Updates: Führen Sie apt update && apt full-upgrade aus und dann systemctl restart fail2ban.

Fail2ban meldet Adressen als gesperrt, aber der Angreifer probiert weiter Passwörter#

  • Suchen Sie in /var/log/fail2ban.log nach Aktionsfehlern (zum Beispiel nft: not found). Installieren Sie dann das Paket nftables.
  • Prüfen Sie, dass der port im Jail zum tatsächlichen SSH-Port passt.

Wo Sie Details finden#

bash
tail -n 50 /var/log/fail2ban.log
journalctl -u fail2ban -n 50
  • tail -n 50 /var/log/fail2ban.log – die letzten 50 Zeilen des fail2ban-Logs (Sperren Ban, Entsperrungen Unban, Fehler).
  • journalctl -u fail2ban -n 50 – die letzten 50 Einträge des Dienstes; nützlich, wenn fail2ban gar nicht startet.

Zusammenfassung

  • Fail2ban sperrt IP-Adressen nach wiederholt fehlgeschlagenen Anmeldungen; installieren Sie es mit apt install fail2ban.
  • Ihre eigenen Einstellungen gehören in /etc/fail2ban/jail.local, nie in jail.conf.
  • SSH liest das Journal (backend = systemd), recidive liest eine Datei (backend = auto).
  • Entsperren: fail2ban-client set sshd unbanip <IP> oder fail2ban-client unban <IP>; haben Sie sich ausgesperrt, verwenden Sie die Konsole.
  • Nach dem Verschieben von SSH aktualisieren Sie den port im Jail sshd.

Anleitungen durchsuchen