通过 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 防火墙