温馨提示:
本文所述内容具有依赖性,可能因软硬条件不同而与预期有所差异,故请以实际为准,仅供参考。
之前提到过《网站如何屏蔽垃圾蜘蛛爬取?》,其中一个措施是 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、参数 CFEMAIL
是 CloudFlare 账户注册邮箱,CFAPIKEY
在账户 -- 个人资料 -- API 令牌这里找到 Global API Key,ZONESID
和 ACCOUNTID
在域名概述的右下角找到 区域 ID和帐户 ID:
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
页面显示(验证码):
block
响应码:403
页面显示(Access denied):
js_challenge
响应码:503
页面显示(5 秒盾,已有破解方案):
参考:
1、《CloudFlare API v4 Documentation》
2、《Cloudflare自动拉黑恶意IP到防火墙和自动切换5秒盾脚本防CC攻击》