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:

  1. Log-Dateien — die Quelle der Wahrheit. Dienste schreiben Authentifizierungsfehler und Fehler in Log-Dateien
  2. Filter — reguläre Ausdrücke, die bestimmte Muster in Log-Dateien abgleichen (z.B. „Failed password for” in auth.log)
  3. Jails — Konfigurationseinheiten, die einen Filter mit einem Log-Dateipfad, Schwellenwerten (maxretry, findtime) und einer Aktion kombinieren
  4. 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:

DateiZweckBearbeitbar?
/etc/fail2ban/fail2ban.confDaemon-Einstellungen (Log-Level, Socket)Nein — fail2ban.local verwenden
/etc/fail2ban/jail.confStandard-Jail-DefinitionenNein — jail.local verwenden
/etc/fail2ban/jail.localIhre benutzerdefinierten Jail-ÜberschreibungenJa — dies ist Ihre Hauptkonfiguration
/etc/fail2ban/jail.d/*.confZusätzliche Jail-KonfigurationenJa
/etc/fail2ban/filter.d/*.confFilterdefinitionen (Regex-Muster)Ja — für benutzerdefinierte Filter
/etc/fail2ban/action.d/*.confAktionsdefinitionen (Ban/Unban-Befehle)Ja — für benutzerdefinierte Aktionen

Wichtig: Bearbeiten Sie niemals jail.conf oder fail2ban.conf direkt. 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:

AktionVerhalten
%(action_)sNur Sperre (keine Benachrichtigung)
%(action_mw)sSperre + E-Mail mit WHOIS-Informationen
%(action_mwl)sSperre + 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

BefehlBeschreibung
sudo systemctl start fail2banDen Fail2Ban-Dienst starten
sudo systemctl stop fail2banDen Fail2Ban-Dienst stoppen
sudo systemctl restart fail2banDen Fail2Ban-Dienst neu starten
sudo systemctl status fail2banDen Dienststatus prüfen
sudo fail2ban-client statusAlle aktiven Jails auflisten
sudo fail2ban-client status sshdStatus und gesperrte IPs des sshd-Jails anzeigen
sudo fail2ban-client set sshd banip 203.0.113.100Eine IP im sshd-Jail manuell sperren
sudo fail2ban-client set sshd unbanip 203.0.113.100Eine bestimmte IP im sshd-Jail entsperren
sudo fail2ban-client unban --allAlle IPs in allen Jails entsperren
sudo fail2ban-client get sshd bantimeDie aktuelle Sperrdauer für einen Jail anzeigen
sudo fail2ban-client get sshd maxretryDas aktuelle Wiederholungslimit für einen Jail anzeigen
sudo fail2ban-client get sshd ignoreipWhitelisted IPs für einen Jail anzeigen
sudo fail2ban-client reloadKonfiguration ohne Neustart neu laden
sudo fail2ban-client reload sshdEinen bestimmten Jail neu laden
sudo tail -100 /var/log/fail2ban.logAktuelle 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.log wenn 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:

  1. Entsperren Sie sie sofort:
sudo fail2ban-client set sshd unbanip BENUTZER_IP
  1. Fügen Sie ihre IP oder ihr Netzwerk zur Whitelist hinzu:
sudo fail2ban-client set sshd addignoreip BENUTZER_IP
  1. Für eine dauerhafte Lösung fügen Sie die IP zu ignoreip in jail.local hinzu 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 dbpurgeage auf 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, anstatt jail.conf direkt 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.