通过 API 将 IP 黑名单批量添加到 CloudFlare 防火墙

温馨提示:
本文所述内容具有依赖性,可能因软硬条件不同而与预期有所差异,故请以实际为准,仅供参考。

之前提到过《网站如何屏蔽垃圾蜘蛛爬取?》,其中一个措施是 IP 禁封,如果网站直接暴露于互联网上是可以起到很好的防护作用,但在实际操作过程中发现,如果套上 CDN(如 CloudFlare)这些 IP 仍然可以连接到网站!这是因为实际上与网站连接的是 CDN,而 CDN 并没有拒绝 IP 连接到 CDN,所以我们需要把这份黑名单也加到 CDN 中。

以下以 CloudFlare Firewall 中的 IP Access Rules 为例,项目主页:VirCloud/ips-cloudflare

脚本

指定域名下的指定 IP 段(IPv4 / IPv6)访问需要机器人验证:

#/bin/bash
# 填 Cloudflare Email
CFEMAIL=""
# 填 Cloudflare API key
CFAPIKEY=""
# 填 Cloudflare Zones ID
ZONESID=""
# 填 Cloudflare Account ID
ACCOUNTID=""
# 填 IP 黑名单存放位置
IPS="/root/blacklist.txt"
# API 调用每 5 分钟限制 1200
LIMIT="1200"
# 休息 5 分钟再继续
SLEEP="300"
# 循环提交 IPs 到 Cloudflare  防火墙黑名单
I="1"
for IPADDR in `cat $IPS`
do
 if [ "$I" -lt "$LIMIT" ]
 then
  echo "正在添加第 $I 个 IP: $IPADDR"
  curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONESID/firewall/access_rules/rules" \
          -H "X-Auth-Email: $CFEMAIL" \
          -H "X-Auth-Key: $CFAPIKEY" \
          -H "Content-Type: application/json" \
          --data '{"mode":"challenge","configuration":{"target":"ip_range","value":"'$IPADDR'"},"notes":""}'
  I=`expr $I + 1`
 else
  echo "到达 API 调用限制,休息 5 分钟......"
  sleep $SLEEP
  I="1"
 fi
done

说明

1、脚本比较简单,有兴趣的小伙伴可以一起来优化下;
2、如果要在当前账号下所有域名生效,则将 POST 地址由 https://api.cloudflare.com/client/v4/zones/$ZONESID/firewall/access_rules/rules 改成 https://api.cloudflare.com/client/v4/accounts/$ACCOUNTID/firewall/access_rules/rules
3、如果要指定 IPv4 地址,则将发送的数据 --data 中的"target":"ip_range"改成 "target":"ip",IPv6 地址则改成 "target":"ip6"
4、防火墙动作("mode")支持四种模式,分别是 "challenge"(质询)、"block"(阻止)、"whitelist"(白名单)、"js_challenge"(Javascript 质询);
5、参数 CFEMAILCloudFlare 账户注册邮箱CFAPIKEY账户 -- 个人资料 -- API 令牌这里找到 Global API KeyZONESIDACCOUNTID 在域名概述的右下角找到 区域 ID帐户 ID

API.png

ID.png

6、CloudFlare API 调用有限制,5 分钟内最多 1200 次,可以调低,调高也没用。

使用

先将脚本参数填写完整,然后将 IP 黑名单下载到本地,再执行脚本:

root@az-hk:~# cd ~
root@az-hk:~# wget https://raw.githubusercontent.com/vircloud/ips-cloudflare/master/add-blacklist.sh
--2020-03-19 13:55:55--  https://raw.githubusercontent.com/vircloud/ips-cloudflare/master/add-blacklist.sh
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.76.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.76.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 648 [text/plain]
Saving to: ‘add-blacklist.sh’

add-blacklist.sh               100%[====================================================>]     648  --.-KB/s    in 0s      

2020-03-19 13:55:56 (105 MB/s) - ‘add-blacklist.sh’ saved [648/648]

root@az-hk:~# chmod +x add-blacklist.sh 
root@az-hk:~# vim add-blacklist.sh
//修改参数并保存
root@az-hk:~# wget https://raw.githubusercontent.com/vircloud/ips-cloudflare/master/blacklist.txt
--2020-03-19 13:58:42--  https://raw.githubusercontent.com/vircloud/ips-cloudflare/master/blacklist.txt
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.76.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.76.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 78617 (77K) [text/plain]
Saving to: ‘blacklist.txt’

blacklist.txt                  100%[====================================================>]  76.77K  --.-KB/s    in 0.003s  

2020-03-19 13:58:45 (22.1 MB/s) - ‘blacklist.txt’ saved [78617/78617]

root@az-hk:~# sh add-blacklist.sh
正在添加 IP:1.1.130.0/24
{
  "result": {
    "id": "",
    "paused": false,
    "modified_on": "2020-03-19T05:15:34.05760496Z",
    "allowed_modes": [
      "whitelist",
      "block",
      "challenge",
      "js_challenge"
    ],
    "mode": "challenge",
    "notes": "",
    "configuration": {
      "target": "ip_range",
      "value": "1.1.130.0/24"
    },
    "scope": {
      "id": ",
      "email": "",
      "type": "user"
    },
    "created_on": "2020-03-19T05:15:34.05760496Z"
  },
  "success": true,
  "errors": [],
  "messages": []
}
......

效果

前面提到 Firewalld 防火墙动作("mode")支持四种模式,分别是 "challenge"(质询)、"block"(阻止)、"whitelist"(白名单)、"js_challenge"(Javascript 质询)。

"whitelist"(白名单)就是允许没什么好说的,我们看看另外三个模式的效果是怎样的。

challenge

响应码:403
页面显示(验证码):

challenge.png

block

响应码:403
页面显示(Access denied):

block.png

js_challenge

响应码:503
页面显示(5 秒盾,已有破解方案):

js_challenge.png


参考:

1、《CloudFlare API v4 Documentation
2、《Cloudflare自动拉黑恶意IP到防火墙和自动切换5秒盾脚本防CC攻击


ArmxMod for Typecho
个性化、自适应、功能强大的响应式主题

推广

 继续浏览关于 防火墙cloudflare黑名单运维IP脚本apiddos 的文章

 本文最后更新于 2020/05/20 20:43:36,可能因经年累月而与现状有所差异

 引用转载请注明: VirCloud's Blog > 运维 > 通过 API 将 IP 黑名单批量添加到 CloudFlare 防火墙

精选评论

  1. 一个好人
    一个好人 回复

    Windows 10Chrome 126.0.0.0来自 中国 的大神

    大佬,我想请教下,被封禁的ip又怎么批量把他解封呢,比如把一个星期前拉黑的ip释放出来,怎么写脚本?

    1. 欧文斯
      欧文斯 回复

      Windows 10Chrome 120.0.0.0来自 美国–加利福尼亚州–洛杉矶–洛杉矶 的大神

      这个就比较有难度,添加时可以用 IP 加,删除时就需要通过添加这个 IP 时生成的对应的 ID 去删除,有两个方向,一个是添加时记录 ID,一个是删除时先查询 ID,具体可以参考官方《[Firewall Rules API](https://developers.cloudflare.com/firewall/api/cf-firewall-rules/)》