在当今的互联网安全环境中,网站面临着各种各样的攻击,包括暴力破解、SQL 注入、命令执行等。为了更好地保护网站免受这些攻击,我们可以利用一些防火墙和安全工具来自动化防护。其中,Fail2Ban 是一款非常流行的开源工具,能够帮助我们通过日志分析自动化地封禁恶意 IP 地址。而 Cloudflare 则是一款强大的云安全平台,提供了 DDoS 防护、WAF(Web 应用防火墙)等功能。今天,我们将教你如何将 Fail2Ban 与 Cloudflare API 集成,通过自动化的方式封禁攻击者的 IP 地址。




1. 什么是 Fail2Ban?

Fail2Ban 是一款能够根据系统日志文件中的某些模式来自动封禁恶意 IP 地址的工具。它可以分析不同类型的日志文件(如 SSH、Web 服务器等),当发现多个失败登录尝试或可疑活动时,会自动在防火墙上封禁这些 IP 地址。Fail2Ban 的配置非常灵活,可以根据需要添加自定义规则。




2. 为什么要与 Cloudflare 集成?

Cloudflare 提供强大的 Web 安全和加速服务,尤其在抵御 DDoS 攻击、Web 应用攻击(如 SQL 注入、XSS)等方面表现卓越。通过将 Fail2Ban 与 Cloudflare API 集成,我们可以在攻击发生时,自动将恶意 IP 封禁到 Cloudflare 的防火墙中,从而在全球范围内阻止这些攻击者。




3. Fail2Ban 与 Cloudflare API 集成

在本部分中,将介绍如何使用 Fail2Ban 自动封禁恶意 IP 地址,并通过 Cloudflare API 解除对这些 IP 地址的访问。通过这种集成方式,您可以让 Fail2Ban 直接与 Cloudflare 通信,实时阻止对您网站的恶意攻击,提升网站的安全性。


3.1 准备 Cloudflare API 配置信息

在开始配置之前,您需要准备以下几个信息:

  • Cloudflare Zone ID:这可以在 Cloudflare 的 DNS 管理页面找到。
  • Cloudflare API Token:您需要在 Cloudflare 控制面板中生成一个 API 令牌。请确保令牌拥有足够的权限,至少应具有 “Zone: Edit” 和 “Firewall: Edit” 权限。
  • Cloudflare 账户邮箱:这是您用于登录 Cloudflare 的电子邮件地址。

3.2 配置 Fail2Ban 动作

接下来,我们将配置 Fail2Ban 动作,使其在发现恶意 IP 地址时,能够自动与 Cloudflare API 交互,将这些 IP 地址封禁,并且能够解除封禁。Fail2Ban 配置文件通常位于 /etc/fail2ban/action.d/ ,首先在该目录下创建文件 cloudflare.conf

sudo nano /etc/fail2ban/action.d/cloudflare.conf

3.2.1 配置 actionban:封禁 IP 地址

[Definition]
actionstart =
actionstop =
actioncheck =

# 封禁 IP 的规则
actionban =
# Cloudflare API 相关配置
CF_API_KEY="your_cloudflare_api_key"
CF_EMAIL="[email protected]"
CF_ZONE_ID="your_cloudflare_zone_id"

# 获取 Fail2Ban 传递的被封禁的 IP 地址
IP="$1"

# 调用 Cloudflare API 封禁 IP
curl -X POST "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/firewall/access_rules/rules" \
-H "X-Auth-Email: $CF_EMAIL" \
-H "X-Auth-Key: $CF_API_KEY" \
-H "Content-Type: application/json" \
--data '{"mode":"block","configuration":{"target":"ip","value":"'$IP'"},"notes":"Blocked by Fail2Ban"}'

功能

  • 通过 $1 获取 Fail2Ban 传递的被封禁 IP 地址。
  • 使用 curl 向 Cloudflare API 发起请求,封禁该 IP 地址。封禁动作通过 POST 请求实现,mode 设置为 “block”,并在 notes 字段标明封禁原因:Blocked by Fail2Ban。

3.2.2 配置 actionunban:解封 IP 地址

actionunban =
# 获取 Fail2Ban 传递的被解封的 IP 地址
IP="$1"

# 使用 Cloudflare API 查询并删除封禁的规则
curl -s -X DELETE "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/firewall/access_rules/rules/$( \
curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/firewall/access_rules/rules?page=1&per_page=1&mode=block&configuration.target=ip&configuration.value=$IP&match=all" \
-H "X-Auth-Email: $CF_EMAIL" \
-H "X-Auth-Key: $CF_API_KEY" \
-H "Content-Type: application/json" | \
awk -F "[,:}]" '{for(i=1;i<=NF;i++){if($i~/'id'"/){print $(i+1);}}}' | \
tr -d '"' | \
sed -e 's/^[ ]*//' | \
head -n 1)" \
-H "X-Auth-Email: $CF_EMAIL" \
-H "X-Auth-Key: $CF_API_KEY" \
-H "Content-Type: application/json"

目的

  • 通过 $1 获取 Fail2Ban 传递的需要解封的 IP 地址。
  • 使用 GET 请求从 Cloudflare 获取已封禁该 IP 地址的规则,并提取出规则的 id。
  • 使用 DELETE 请求删除该封禁规则,从而解除对该 IP 的封禁。

3.3 配置 Fail2Ban Jail

完成了动作配置后,我们还需要配置一个 Jail,确保 Fail2Ban 识别到特定的攻击模式并触发上述动作。

Fail2Ban Jail 配置文件通常使用 /etc/fail2ban/jail.local。新加一个配置:

[http-auth]
enabled = true
port = http,https
filter = http-auth #后续会提到
logpath = /var/log/nginx/*/access.log #需要监控的服务器日志,一般攻击是在access.log中
maxretry = 3

bantime = -1 # 永久封禁
findtime = 3600
action = cloudflare

action += ufw[name=http-auth, port=http, https]

解释

  • enabled:启用该 Jail。
  • port:监控的端口,通常为 HTTP(80) 和 HTTPS(443)。
  • filter:指定过滤器,您可以定义适合您的应用程序的自定义过滤器(3.4)。
  • logpath:指定日志文件路径,Fail2Ban 将扫描这些日志文件以检测潜在攻击。
  • action:定义要执行的动作。其中:ufw[name= http-auth , port=http, https] 是防火墙的动作,在系统防火墙中封禁(首先你需要安装 ufw),cloudflare 则是我们上面定义的封禁和解封 Cloudflare 动作。

3.4 创建 HTTP 攻击规则 (http-auth)

Fail2Ban 需要根据日志文件来分析和识别攻击行为。为了实现这一点,我们可以创建自定义的 http-auth 过滤规则。你可以在 /etc/fail2ban/filter.d/ 目录下创建一个新的过滤文件 http-auth.conf

  1. 创建文件 http-auth.conf
sudo nano /etc/fail2ban/filter.d/http-auth.conf
  1. 添加以下内容:
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD).*(400|403|404).*$ # 捕获常见的 HTTP 错误状态码
^<HOST> -.*"(GET|POST|HEAD).*/\?=.*(PHPE9568F36|PHPB8B5F2A0).*$ # 捕获 PHP 代码注入尝试
^<HOST> -.*"(GET|POST|HEAD).*/(start\.cgi|index\.php|admin\.html).*$ # 捕获敏感路径访问
^<HOST> -.*"GET .*\\x0E\\x00.*$ # 捕获包含特殊字符的请求
^<HOST> -.*"(GET|POST|HEAD).*/(phpmyadmin|/etc/passwd|/bin/bash).*$ # 捕获敏感文件请求
^<HOST> -.*"(GET|POST|HEAD).*(eval|cmd|exec|bash|system|shell).*$ # 捕获常见的代码执行漏洞
^<HOST> -.*"(GET|POST|HEAD).*(select.*from|union.*select).*$ # 捕获 SQL 注入攻击
^<HOST> -.*"(GET|POST|HEAD).*(base64_decode|eval).*$ # 捕获常见的 PHP 注入攻击
ignoreregex =

规则说明:

  1. ^(GET|POST|HEAD).*(400|403|404).*$:匹配常见的 HTTP 错误代码(如 400, 403, 404)。这些状态码通常表示客户端的恶意请求。
  2. ^.*"(GET|POST|HEAD).*/\?=.*(PHPE9568F36|PHPB8B5F2A0).*$:匹配带有常见 PHP 代码注入迹象的请求。PHPE9568F36PHPB8B5F2A0 是常见的 PHP 代码注入标识。
  3. ^.*"(GET|POST|HEAD).*/(start\.cgi|index\.php|admin\.html).*$:捕获访问常见的敏感路径(如 admin.htmlindex.php 等),这些路径通常是攻击者的目标。
  4. ^<HOST> -.*"GET .*\\x0E\\x00.*$:匹配包含特殊字符(如二进制数据)的请求,常见于攻击行为。
  5. ^.*"(GET|POST|HEAD).*/(phpmyadmin|/etc/passwd|/bin/bash).*$:匹配请求敏感文件(如 phpmyadmin/etc/passwd/bin/bash)的恶意访问。
  6. ^.*"(GET|POST|HEAD).*(eval|cmd|exec|bash|system|shell).*$:捕获常见的命令执行漏洞尝试,这些关键词通常出现在攻击者试图执行系统命令时。
  7. ^<HOST> -.*"(GET|POST|HEAD).*(select.*from|union.*select).*$:捕获 SQL 注入攻击的尝试,selectunion select 是 SQL 注入常见的关键字。
  8. ^<HOST> -.*"(GET|POST|HEAD).*(base64_decode|eval).*$:捕获常见的 PHP 注入攻击,base64_decodeeval 是攻击者常用的函数。

注:您可以访问我的Github仓库来获取完整规则。


3.5 重启 Fail2Ban 服务

完成配置后,重启 Fail2Ban 使配置生效:

sudo systemctl restart fail2ban

3.6 测试和验证

  1. 查看 Fail2Ban 状态

使用以下命令查看 Fail2Ban 是否正在运行,并确认 http-auth 规则是否已启用:

sudo fail2ban-client status
  1. 模拟攻击

您可以通过模拟一些常见的 Web 攻击(如 SQL 注入、命令注入等)来触发 Fail2Ban 的规则。Fail2Ban 会自动封禁攻击者的 IP 地址,并通过 Cloudflare API 将这些 IP 地址同步到 Cloudflare 的防火墙。当然,你也可以专门创建一个日志文件,使用fail2ban-regex进行调试,具体可看我另一篇文章。日志格式类似于下:

205.210.31.182 - - [17/Jan/2025:00:31:24 +0100] "GET / HTTP/1.1" 403 146 "-" "Expanse, a Palo Alto Networks company, searches across the global IPv4 space multiple times per day to identify customers&#39; presences on the Internet. If you would like to be excluded from our scans, please send IP addresses/domains to: [email protected]"
152.32.128.33 - - [17/Jan/2025:05:39:57 +0100] "GET / HTTP/1.1" 403 146 "-" "-"
154.212.141.229 - - [17/Jan/2025:05:39:57 +0100] "GET / HTTP/1.1" 403 548 "http://161.10.122.8:1025" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
154.212.141.229 - - [17/Jan/2025:05:39:57 +0100] "GET /favicon.ico HTTP/1.1" 404 548 "http://173.254.247.70:888" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
  1. 验证 Cloudflare 防火墙

使用调试过后大多数攻击都被规则match后。当真正有攻击ip被封禁到防火墙中(可查看fail2ban.log),您就可以登录到 Cloudflare 控制台,进入 网站 > 安全性 > WAF > 工具 页面,查看是否已成功将封禁的 IP 地址添加到Cloudflare防火墙规则中。正常如下:




4. 小结

通过将 Fail2Ban 与 Cloudflare API 集成,您可以有效地自动化恶意 IP 的封禁过程。在攻击发生时,Fail2Ban 会分析日志并封禁恶意 IP,同时通过 Cloudflare API 将这些 IP 添加到 Cloudflare 防火墙中,确保全网范围的防护。这种方法能够增强您的 Web 安全性,抵御 DDoS 攻击、SQL 注入、XSS 等各种常见攻击。


参考链接

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注