Jeder mit dem Internet verbundene Server ist ein Ziel. Automatisierte Bots scannen rund um die Uhr IP-Bereiche und versuchen Tausende von Benutzername-Passwort-Kombinationen gegen SSH, Web-Login-Seiten und Mailserver. Ein einziger ungeschützter Dienst kann innerhalb von Stunden kompromittiert werden. Fail2Ban ist ein Framework zur Einbruchsprävention, das Log-Dateien auf Anzeichen bösartiger Aktivitäten überwacht und angreifende IP-Adressen automatisch mithilfe von Firewall-Regeln sperrt. Diese Anleitung führt Sie durch die Installation, Konfiguration und Feinabstimmung von Fail2Ban auf Ubuntu und deckt SSH-Schutz, benutzerdefinierte Jails für Nginx, Integration mit UFW, E-Mail-Benachrichtigungen und wesentliche Verwaltungsbefehle ab.
Voraussetzungen
Bevor Sie beginnen, stellen Sie sicher, dass Sie haben:
- Ubuntu Server 20.04, 22.04 oder 24.04
- Terminalzugang mit sudo-Berechtigungen
- SSH-Zugang zum Server
- Eine konfigurierte und aktive Firewall (UFW empfohlen — siehe unsere UFW-Anleitung)
- Grundlegende Vertrautheit mit Log-Dateien und systemd-Diensten
Was Ist Fail2Ban?
Fail2Ban ist ein Open-Source-Tool zur Einbruchsprävention, geschrieben in Python. Es läuft als Hintergrund-Daemon, der kontinuierlich Log-Dateien (wie /var/log/auth.log oder /var/log/nginx/error.log) auf Muster überwacht, die auf bösartiges Verhalten hindeuten. Wenn ein Muster eine konfigurierbare Anzahl von Malen innerhalb eines definierten Zeitfensters übereinstimmt, erstellt Fail2Ban eine Firewall-Regel, um die angreifende IP-Adresse für eine bestimmte Dauer zu sperren.
Hauptmerkmale:
- Log-basiert — reagiert auf tatsächliche fehlgeschlagene Versuche, die in Log-Dateien aufgezeichnet sind, nicht nur auf Verbindungsraten
- Konfigurierbare Jails — jeder Dienst (SSH, Nginx, Postfix) erhält seinen eigenen Regelsatz, genannt „Jail”
- Mehrere Sperraktionen — kann iptables, UFW, firewalld verwenden oder sogar Benachrichtigungen senden
- Automatische Entsperrung — gesperrte IPs werden nach Ablauf der Sperrzeit automatisch freigegeben
- Ressourcenschonend — minimaler Ressourcenverbrauch selbst auf stark ausgelasteten Servern
Wie Fail2Ban Funktioniert
Fail2Ban arbeitet über vier miteinander verbundene Komponenten:
- Log-Dateien — die Quelle der Wahrheit. Dienste schreiben Authentifizierungsfehler und Fehler in Log-Dateien
- Filter — reguläre Ausdrücke, die bestimmte Muster in Log-Dateien abgleichen (z.B. „Failed password for” in auth.log)
- Jails — Konfigurationseinheiten, die einen Filter mit einem Log-Dateipfad, Schwellenwerten (maxretry, findtime) und einer Aktion kombinieren
- Aktionen — was passiert, wenn der Schwellenwert überschritten wird (Firewall-Regel erstellen, E-Mail senden, Skript ausführen)
Der Ablauf ist einfach:
Log-Dateieintrag → Filter stimmt mit Muster überein → Jail-Zähler erhöht sich
→ Zähler überschreitet maxretry innerhalb von findtime → Aktion wird ausgeführt (IP sperren)
→ Bantime läuft ab → Aktion wird rückgängig gemacht (IP entsperren)
Diese Architektur macht Fail2Ban hochgradig erweiterbar. Sie können benutzerdefinierte Filter für jede Anwendung schreiben, die Log-Ausgaben erzeugt.
Installation von Fail2Ban
Installieren Sie Fail2Ban aus den Ubuntu-Repositories:
sudo apt update
sudo apt install fail2ban -y
Überprüfen Sie die Installation:
fail2ban-client --version
Prüfen Sie den Dienststatus:
sudo systemctl status fail2ban
Fail2Ban startet automatisch nach der Installation, wird aber mit einer minimalen Standardkonfiguration ausgeliefert. Der nächste Schritt ist die Erstellung einer ordnungsgemäßen Konfiguration.
Die Konfigurationsdateien Verstehen
Fail2Ban verwendet ein geschichtetes Konfigurationssystem:
| Datei | Zweck | Bearbeitbar? |
|---|---|---|
/etc/fail2ban/fail2ban.conf | Daemon-Einstellungen (Log-Level, Socket) | Nein — fail2ban.local verwenden |
/etc/fail2ban/jail.conf | Standard-Jail-Definitionen | Nein — jail.local verwenden |
/etc/fail2ban/jail.local | Ihre benutzerdefinierten Jail-Überschreibungen | Ja — dies ist Ihre Hauptkonfiguration |
/etc/fail2ban/jail.d/*.conf | Zusätzliche Jail-Konfigurationen | Ja |
/etc/fail2ban/filter.d/*.conf | Filterdefinitionen (Regex-Muster) | Ja — für benutzerdefinierte Filter |
/etc/fail2ban/action.d/*.conf | Aktionsdefinitionen (Ban/Unban-Befehle) | Ja — für benutzerdefinierte Aktionen |
Wichtig: Bearbeiten Sie niemals
jail.confoderfail2ban.confdirekt. Diese Dateien werden bei Paketaktualisierungen überschrieben. Erstellen Sie immer.local-Dateien, die bestimmte Einstellungen überschreiben.
Erstellen Sie Ihre lokale Konfiguration:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Alternativ erstellen Sie eine minimale jail.local von Grund auf mit nur den Einstellungen, die Sie überschreiben möchten:
sudo nano /etc/fail2ban/jail.local
Konfiguration des SSH-Schutzes
SSH-Schutz ist der häufigste und kritischste Anwendungsfall für Fail2Ban. Fügen Sie Folgendes zu Ihrer jail.local hinzu:
[DEFAULT]
# Sperrdauer: 1 Stunde
bantime = 3600
# Zeitfenster zum Zählen von Fehlversuchen: 10 Minuten
findtime = 600
# Anzahl der Fehlversuche vor der Sperre
maxretry = 3
# UFW für Sperraktionen verwenden (empfohlen unter Ubuntu)
banaction = ufw
# Ihre IP-Adressen (durch Leerzeichen getrennt), die nie gesperrt werden
ignoreip = 127.0.0.1/8 ::1 IHRE_HEIM_IP
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
findtime = 600
Diese Konfiguration:
- Setzt einen globalen Standard von 3 Versuchen innerhalb von 10 Minuten, was zu einer 1-stündigen Sperre führt
- Überschreibt den SSH-Jail, um stattdessen 24 Stunden (86400 Sekunden) zu sperren
- Verwendet UFW als Sperrmechanismus
- Setzt localhost und Ihre Heim-IP auf die Whitelist
Wenn Sie SSH auf einem nicht-standardmäßigen Port betreiben (empfohlen — siehe unsere SSH-Härtungsanleitung), aktualisieren Sie die Port-Einstellung:
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
Starten Sie Fail2Ban neu, um die Änderungen anzuwenden:
sudo systemctl restart fail2ban
Überprüfen Sie, ob der SSH-Jail aktiv ist:
sudo fail2ban-client status sshd
Erwartete Ausgabe:
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
Benutzerdefinierte Jail-Konfiguration
Über SSH hinaus können Sie Jails für praktisch jeden Dienst erstellen. Hier sind praktische Beispiele:
Aggressiver SSH-Schutz
Für Server unter starkem Angriff verwenden Sie progressive Sperren mit bantime.increment:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 3600
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 604800
Mit dieser Konfiguration dauert die erste Sperre 1 Stunde, die zweite 2 Stunden, die dritte 4 Stunden und so weiter, bis zu einem Maximum von 7 Tagen (604800 Sekunden). Wiederholungstäter werden jedes Mal strenger bestraft.
Recidive-Jail (Wiederholungstäter über alle Jails sperren)
Der Recidive-Jail überwacht das Fail2Ban-Log selbst und sperrt IPs, die wiederholt in beliebigen Jails gesperrt werden:
[recidive]
enabled = true
filter = recidive
logpath = /var/log/fail2ban.log
bantime = 604800
findtime = 86400
maxretry = 3
banaction = ufw
Dies sperrt eine IP für 7 Tage, wenn sie innerhalb von 24 Stunden 3 Mal in einem beliebigen Jail gesperrt wird.
Integration mit UFW
Für Ubuntu-Server, die UFW als Firewall verwenden, konfigurieren Sie Fail2Ban zur Verwendung von UFW für Sperren:
[DEFAULT]
banaction = ufw
Überprüfen Sie die Integration, indem Sie die UFW-Regeln nach einer Sperre prüfen:
sudo ufw status numbered
Gesperrte IPs erscheinen als Ablehnungsregeln:
[ 1] Anywhere DENY IN 203.0.113.100
[ 2] 22/tcp ALLOW IN Anywhere
Wenn Sie iptables bevorzugen (zum Beispiel auf Systemen ohne UFW), verwenden Sie den Standard:
[DEFAULT]
banaction = iptables-multiport
Um iptables-Sperren zu überprüfen:
sudo iptables -L f2b-sshd -n
Schutz von Nginx
Fail2Ban kann Webserver vor verschiedenen Angriffsmustern schützen. Hier sind zwei gängige Nginx-Jails:
Nginx-HTTP-Authentifizierung
Schützen Sie Seiten hinter HTTP-Basic-Authentifizierung vor Brute-Force-Angriffen:
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 3600
findtime = 600
Der eingebaute Filter nginx-http-auth stimmt mit Zeilen wie diesen überein:
no user/password was provided for basic authentication
Nginx-404-Flutschutz
Sperren Sie IPs, die übermäßig viele 404-Fehler erzeugen (ein häufiges Muster von Schwachstellen-Scannern):
Erstellen Sie einen benutzerdefinierten Filter:
sudo nano /etc/fail2ban/filter.d/nginx-404.conf
[Definition]
failregex = ^<HOST> - .* "(GET|POST|HEAD).*HTTP.*" 404
ignoreregex =
Fügen Sie den Jail hinzu:
[nginx-404]
enabled = true
port = http,https
filter = nginx-404
logpath = /var/log/nginx/access.log
maxretry = 30
findtime = 600
bantime = 3600
Dies sperrt eine IP nach 30 404-Fehlern innerhalb von 10 Minuten. Setzen Sie den Schwellenwert hoch genug, um zu vermeiden, dass legitime Benutzer gesperrt werden, die auf defekte Links stoßen.
Nginx-Bot- und Scanner-Schutz
Erstellen Sie einen Filter für bekannte bösartige User-Agents und Pfad-Scanning:
sudo nano /etc/fail2ban/filter.d/nginx-badbots.conf
[Definition]
failregex = ^<HOST> - .* "(GET|POST).*HTTP.*" .* ".*(?:sqlmap|nikto|nmap|masscan|ZmEu|w3af).*"
ignoreregex =
[nginx-badbots]
enabled = true
port = http,https
filter = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 1
findtime = 86400
bantime = 604800
E-Mail-Benachrichtigungen
Konfigurieren Sie Fail2Ban, um E-Mail-Benachrichtigungen zu senden, wenn IPs gesperrt werden oder Jails starten/stoppen. Installieren Sie zunächst einen Mail-Transfer-Agent:
sudo apt install sendmail -y
Fügen Sie Benachrichtigungseinstellungen zur jail.local hinzu:
[DEFAULT]
destemail = admin@ihredomain.com
sender = fail2ban@ihredomain.com
mta = sendmail
action = %(action_mwl)s
Die verfügbaren Aktionskürzel sind:
| Aktion | Verhalten |
|---|---|
%(action_)s | Nur Sperre (keine Benachrichtigung) |
%(action_mw)s | Sperre + E-Mail mit WHOIS-Informationen |
%(action_mwl)s | Sperre + E-Mail mit WHOIS-Informationen + relevante Log-Zeilen |
Für einen bestimmten Jail überschreiben Sie die Aktion:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
action = %(action_mwl)s
Hinweis: Auf Servern mit hohem Datenverkehr unter konstantem Angriff können E-Mail-Benachrichtigungen ein großes Nachrichtenvolumen erzeugen. Erwägen Sie die Verwendung von
%(action_)s(nur Sperre) für stark frequentierte Jails und reservieren Sie E-Mail-Benachrichtigungen für kritische Jails oder den Recidive-Jail.
IP-Whitelist
Verhindern Sie versehentliche Sperren vertrauenswürdiger IP-Adressen mit der Direktive ignoreip:
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 10.0.0.0/8 192.168.1.0/24 IHRE_OEFFENTLICHE_IP
Sie können einzelne IPs, CIDR-Bereiche oder Hostnamen (beim Start aufgelöst) auflisten:
ignoreip = 127.0.0.1/8 ::1 buero.ihredomain.com 203.0.113.50
Um eine IP nur für einen bestimmten Jail auf die Whitelist zu setzen:
[sshd]
enabled = true
ignoreip = 127.0.0.1/8 ::1 10.0.1.50
Sie können auch zur Laufzeit ohne Neustart von Fail2Ban auf die Whitelist setzen:
# Aktuelle Whitelist prüfen
sudo fail2ban-client get sshd ignoreip
# Eine IP temporär zur Whitelist hinzufügen (bis zum Neustart)
sudo fail2ban-client set sshd addignoreip 203.0.113.50
Referenz der Wichtigsten Befehle
| Befehl | Beschreibung |
|---|---|
sudo systemctl start fail2ban | Den Fail2Ban-Dienst starten |
sudo systemctl stop fail2ban | Den Fail2Ban-Dienst stoppen |
sudo systemctl restart fail2ban | Den Fail2Ban-Dienst neu starten |
sudo systemctl status fail2ban | Den Dienststatus prüfen |
sudo fail2ban-client status | Alle aktiven Jails auflisten |
sudo fail2ban-client status sshd | Status und gesperrte IPs des sshd-Jails anzeigen |
sudo fail2ban-client set sshd banip 203.0.113.100 | Eine IP im sshd-Jail manuell sperren |
sudo fail2ban-client set sshd unbanip 203.0.113.100 | Eine bestimmte IP im sshd-Jail entsperren |
sudo fail2ban-client unban --all | Alle IPs in allen Jails entsperren |
sudo fail2ban-client get sshd bantime | Die aktuelle Sperrdauer für einen Jail anzeigen |
sudo fail2ban-client get sshd maxretry | Das aktuelle Wiederholungslimit für einen Jail anzeigen |
sudo fail2ban-client get sshd ignoreip | Whitelisted IPs für einen Jail anzeigen |
sudo fail2ban-client reload | Konfiguration ohne Neustart neu laden |
sudo fail2ban-client reload sshd | Einen bestimmten Jail neu laden |
sudo tail -100 /var/log/fail2ban.log | Aktuelle Fail2Ban-Log-Einträge anzeigen |
sudo zgrep "Ban" /var/log/fail2ban.log* | Sperrereignisse in allen Log-Dateien suchen |
Fehlerbehebung
Fail2Ban Startet Nicht
Prüfen Sie die Logs auf Konfigurationsfehler:
sudo fail2ban-client -t
sudo journalctl -u fail2ban --since "10 minutes ago"
Häufige Ursachen:
- Syntaxfehler in
jail.local(fehlende Klammern, falsche Einrückung) - Referenzierte Log-Dateien, die nicht existieren (z.B.
/var/log/nginx/error.logwenn Nginx nicht installiert ist) - Regex-Fehler in benutzerdefinierten Filterdateien
IPs Werden Nicht Gesperrt
Überprüfen Sie, ob der Jail aktiviert ist und die richtige Log-Datei überwacht:
sudo fail2ban-client status sshd
Prüfen Sie, ob der Filter mit Einträgen im Log übereinstimmt:
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
Dieser Befehl testet den Filter gegen die tatsächliche Log-Datei und meldet, wie viele Übereinstimmungen gefunden wurden. Wenn die Anzahl null ist, erkennt der Filter die erwarteten Muster nicht.
Legitime Benutzer Werden Gesperrt
Wenn Benutzer berichten, dass sie gesperrt sind:
- Entsperren Sie sie sofort:
sudo fail2ban-client set sshd unbanip BENUTZER_IP
- Fügen Sie ihre IP oder ihr Netzwerk zur Whitelist hinzu:
sudo fail2ban-client set sshd addignoreip BENUTZER_IP
- Für eine dauerhafte Lösung fügen Sie die IP zu
ignoreipinjail.localhinzu und laden Sie neu.
Fail2Ban-Sperren Bleiben Nach Neustart Nicht Erhalten
Standardmäßig speichert Fail2Ban Sperren nicht zwischen Dienstneustarts. Um die Persistenz zu aktivieren, konfigurieren Sie eine Sperrdatenbank:
[DEFAULT]
dbfile = /var/lib/fail2ban/fail2ban.sqlite3
dbpurgeage = 86400
Die Einstellung dbpurgeage steuert, wie lange (in Sekunden) alte Einträge in der Datenbank aufbewahrt werden.
Hoher Speicherverbrauch bei Vielen Jails
Wenn Fail2Ban übermäßig viel Speicher verwendet:
- Reduzieren Sie die Anzahl aktiver Jails auf das Nötigste
- Setzen Sie
dbpurgeageauf einen niedrigeren Wert, um die Datenbankgröße zu reduzieren - Stellen Sie sicher, dass Log-Dateien ordnungsgemäß mit logrotate rotiert werden
Zusammenfassung
Fail2Ban ist ein unverzichtbares Sicherheitstool für jeden mit dem Internet verbundenen Linux-Server. Durch die Überwachung von Log-Dateien und das automatische Sperren von IPs, die bösartiges Verhalten zeigen, bietet es eine proaktive Verteidigungsschicht, die zusammen mit Ihrer Firewall arbeitet. Die in dieser Anleitung behandelten Schlüsselkonfigurationen — SSH-Schutz, Nginx-Jails, UFW-Integration und E-Mail-Benachrichtigungen — decken die häufigsten Angriffsvektoren für Produktionsserver ab.
Wichtige Erkenntnisse:
- Erstellen Sie immer eine
jail.local-Datei, anstattjail.confdirekt zu bearbeiten - Setzen Sie Ihre eigenen IP-Adressen auf die Whitelist, um versehentliche Sperrungen zu verhindern
- Verwenden Sie progressive Sperrzeiten, um Wiederholungstäter zu bestrafen
- Kombinieren Sie Fail2Ban mit UFW für konsistente Firewall-Verwaltung
- Testen Sie benutzerdefinierte Filter mit
fail2ban-regex, bevor Sie sie bereitstellen - Überwachen Sie regelmäßig das Fail2Ban-Log, um die Bedrohungslandschaft Ihres Servers zu verstehen
Für eine umfassende Sicherheitskonfiguration kombinieren Sie Fail2Ban mit den Techniken, die in unseren Anleitungen zur SSH-Härtung, UFW-Firewall-Konfiguration und der Linux-Server-Sicherheits-Checkliste beschrieben sind.