Was ist Fail2Ban?

Fail2Ban ist ein in Python geschriebener Daemon, der Logdateien auf fehlgeschlagene Authentifizierungsversuche überwacht und bei wiederholten Fehlversuchen die Quell-IP automatisch sperrt. Es arbeitet regelbasiert: Sobald eine konfigurierbare Anzahl an Fehlversuchen innerhalb eines Zeitfensters erkannt wird, wird eine Firewall-Regel erstellt, die den Angreifer für eine bestimmte Dauer blockiert.

Ohne Fail2Ban steht dein SSH-Port offen für Brute-Force-Angriffe. In der Praxis sieht man in /var/log/auth.log oft tausende Login-Versuche pro Tag von automatisierten Bots. Fail2Ban reduziert diese Angriffsfläche drastisch.

Installation auf Debian/Ubuntu

Die Installation ist unkompliziert:

sudo apt update
sudo apt install fail2ban -y

Nach der Installation läuft Fail2Ban als systemd-Service. Überprüfe den Status:

sudo systemctl status fail2ban
sudo systemctl enable fail2ban

Wichtig: Bearbeite niemals die Dateien /etc/fail2ban/jail.conf oder /etc/fail2ban/fail2ban.conf direkt. Diese werden bei Updates überschrieben. Nutze stattdessen immer /etc/fail2ban/jail.local bzw. Dateien unter /etc/fail2ban/jail.d/.

Wie Jails funktionieren

Ein Jail ist die zentrale Konfigurationseinheit in Fail2Ban. Jedes Jail besteht aus drei Komponenten:

  • Filter – Ein regulärer Ausdruck, der fehlgeschlagene Login-Versuche in der Logdatei erkennt.
  • Logpfad – Die Datei, die überwacht wird (z.B. /var/log/auth.log).
  • Action – Was bei einer Sperre passiert, typischerweise eine Firewall-Regel.

Die Standardkonfiguration in jail.conf enthält bereits vordefinierte Jails für viele Dienste. Allerdings sind die meisten standardmäßig deaktiviert – du musst sie explizit in deiner jail.local aktivieren.

SSH-Jail konfigurieren

Erstelle die lokale Konfigurationsdatei:

sudo nano /etc/fail2ban/jail.local

Füge folgende Konfiguration ein:

[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
banaction = iptables-multiport
ignoreip = 127.0.0.1/8 ::1

[sshd]
enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 3
bantime  = 24h

Die Parameter im Detail:

  • maxretry – Anzahl der erlaubten Fehlversuche, bevor die IP gebannt wird.
  • findtime – Zeitfenster, in dem die Fehlversuche gezählt werden.
  • bantime – Dauer der Sperre. Unterstützt Suffixe wie m (Minuten), h (Stunden), d (Tage). Der Wert -1 sperrt permanent.

Nach jeder Änderung muss Fail2Ban neu geladen werden:

sudo systemctl restart fail2ban

Benutzerdefinierte Jails erstellen

Nginx-Jail gegen HTTP-Brute-Force

Erstelle zuerst den Filter unter /etc/fail2ban/filter.d/nginx-auth.conf:

[Definition]
failregex = no user/password was provided for basic authentication.*client: <HOST>
            user .* was not found in ".*":.*client: <HOST>
            user .* password mismatch.*client: <HOST>
ignoreregex =

Dann das Jail in /etc/fail2ban/jail.local hinzufügen:

[nginx-auth]
enabled  = true
port     = http,https
filter   = nginx-auth
logpath  = /var/log/nginx/error.log
maxretry = 5
bantime  = 2h
findtime = 10m

Prosody-Jail für XMPP-Server

Wer einen Prosody-XMPP-Server betreibt, kennt das Problem: Bots versuchen sich permanent mit zufälligen Credentials anzumelden. Erstelle den Filter /etc/fail2ban/filter.d/prosody-auth.conf:

[Definition]
failregex = Failed authentication attempt \(not-authorized\) for user .* from IP: <HOST>
ignoreregex =

Und das zugehörige Jail:

[prosody-auth]
enabled  = true
port     = 5222,5223,5269
filter   = prosody-auth
logpath  = /var/log/prosody/prosody.log
maxretry = 5
bantime  = 6h
findtime = 10m

Hinweis: Damit Prosody die IP-Adressen in das Log schreibt, muss in der Prosody-Konfiguration das entsprechende Logging aktiviert sein. Prüfe log = { info = "/var/log/prosody/prosody.log" } in deiner prosody.cfg.lua.

Monitoring mit fail2ban-client

Fail2Ban bringt ein mächtiges CLI-Tool mit. Hier die wichtigsten Befehle:

# Gesamtstatus aller Jails anzeigen
sudo fail2ban-client status

# Status eines bestimmten Jails
sudo fail2ban-client status sshd

# Eine IP manuell entbannen
sudo fail2ban-client set sshd unbanip 203.0.113.42

# Eine IP manuell bannen
sudo fail2ban-client set sshd banip 198.51.100.10

# Alle gebannten IPs eines Jails auflisten
sudo fail2ban-client get sshd banip --with-time

Die Ausgabe von fail2ban-client status sshd zeigt dir die aktuelle Anzahl der gebannten IPs, die überwachte Logdatei und die Gesamtanzahl der erkannten Fehlversuche. Das ist besonders nützlich, um zu prüfen, ob deine Filter korrekt greifen.

Banzeiten und Findtime tunen

Die richtige Balance zwischen Sicherheit und Benutzerfreundlichkeit ist entscheidend. Hier einige bewährte Strategien:

Progressive Banzeiten lassen sich über die bantime.increment-Option realisieren. Wiederholungstäter werden damit exponentiell länger gesperrt:

[DEFAULT]
bantime           = 1h
bantime.increment = true
bantime.factor    = 24
bantime.formula   = ban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)
bantime.maxtime   = 4w

Mit dieser Konfiguration wird die Banzeit bei jedem weiteren Vergehen multipliziert – beim ersten Ban 1 Stunde, beim zweiten bereits 24 Stunden, und so weiter bis maximal 4 Wochen. Persistente Angreifer werden so effektiv ausgesperrt.

Für findtime empfehle ich einen Wert zwischen 10 und 30 Minuten. Ein zu kurzes Zeitfenster lässt langsame Brute-Force-Angriffe durch, ein zu langes erzeugt Fehlalarme bei legitimen Nutzern.

IPs whitelisten

Die Option ignoreip im [DEFAULT]-Block schützt bestimmte IPs vor Bans. Das ist unverzichtbar, um sich nicht selbst auszusperren:

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 10.0.0.0/8 2001:db8::/32

Du kannst auch ganze Subnetze und IPv6-Adressen angeben. Trage hier auf jeden Fall deine eigene statische IP ein, falls du eine hast. Für dynamische IPs bietet sich ein VPN als Zwischenschritt an.

Integration mit iptables und nftables

Fail2Ban unterstützt verschiedene Firewall-Backends. Standardmäßig wird iptables verwendet. Die Action bestimmt, wie Bans umgesetzt werden:

# In /etc/fail2ban/jail.local

# Für iptables (Standard)
[DEFAULT]
banaction = iptables-multiport

# Für nftables (moderner)
[DEFAULT]
banaction = nftables-multiport

Wer bereits auf nftables migriert hat, sollte unbedingt die banaction umstellen. Fail2Ban erstellt dann automatisch die passenden nftables-Regeln. Prüfe die aktiven Regeln mit:

# iptables-Regeln anzeigen
sudo iptables -L f2b-sshd -n -v

# nftables-Regeln anzeigen
sudo nft list ruleset | grep -A 5 f2b

Für eine vollständige Lösung kannst du Fail2Ban auch mit E-Mail-Benachrichtigungen kombinieren. Setze dafür die Action auf %(action_mwl)s, was den Ban ausführt, eine Mail mit Whois-Informationen und den relevanten Logzeilen verschickt:

[sshd]
enabled  = true
action   = %(action_mwl)s
maxretry = 3

Zusammenfassung

Fail2Ban ist eines der einfachsten und effektivsten Werkzeuge zur Absicherung eines Linux-Servers. Die wichtigsten Punkte:

  • Immer jail.local statt jail.conf bearbeiten.
  • SSH-Jail mit niedrigem maxretry und langer bantime konfigurieren.
  • Eigene Filter für Dienste wie Nginx, Prosody oder andere Anwendungen erstellen.
  • Progressive Banzeiten aktivieren, um Wiederholungstäter auszusperren.
  • Eigene IPs immer in ignoreip aufnehmen.
  • Regelmäßig mit fail2ban-client status den Zustand prüfen.

Fail2Ban ersetzt keine sichere SSH-Konfiguration (Key-Only-Auth, Port-Änderung) und keine Firewall. Es ist eine zusätzliche Verteidigungslinie, die automatisierte Angriffe zuverlässig abwehrt.