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.confoder/etc/fail2ban/fail2ban.confdirekt. Diese werden bei Updates überschrieben. Nutze stattdessen immer/etc/fail2ban/jail.localbzw. 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 wiem(Minuten),h(Stunden),d(Tage). Der Wert-1sperrt 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 deinerprosody.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.localstattjail.confbearbeiten. - SSH-Jail mit niedrigem
maxretryund langerbantimekonfigurieren. - Eigene Filter für Dienste wie Nginx, Prosody oder andere Anwendungen erstellen.
- Progressive Banzeiten aktivieren, um Wiederholungstäter auszusperren.
- Eigene IPs immer in
ignoreipaufnehmen. - Regelmäßig mit
fail2ban-client statusden 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.