Cloudflare mit fail2ban nutzen¶
| Stand: 03/2025 |
|---|
| Verwendete Software - Ubuntu 24.04 LTS - Fail2ban 1.0.2 |
| Weitere Dokumentationen: |
Vorwort¶
Diese Dokumentation beschreibt die Integration von fail2ban mit Cloudflare, um automatisch IP-Adressen, die verdächtige oder bösartige Aktivitäten zeigen, über die Cloudflare-Firewall zu blockieren.
Fail2ban erkennt Angriffe wie Login-Brute-Force, Portscans oder Spam-Versuche durch Analyse von Logdateien und sperrt die IPs in Echtzeit. Durch die Anbindung an die Cloudflare-API wird diese Sperre direkt in die Cloud verlagert – auch dann wirksam, wenn der Server selbst nicht mehr erreichbar ist.
Es sind Grundkenntnisse im Umgang mit Linux erforderlich, da die Vorgehensweise, wie sie hier beschrieben ist, in manchen Teilen abweichen kann. Kein System ist wie das Andere. Die Dokumentation wurde sorgfältig von mir geprüft. Dennoch kann ich keinerlei Haftung für Schäden an Ihrem System oder eine Gewährleistung übernehmen. Bitte verwenden Sie diese Dokumentation auf eigene Gefahr.
Server vorbereiten¶
Root-Rechte einräumen¶
Während der gesamten Dokumentation werden Root-Rechte benötigt. Um auf das Voranstellen von sudo zu verzichten, verschaffen Sie sich für die gesamte Sitzung erhöhte Rechte mit:
sudo -i
Update durchführen¶
Bringen Sie den Server auf den aktuellen Patchstand:
apt update && apt upgrade
Software installieren¶
Laden Sie fail2ban und jqaus dem offiziellen Ubuntu-Repository herunter:
(jq wird für actionunban benötigt)
apt install fail2ban jq
Im Cloudflare-Portal¶
Cloudflare API-Token generieren¶
Info
Der API-Token fungiert als Zugangsschlüssel zur Cloudflare-Schnittstelle. Damit ermöglichen Sie fail2ban, automatisiert Firewall-Regeln zu erstellen und zu verwalten – ohne manuelles Eingreifen.
- Melden Sie sich mit Ihrem Cloudflare-Account an und wählen Sie unter Manage Account den Punkt Account API-Tokens:
Zone ID ermitteln¶
Info
Die Zone ID identifiziert Ihre Domain eindeutig innerhalb von Cloudflare. Sie wird benötigt, damit API-Aufrufe dem richtigen Ziel zugewiesen werden können.
fail2ban konfigurieren¶
action.d erstellen¶
Info
Die Datei cloudflare-api.conf enthält die Definition der Aktionen, die fail2ban bei einem Ban oder Unban durchführt. Über curl wird eine direkte Verbindung zur Cloudflare-API hergestellt, um IPs zu blockieren oder zu entfernen.
Erstellen Sie eine neue Datei /etc/fail2ban/action.d/cloudflare-api.conf mit folgendem Inhalt:
nano /etc/fail2ban/action.d/cloudflare-api.conf
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = curl -s -X POST "https://api.cloudflare.com/client/v4/zones/<cfzoneid>/firewall/access_rules/rules" \
-H "Authorization: Bearer <cfapikey>" \
-H "Content-Type: application/json" \
--data '{"mode":"block","configuration":{"target":"ip","value":"<ip>"},"notes":"Banned by Fail2Ban: <name>"}'
actionunban = id=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/<cfzoneid>/firewall/access_rules/rules?mode=block&configuration.target=ip&configuration.value=<ip>&per_page=1" \
-H "Authorization: Bearer <cfapikey>" \
-H "Content-Type: application/json" | jq -r '.result[0].id'); \
[ -n "$id" ] && curl -s -X DELETE "https://api.cloudflare.com/client/v4/zones/<cfzoneid>/firewall/access_rules/rules/$id" \
-H "Authorization: Bearer <cfapikey>" \
-H "Content-Type: application/json"
cloudflare.secret erstellen¶
Info
In dieser Datei speichern Sie sensible Zugangsdaten wie den API-Token. Die Verwendung eines separaten Secrets erhöht die Sicherheit und ermöglicht eine saubere Trennung von Konfigurationslogik und Authentifizierungsdaten.
Erstellen Sie eine neue Datei /etc/fail2ban/cloudflare.secret mit folgendem Inhalt:
(Geben Sie bei cfapikey Ihr API-Token an)
nano /etc/fail2ban/cloudflare.secret
[DEFAULT]
cfapikey = abcdefghijklmnopqrstuvwxyz12345
Schränken Sie die Rechte auf die Datei ein:
chmod 600 /etc/fail2ban/cloudflare.secret
jail.local editieren¶
Info
In der Datei jail.local legen Sie fest, wie fail2ban mit erkannten Angriffen umgeht. Hier definieren Sie insbesondere, welche action verwendet wird – also wie und wohin die Sperranfrage weitergeleitet wird, in diesem Fall an Cloudflare.
Öffnen Sie die Datei /etc/fail2ban/jail.local und passen Sie die folgenden Parameter an:
(Geben Sie bei cfzoneid Ihre Zone-ID an)
nano /etc/fail2ban/jail.local
[INCLUDES]
before = /etc/fail2ban/cloudflare.secret
[...]
[DEFAULT]
cfzoneid = abcdefghijklmnopqrstuvwxyz12345
Verwenden Sie das folgende Kommando als Jail-Action:
action = cloudflare-api[name=%(__name__)s, cfapikey="%(cfapikey)s", cfzoneid="%(cfzoneid)s"]
%(mta)s-whois[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s"]
IP-Ban/Unban testen¶
Info
Mit diesem Test stellen Sie sicher, dass die Kommunikation zwischen fail2ban und Cloudflare korrekt funktioniert. Die IP-Adresse 8.8.8.8 wird testweise blockiert, um die API-Anbindung zu überprüfen – selbstverständlich sollte diese IP danach wieder entbannt werden.
Starten Sie zunächst fail2ban neu damit die Änderungen angewendet werden:
service fail2ban restart
Ban testen¶
Bannen Sie die IP-Adresse 8.8.8.8:
(Ersetzen Sie <name> durch das entsprechende Jail)
fail2ban-client set <name> banip 8.8.8.8
Kontrollieren Sie, ob die IP-Adresse erfolgreich im Cloudflare-Portal unter Security und Security rules (new Dashboard!) eingetragen wurde:
Unban testen¶
Hinweis
Sollte das Freigeben der IP-Adresse fehlschlagen, überprüfen Sie, ob jq installiert ist.
Installieren Sie es ggf. mit:
apt install jq
Unbannen Sie die IP-Adresse 8.8.8.8:
(Ersetzen Sie <name> durch das entsprechende Jail)
fail2ban-client set <name> unbanip 8.8.8.8
Kontrollieren Sie, ob die IP-Adresse erfolgreich ausgetragen wurde.
Apache konfigurieren¶
Info
Cloudflare leitet Webanfragen weiter, wodurch Apache standardmäßig nur die IP-Adresse des Cloudflare-Proxys sieht. Das Apache-Modul remoteip ersetzt diese durch die tatsächliche IP des Clients, wie sie im Header CF-Connecting-IP mitgeliefert wird. Das ist essenziell für eine korrekte Erkennung von Angreifern, da fail2ban ansonsten die Cloudflare-Proxy-IPs blockieren würde und nicht die des eigentlichen Clients.
Fügen Sie Ihrem VirtualHost folgenden Parameter hinzu:
<VirtualHost _default_:443>
[...]
# Echte Client-IP übernehmen (Cloudflare)
RemoteIPHeader CF-Connecting-IP
[...]
</VirtualHost>
Aktivieren Sie das Modul
remoteip und übernehmen Sie die Änderungen:
a2enmod remoteip
service apache2 restart
Abschluss¶
Wenn alle Tests erfolgreich waren, ist fail2ban in Verbindung mit Cloudflare einsatzbereit.






