Zum Inhalt springen
Serverküche
Suche

Die Suche wird geladen … (nur in der veröffentlichten Seite verfügbar).

Sicherheit Schwierigkeit: Fortgeschritten

Fail2ban einrichten: Brute-Force-Angriffe automatisch blocken

Fail2ban überwacht deine Logs und sperrt IPs nach zu vielen Fehlversuchen – mit sicherer Whitelist für die eigene Adresse, damit du dich nicht aussperrst.

· 8 Min. Lesezeit ·Dauer: ca. 40 Minuten
Inhaltsverzeichnis

Sieh dir nach ein paar Tagen im Internet einmal journalctl -u ssh an: Hunderte Login-Versuche von fremden IPs, im Sekundentakt. Solange dein SSH auf Schlüssel-Login umgestellt ist, kommt davon keiner rein – aber es rauscht im Log und frisst Ressourcen. Fail2ban liest diese Logs mit und sperrt automatisch, wer es zu oft erfolglos probiert.

Was bauen wir?

Am Ende überwacht Fail2ban 1.1 auf deinem Debian 13 die SSH-Anmeldungen und sperrt nach zu vielen Fehlversuchen die angreifende IP für eine festgelegte Zeit – per Firewall-Regel. Deine eigene IP steht auf einer Whitelist, damit dich das nie selbst trifft. Du kannst Sperren einsehen, manuell setzen und wieder aufheben.

Voraussetzungen

Schritt für Schritt

Bevor wir konfigurieren, drei Begriffe, die das ganze Werkzeug erklären:

  • Filter – ein Muster, das eine „fehlgeschlagene Anmeldung" im Log erkennt (für SSH bringt Fail2ban das fertig mit).
  • Jail („Gefängnis") – verbindet einen Filter mit einer Log-Quelle und den Regeln „wie oft in welchem Zeitraum". Das sshd-Jail überwacht die SSH-Logins.
  • Action – was beim Überschreiten passiert: Standardmäßig eine Firewall-Regel, die die IP für bantime blockt.

Kurz: Filter erkennt Fehlversuche → Jail zählt sie → Action sperrt. Alles, was du unten konfigurierst, ist eine dieser drei Stellschrauben.

Schritt 1: Fail2ban installieren

Terminal
sudo apt update
sudo apt install -y fail2ban

Prüfe die Version:

Terminal
fail2ban-client --version
Ausgabe
Fail2Ban v1.1.0

Debian sperrt ab sofort – noch ohne deine Whitelist

Das Debian-Paket startet und aktiviert den Dienst schon beim Installieren, und /etc/fail2ban/jail.d/defaults-debian.conf schaltet dabei das sshd-Jail direkt ein. Fail2ban sperrt also ab diesem Moment – mit den Standardwerten aus jail.conf (10 Minuten Sperre nach 5 Fehlversuchen in 10 Minuten) und ohne deine eigene IP auf der Whitelist. Mach deshalb sofort mit Schritt 2 weiter.

Schritt 2: Eigene Konfiguration in jail.local

Nie jail.conf bearbeiten

Die mitgelieferte /etc/fail2ban/jail.conf wird bei Updates überschrieben. Eigene Einstellungen gehören immer in /etc/fail2ban/jail.local – diese Datei bleibt erhalten und überschreibt die Standardwerte.

Lege die Datei an:

Terminal
sudo nano /etc/fail2ban/jail.local
INI
[DEFAULT]
# Wie lange gesperrt wird
bantime = 1h
# Zeitfenster, in dem die Fehlversuche zählen
findtime = 10m
# So viele Fehlversuche sind erlaubt, dann Ban
maxretry = 5
# Deine eigene(n) IP(s) – wird NIE gesperrt
ignoreip = 127.0.0.1/8 ::1 DEINE_EIGENE_IP

[sshd]
enabled = true

Zeile für Zeile:

  • bantime = 1h – Sperrdauer. Für hartnäckige Fälle siehe die Eskalation in Schritt 5.
  • findtime + maxretry – „5 Fehlversuche innerhalb von 10 Minuten → Ban".
  • ignoreip – die wichtigste Zeile: Trage hier deine eigene IP 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.
  • [sshd] enabled = true – aktiviert das SSH-Gefängnis („Jail"). Auf Debian ist es über defaults-debian.conf ohnehin schon an; explizit in der eigenen Datei zu stehen schadet nicht und macht sichtbar, was läuft.

Erst die eigene IP eintragen

Trage deine eigene IP in ignoreip ein, bevor du die Konfiguration in Schritt 3 übernimmst – sonst kann dich schon ein eigener Tippfehler beim Login aussperren. Die Adresse, von der du gerade verbunden bist, zeigt dir das erste Feld von echo "$SSH_CLIENT".

Debian 13 liest das systemd-Journal

Auf Debian 13 nutzt Fail2ban standardmäßig das systemd-Journal als Quelle – du musst keinen logpath (etwa /var/log/auth.log) angeben. Die Datei existiert auf modernen Systemen oft gar nicht mehr; das Journal ist die richtige Quelle und funktioniert ohne Zusatzkonfiguration.

Schritt 3: Konfiguration übernehmen

Prüfe zuerst, ob die Datei syntaktisch stimmt – das erspart dir einen Dienst, der nach dem Reload nicht mehr hochkommt:

Terminal
sudo fail2ban-client -t
Ausgabe
OK: configuration test is successful

Jetzt die neue Konfiguration übernehmen:

Terminal
sudo systemctl reload fail2ban

Der Reload ist der entscheidende Schritt. Der Dienst läuft ja schon seit der Installation – ein systemctl start (oder enable --now) macht bei einem laufenden Dienst gar nichts, deine jail.local bliebe unbeachtet und es gälten weiter Debians Standardwerte. Nach jeder Änderung an jail.local also erneut reload.

Dass Fail2ban nach einem Reboot von selbst wieder startet, hat das Paket schon eingerichtet – nachsehen kostet nichts:

Terminal
systemctl is-enabled fail2ban
Ausgabe
enabled

Kommt hier disabled, hol es mit sudo systemctl enable --now fail2ban nach. Und der Blick auf den Dienst selbst:

Terminal
sudo systemctl status fail2ban

Du solltest active (running) sehen.

Schritt 4: Status prüfen

So siehst du, welche Jails aktiv sind:

Terminal
sudo fail2ban-client status
Ausgabe
Status
|- Number of jail:	1
`- Jail list:	sshd

Und die Details des SSH-Jails:

Terminal
sudo fail2ban-client status sshd
Ausgabe
Status for the jail: sshd
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	0
|  `- Journal matches:	_SYSTEMD_UNIT=ssh.service + _COMM=sshd
`- Actions
   |- Currently banned:	0
   |- Total banned:	0
   `- Banned IP list:

Die Zeile Journal matches bestätigt, dass Fail2ban das systemd-Journal liest. Currently banned steigt, sobald jemand zu oft danebengreift – und das summiert sich: Auf unserem Testserver zählte Fail2ban in elf Tagen Laufzeit 9.494 Fehlversuche und 481 Sperren – rund 860 Anmeldeversuche und 44 Bans pro Tag, ohne dass wir irgendetwas dafür tun mussten.

Ob wirklich deine Werte gelten und nicht mehr Debians Standard, fragst du direkt ab:

Terminal
sudo fail2ban-client get sshd bantime
Ausgabe
3600

3600 Sekunden sind die Stunde aus deiner jail.local. Steht hier noch 600, hat der Reload aus Schritt 3 gefehlt – dann läuft Fail2ban weiter mit den Standardwerten.

Schritt 5: Sperren verwalten – und Bans eskalieren

Eine IP von Hand entsperren (z. B. wenn ein Kollege sich vertippt hat):

Terminal
sudo fail2ban-client set sshd unbanip 203.0.113.45

Eine IP sofort sperren:

Terminal
sudo fail2ban-client set sshd banip 203.0.113.45

Beide Befehle antworten mit der Zahl der IPs, die sie tatsächlich angefasst haben:

Ausgabe
1

Kommt eine 0 zurück, ist nichts passiert – beim Entsperren heißt das meist, dass die IP gar nicht gesperrt war (Tippfehler in der Adresse).

Gegen besonders hartnäckige Angreifer lohnt sich eskalierende Sperrzeit: Wer wiederkommt, wird länger gesperrt. Ergänze im [DEFAULT]-Block:

INI
bantime.increment = true
bantime.maxtime = 1w

Damit verdoppelt Fail2ban die Sperrzeit bei jedem erneuten Auffallen derselben IP – bis maximal eine Woche. Nach der Änderung sudo systemctl reload fail2ban. Dass die Eskalation wirklich aktiv ist, bestätigt dir – wie in Schritt 4 – eine direkte Abfrage:

Terminal
sudo fail2ban-client get sshd bantime.increment
Ausgabe
True

Wenn es nicht funktioniert

Du hast dich selbst ausgesperrt. ignoreip fehlte oder enthielt die falsche IP. Verbinde dich über die Konsole im netcup SCP (unabhängig von SSH) und entsperre dich mit sudo fail2ban-client set sshd unbanip DEINE_EIGENE_IP. Trage deine IP anschließend in ignoreip ein und lade neu. Deshalb steht die Whitelist in Schritt 2 an erster Stelle.

fail2ban.service startet nicht (systemctl status zeigt „failed"). Fast immer ein Tippfehler in jail.local. Prüfe die Syntax mit sudo fail2ban-client -t (Testmodus) – der Befehl nennt die fehlerhafte Zeile.

Deine Werte aus jail.local greifen nicht. Es wird nur 10 Minuten gesperrt, oder die eigene IP fliegt trotz ignoreip raus. Fast immer fehlt der Reload – der Dienst lief schon, bevor du die erste eigene Zeile geschrieben hast, und start/enable --now tut bei einem laufenden Dienst nichts. Was wirklich gilt, zeigen sudo fail2ban-client get sshd bantime (600 = Debian-Standard, 3600 = deine Stunde) und sudo fail2ban-client get sshd ignoreip; übernommen wird es mit sudo systemctl reload fail2ban.

Es wird nie jemand gesperrt, obwohl das Log voller Fehlversuche ist. Prüfe mit sudo fail2ban-client status sshd, ob Total failed überhaupt steigt. Bleibt es bei 0, findet der Filter die Einträge nicht – meist, weil eine veraltete Anleitung einen logpath auf eine nicht existierende Datei gesetzt hat. Auf Debian 13 den logpath aus jail.local entfernen und das Journal nutzen (Schritt 2).

Sperren „wirken" nicht – die IP verbindet sich weiter. Auf Debian 13 sperrt Fail2ban per nftables (banaction = nftables aus defaults-debian.conf). Sichtbar wird das mit sudo nft list table inet f2b-table: Dort steht die Kette f2b-chain und darin ein Adress-Set addr-set-sshd mit den gesperrten IPs. sudo iptables -L -n | grep f2b liefert dagegen nichts – das ist kein Fehler, sondern die falsche Werkzeugebene, an der ältere Anleitungen hängen bleiben. Fehlt die Tabelle ganz, hakt das Zusammenspiel mit der Firewall – Dienst neu starten und /var/log/fail2ban.log ansehen.

Wartung & Backups

  • Sperren im Blick behalten: sudo fail2ban-client status sshd zeigt jederzeit, wie viele IPs aktuell gesperrt sind. Die Historie steht nicht im Journal, sondern in einer eigenen Datei – Fail2ban loggt laut logtarget in /etc/fail2ban/fail2ban.conf nach /var/log/fail2ban.log:

    Terminal
    sudo grep -E "Ban|Unban" /var/log/fail2ban.log | tail -5
    Ausgabe
    2026-08-16 01:36:52,583 fail2ban.actions        [326875]: NOTICE  [sshd] Ban 203.0.113.45

    journalctl -u fail2ban zeigt dagegen nur Start, Reload und Fehler des Dienstes.

  • Weitere Jails: Sobald Dienste mit eigenem Login dazukommen (z. B. eine Web-App), kannst du passende Jails aktivieren – nach demselben Muster wie [sshd].

  • jail.local sichern: Deine Konfiguration ist schnell wiederhergestellt, gehört aber ins Backup deiner Server-Konfiguration.

  • Nächster Schritt CrowdSec: Fail2ban schützt deinen Host anhand deiner Logs. Der moderne Nachfolger CrowdSec ergänzt das um eine kollaborative Angriffsabwehr (geteilte Blocklisten) und wertet die Zugriffs-Logs deines Reverse Proxy aus – sinnvoll, sobald Web-Apps dazukommen. Für den Einstieg ist Fail2ban genau richtig.

Damit ist das Sicherheits-Fundament komplett: Schlüssel-Login, zwei Firewall-Ebenen (UFW + netcup-Firewall), automatische Updates und aktiver Brute-Force-Schutz. Dein Server ist jetzt nicht nur eingerichtet, sondern solide abgesichert.

Zuletzt aktualisiert: 26.08.2026

Feedback per E-Mail: feedback@serverkueche.de

Wie geht's weiter?

Das könnte dir auch schmecken

Erste Schritte mit einem netcup VPS
Grundlagen Einsteiger

Erste Schritte mit einem netcup VPS

Vom bestellten Server zum einsatzbereiten System: SSH-Login, Updates, ein sudo-Benutzer und die wichtigsten Handgriffe …

· 5 Min. Lesezeit