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.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:

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:

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

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.