Zum Inhalt

Cloudflare mit fail2ban nutzen

Stand: 03/2025
Cloudflare-Logo
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:

    Cloudflare API-Token


  • Klicken Sie auf Create Token:

    Cloudflare API-Token


  • Wählen Sie ganz unten Create Custom Token aus:

    Cloudflare API-Token


  • Vergeben Sie einen Token name und setzen Sie die Berechtigung entsprechend:

    Cloudflare API-Token


  • Klicken Sie auf Create Token um den API-Token zu generieren:

    Cloudflare API-Token


  • Kopieren Sie den API-Token. Der API-Token wird Ihnen nicht noch einmal angezeigt!

    Cloudflare API-Token


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.

  • Wählen Sie die zu schützende Domain aus und notieren Sie die Zone ID:

    Cloudflare Zone ID


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

Cloudflare Security rules


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.