Was ist Fail2ban?
Fail2ban scannt Logdateien auf Angriffsmuster (z.B. fehlgeschlagene SSH-Logins, WordPress-Brute-Force, Nginx-404-Flood) und sperrt die angreifenden IPs automatisch per nftables. Ein unverzichtbares Tool für jeden Server – simpel, effektiv, leistungsschonend.
Architektur
Logdatei (auth.log, mail.log, access.log ...)
│
▼
Fail2ban überwacht auf Angriffsmuster
│
▼
Bei Treffer → IP wird per nftables geblockt
│
▼
Nach Ablauf der Bantime → IP wird automatisch freigegeben
1. Installation
apt-get update apt-get install -y fail2ban nftables systemctl enable --now fail2ban nftables
2. Grundkonfiguration (jail.local)
[DEFAULT] bantime = 86400 # 1 Tag Sperre findtime = 600 # 10 Minuten Zeitfenster maxretry = 3 # Nach 3 Fehlversuchen sperren ignoreip = 127.0.0.1/8 ::1 DEINE_IP usedns = no banaction = nftables banaction_allports = nftables[type=allports] # Bantime steigern (Rückfalltäter härter bestrafen) bantime.increment = true bantime.rndtime = 30m bantime.maxtime = 604800 # Maximal 7 Tage bantime.factor = 2 bantime.overalljails = true
Alle 11 Jails im Detail
pure-ftpd (FTP)
[pure-ftpd] enabled = true port = ftp,ftps filter = pure-ftpd logpath = /var/log/syslog maxretry = 3 bantime = 86400
dovecot (IMAP/POP3)
[dovecot] enabled = true port = pop3,pop3s,imap,imaps,submission,smtps,465,587,993,995 filter = dovecot logpath = /var/log/mail.log maxretry = 3 bantime = 86400
postfix-sasl (SMTP-Auth)
[postfix-sasl] enabled = true port = smtp,smtps,submission,465,587 filter = postfix[mode=auth] logpath = /var/log/mail.log maxretry = 3 bantime = 86400
SSH (angepasster Port)
[sshd] enabled = true port = 50022 # Dein SSH-Port filter = sshd[mode=aggressive] logpath = /var/log/auth.log maxretry = 4 findtime = 600 bantime = 604800 # 7 Tage für SSH
Recidive (Dauer-Rückfalltäter)
Sperrt IPs, die wiederholt in anderen Jails auffallen:
[recidive] enabled = true filter = recidive logpath = /var/log/fail2ban.log banaction = %(banaction_allports)s bantime = 2592000 # 30 Tage findtime = 30d maxretry = 5
Nginx-HTTP-Auth
[nginx-http-auth] enabled = true port = http,https filter = nginx-http-auth logpath = /var/log/nginx/error.log maxretry = 3 bantime = 86400
Nginx-Limit-Req (Rate Limiting)
Sperrt IPs, die den Nginx-Rate-Limiter auslösen (z.B. zu viele Requests pro Sekunde):
[nginx-limit-req] enabled = true port = http,https filter = nginx-limit-req logpath = /var/log/nginx/error.log maxretry = 5 findtime = 600 bantime = 3600
Nginx-Bad-Bots
Sperrt bekannte Bots und Crawler aus der Apache-Badbots-Liste:
[nginx-badbots] enabled = true port = http,https filter = apache-badbots logpath = /var/log/nginx/access.log maxretry = 2 findtime = 86400 bantime = 86400
Nginx-Bot-Search
Sperrt IPs, die nach verwundbaren Pfaden suchen:
[nginx-botsearch] enabled = true port = http,https filter = nginx-botsearch logpath = /var/log/nginx/access.log maxretry = 2 bantime = 86400
Nginx-Bad-Request
Sperrt IPs mit fehlerhaften HTTP-Requests:
[nginx-bad-request] enabled = true port = http,https filter = nginx-bad-request logpath = /var/log/nginx/access.log maxretry = 5 findtime = 600 bantime = 86400
WordPress (Login + XML-RPC)
Eigener Filter für WordPress-Login-Brute-Force und XML-RPC-Angriffe:
/etc/fail2ban/filter.d/wordpress.conf:
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php HTTP.*" (200|302)
^<HOST> .* "POST /xmlrpc.php HTTP.*" (200|302)
ignoreregex =
Jail-Konfiguration:
[wordpress] enabled = true port = http,https filter = wordpress logpath = /var/log/nginx/access.log maxretry = 5 findtime = 300 bantime = 86400
3. Bantime-Steigerung (Rückfalltäter)
Fail2ban kann die Sperrdauer automatisch erhöhen, wenn eine IP wiederholt auffällt:
| Parameter | Wert | Erklärung |
|---|---|---|
bantime.increment |
true | Aktiviert progressive Bantime |
bantime.factor |
2 | Verdoppelt die Zeit pro Treffer |
bantime.maxtime |
604800 | Maximal 7 Tage |
bantime.overalljails |
true | Zählt Treffer über alle Jails |
Beispiel: 1. Treffer → 1 Tag, 2. Treffer → 2 Tage, 3. Treffer → 4 Tage … maximal 7 Tage.
4. Alle Logdateien im Überblick
| Logdatei | Überwacht durch |
|---|---|
/var/log/auth.log |
sshd |
/var/log/mail.log |
dovecot, postfix-sasl |
/var/log/nginx/access.log |
nginx-badbots, nginx-botsearch, nginx-bad-request, wordpress |
/var/log/nginx/error.log |
nginx-http-auth, nginx-limit-req |
/var/log/syslog |
pure-ftpd |
/var/log/fail2ban.log |
recidive |
5. Alle Befehle für den täglichen Betrieb
# Status aller Jails fail2ban-client status # Status eines einzelnen Jails fail2ban-client status nginx-badbots # Liste aller gesperrten IPs fail2ban-client banned # IP manuell entsperren fail2ban-client set nginx-http-auth unbanip 192.168.1.100 # IP manuell sperren fail2ban-client set nginx-http-auth banip 192.168.1.100 # Konfiguration neu laden fail2ban-client reload # Konfiguration neu laden (alle Jails) systemctl reload fail2ban # Fail2ban Logs live verfolgen tail -f /var/log/fail2ban.log # Alle aktuell gesperrten IPs in nftables nft list set inet f2b-table addr-set-nginx-badbots
6. Nach der Installation – Quickstart
# 1. Konfiguration erstellen nano /etc/fail2ban/jail.local # 2. Syntax prüfen fail2ban-client -t # 3. Fail2ban neustarten systemctl restart fail2ban # 4. Status prüfen fail2ban-client status # 5. Testen: SSH-Fehlversuche auslösen ssh falscher-benutzer@dein-server # fail2ban-client status sshd
7. Wartung
# Logrotation prüfen
tail -f /var/log/fail2ban.log
# Statistiken
fail2ban-client status | grep "Jail list"
# Banned IPs aus allen Jails
for jail in $(fail2ban-client status | grep "Jail list:" | cut -f2); do
echo "$jail: $(fail2ban-client status $jail | grep "Banned IP list")"
done
Fazit
11 Jails schützen deinen Server vor Brute-Force, Bots, Scan-Angriffen und WordPress-Exploits. Fail2ban ist einfach, zuverlässig und verbraucht kaum Ressourcen – auf jedem Server Pflicht!