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
sudo apt update
sudo apt install fail2ban -y
Nach der Installation läuft Fail2Ban als systemd-Service:
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.
SSH-Jail konfigurieren
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,h,d. Der Wert-1sperrt permanent.
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 =
[prosody-auth]
enabled = true
port = 5222,5223,5269
filter = prosody-auth
logpath = /var/log/prosody/prosody.log
maxretry = 5
bantime = 6h
findtime = 10m
Monitoring mit fail2ban-client
# 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
Banzeiten und Findtime tunen
Progressive Banzeiten lassen sich über die bantime.increment-Option realisieren:
[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
IPs whitelisten
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 10.0.0.0/8 2001:db8::/32
Integration mit iptables und nftables
# Für iptables (Standard)
[DEFAULT]
banaction = iptables-multiport
# Für nftables (moderner)
[DEFAULT]
banaction = nftables-multiport
# iptables-Regeln anzeigen
sudo iptables -L f2b-sshd -n -v
# nftables-Regeln anzeigen
sudo nft list ruleset | grep -A 5 f2b
Zusammenfassung
- 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.