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:
| Teil | Was er tut | Beispiel für SSH |
|---|---|---|
| Filter | Erkennt 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.
Aktualisieren Sie die Paketliste und installieren Sie fail2ban:
bash apt update apt install fail2banfail2ban– das Programm selbst. Als Abhängigkeit wird auchpython3-systemdinstalliert, womit es das Systemjournal lesen kann.
Prüfen Sie, dass das Werkzeug
nft, das fail2ban zum Sperren verwendet, verfügbar ist:bash command -v nft || apt install nftablescommand -v nft– gibt den Pfad zum Programmnftaus, falls es existiert.||– der nächste Befehl läuft nur, wenn der vorherige fehlgeschlagen ist, also wennnftfehlt.apt install nftables– installiert das Werkzeug. Die Installation schaltet keine Regeln ein und ändert UFW nicht.
Prüfen Sie, dass der Dienst läuft:
bash systemctl status fail2banSuchen 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/. 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#
Erstellen Sie die Datei:
bash nano /etc/fail2ban/jail.localFügen Sie dies ein:
/etc/ fail2ban/ inijail.local [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 = 5Speichern 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].
| Einstellung | Was sie tut | Empfohlener Wert | Wann ändern |
|---|---|---|---|
ignoreip | Adressen und Bereiche, die fail2ban nie sperrt. Durch Leerzeichen getrennt. 127.0.0.1/8 ::1 ist der VPS selbst. | 127.0.0.1/8 ::1 | Fü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. |
bantime | Wie lange eine Adresse gesperrt bleibt. Einheiten: m Minuten, h Stunden, d Tage, w Wochen. Der Standard ist 10m. | 1h | Kürzer (30m), wenn Sie sich oft vertippen und die Konsole nicht griffbereit haben. |
findtime | Das Zeitfenster, in dem Fehlversuche gezählt werden. | 10m | Länger (1h) gegen langsame Angriffe, die alle paar Minuten ein Passwort probieren. |
maxretry | Wie 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. | 5 | 3 für SSH mit ausgeschalteten Passwörtern (ein legitimer Benutzer mit Schlüssel macht keine Fehler). |
bantime.increment | Jede weitere Sperre derselben Adresse dauert länger. Fail2ban führt die Historie in einer Datenbank. | true | false, wenn Sie immer dieselbe Zeit möchten. |
bantime.factor | Der Wachstumsfaktor. Mit dem Wert 1 wächst die Zeit 1, 2, 4, 8… × bantime. | 1 | Höher (2) für schnelleres Wachstum. |
bantime.maxtime | Die Obergrenze, über die die Sperrzeit nicht hinauswächst. | 1w | Länger (4w) für sehr hartnäckige Angreifer. |
enabled | Schaltet das Jail ein. Jails sind standardmäßig aus. | true | false schaltet das Jail vorübergehend aus. |
port | Welche Ports für die Adresse gesperrt werden. ssh bedeutet Port 22. | ssh | Läuft SSH auf einem anderen Port, schreiben Sie ihn als Zahl, zum Beispiel 2222 (siehe unten). |
backend | Woher Aufzeichnungen gelesen werden. systemd = das Systemjournal, auto = die Datei aus logpath. | systemd für sshd, auto für recidive | Nie, außer Sie wissen, warum. Debian 13 hat keine Datei /var/log/auth.log, SSH muss also das Journal lesen. |
logpath | Die Datei mit den Aufzeichnungen (nur für backend = auto). | /var/log/fail2ban.log | Ändert sich nicht. |
banaction | Wie 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:
nano /etc/fail2ban/fail2ban.local[Definition]
dbpurgeage = 8d| Einstellung | Was sie tut | Empfohlener Wert | Wann ändern |
|---|---|---|---|
dbpurgeage | Nach welcher Zeit alte Sperreinträge aus der Datenbank /var/ gelöscht werden. Der Standard ist 1d. | 8d | Immer etwas länger als das längste bantime und bantime.maxtime. |
Starten und prüfen#
Prüfen Sie die Konfiguration:
bash fail2ban-client -t-t– Konfigurationstest. Bei Erfolg gibt erOK: configuration test is successfulaus. Bei einem Fehler nennt er Datei und Problem.
Starten Sie fail2ban neu, damit es die neuen Einstellungen lädt:
bash systemctl restart fail2banListen Sie die aktiven Jails auf:
bash fail2ban-client statusAusgabetext Status |- Number of jail: 2 `- Jail list: recidive, sshdZeigen Sie den Status des Jails
sshd:bash fail2ban-client status sshdAusgabetext 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
| Zeile | Bedeutung |
|---|---|
Currently failed | Wie viele Adressen gerade mindestens einen Fehlversuch im Fenster findtime haben, aber noch nicht gesperrt sind. |
Total failed | Die Anzahl der seit dem Start von fail2ban erfassten Fehlversuche. |
Journal matches | Welche Journaleinträge das Jail liest. Unter Ubuntu kann es abweichen (sshd.service); das beeinflusst die Funktion nicht. |
Currently banned | Wie viele Adressen gerade gesperrt sind. |
Total banned | Wie viele Sperren es seit dem Start gab. |
Banned IP list | Die 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:
| Befehl | Was er tut |
|---|---|
fail2ban-client set sshd unbanip 198.51.100.25 | Entsperrt die Adresse im Jail sshd. |
fail2ban-client unban 198.51.100.25 | Entsperrt die Adresse in allen Jails (einschließlich recidive) und löscht sie aus der Datenbank. |
fail2ban-client unban --all | Entsperrt alle Adressen in allen Jails. Angreifer werden bei weiteren Versuchen erneut gesperrt. |
fail2ban-client banned 198.51.100.25 | Zeigt, 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 refusedoderConnection timed out, obwohl es eben noch funktioniert hat. - Aus einem anderen Netz (mobile Daten) verbinden Sie sich problemlos.
- Hat
recidiveSie 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:
[sshd]
enabled = true
port = 2222
backend = systemdport = 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:
[nginx-http-auth]
enabled = true
backend = auto
[nginx-botsearch]
enabled = true
backend = auto| Jail | Was es überwacht |
|---|---|
nginx-http-auth | Falsche Passwörter auf passwortgeschützten Seiten (HTTP Basic Auth). |
nginx-botsearch | Bots, 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:
nft list table inet f2b-tablenft 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#
Versuchen Sie, eine Testadresse von Hand zu sperren:
bash fail2ban-client set sshd banip 198.51.100.25Prüfen Sie, dass sie in der Firewall steht:
nft list table inet f2b-tablemuss die Adresse198.51.100.25enthalten.Entsperren Sie sie:
fail2ban-client set sshd unbanip 198.51.100.25.Prüfen Sie nach ein bis zwei Stunden
fail2ban-client status sshd. Auf einem öffentlichen VPS sindTotal failedundTotal bannedin 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.lognach Aktionsfehlern (zum Beispielnft: not found). Installieren Sie dann das Paketnftables. - Prüfen Sie, dass der
portim Jail zum tatsächlichen SSH-Port passt.
Wo Sie Details finden#
tail -n 50 /var/log/fail2ban.log
journalctl -u fail2ban -n 50tail -n 50 /var/log/fail2ban.log– die letzten 50 Zeilen des fail2ban-Logs (SperrenBan, EntsperrungenUnban, 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 injail.conf. - SSH liest das Journal (
backend = systemd),recidiveliest eine Datei (backend = auto). - Entsperren:
fail2ban-client set sshd unbanip <IP>oderfail2ban-client unban <IP>; haben Sie sich ausgesperrt, verwenden Sie die Konsole. - Nach dem Verschieben von SSH aktualisieren Sie den
portim Jailsshd.