【原创文章】应某些朋友的反馈,说是现在很多攻击平台和软件,已经可以随意打穿 cf 的五秒盾,因此以前使用的 cloudflare 五秒盾脚本就不那么管用了,对于这个问题,大晚上的花了一点时间修改了笨牛发布的脚本,把它改成了开验证码,不过 api 变成了官方的,配置更加复杂一些,直接上脚本:
已得到原作者的口头同意
#github https://github.com/CangShui/clouflarea-auto-firewall
email="[email protected]"
globalapi="7777777777777777777777777"
rulesid1="666666666666666666666666666"
rulesid2="8888888888888888888888888"
zoneid="333333333333333333333333333"
mode="cpu" #判断服务器负载方式 load负载法 cpu CPU百分比法 只能选一个
keeptime=240 #开盾负载下降后持续多少秒,进行尝试关盾
if [ "$mode" = "cpu" ];
then
check=85 #5秒内CPU连续超过85 则开盾【可以根据您的服务器负荷情况调整】
#系统空闲时间
TIME_INTERVAL=5
time=$(date "+%Y-%m-%d %H:%M:%S")
LAST_CPU_INFO=$(cat /proc/stat grep -w cpu awk '{print $2,$3,$4,$5,$6,$7,$8}')
LAST_SYS_IDLE=$(echo $LAST_CPU_INFO awk '{print $4}')
LAST_TOTAL_CPU_T=$(echo $LAST_CPU_INFO awk '{print $1+$2+$3+$4+$5+$6+$7}')
sleep ${TIME_INTERVAL}
NEXT_CPU_INFO=$(cat /proc/stat grep -w cpu awk '{print $2,$3,$4,$5,$6,$7,$8}')
NEXT_SYS_IDLE=$(echo $NEXT_CPU_INFO awk '{print $4}')
NEXT_TOTAL_CPU_T=$(echo $NEXT_CPU_INFO awk '{print $1+$2+$3+$4+$5+$6+$7}')
#系统空闲时间
SYSTEM_IDLE=`echo ${NEXT_SYS_IDLE} ${LAST_SYS_IDLE} awk '{print $1-$2}'`
#CPU总时间
TOTAL_TIME=`echo ${NEXT_TOTAL_CPU_T} ${LAST_TOTAL_CPU_T} awk '{print $1-$2}'`
load=`echo ${SYSTEM_IDLE} ${TOTAL_TIME} awk '{printf "%.2f", 100-$1/$2*100}'`
else
load=$(cat /proc/loadavg colrm 5)
check=$(cat /proc/cpuinfo grep "processor" wc -l)
fi
if [ ! -f "/home/status.txt" ];then
echo "" > /home/status.txt
else
status=$(cat /home/status.txt)
echo $status
fi
now=$(date +%s)
time=$(date +%s -r /home/status.txt)
echo "当前$mode负载:$load"
if [[ $status -eq 1 ]]
then
echo "当前开盾中"
else
echo "当前未开盾"
fi
newtime=`expr $now - $time`
closetime=`expr $keeptime - $newtime`
if [[ $load <$check ]]&&[[ $status -eq 1 ]]&&[[ $newtime -gt $keeptime ]]
then
echo -e "\n$mode负载低于$check,当前已开盾超过半小时($newtime秒),尝试关盾"
cResult=$(
curl -X PUT \
-H "X-Auth-Email: $email" \
-H "X-Auth-Key: $globalapi" \
-H "Content-Type: application/json" \
-d '{
"id": "$rulesid1",
"paused": true,
"description": "全部都验证码",
"action": "challenge",
"priority": 1000,
"filter": {
"id": "'$rulesid2'"
}
}' "https://api.cloudflare.com/client/v4/zones/$zoneid/firewall/rules/$rulesid1"
)
echo $cResult
size=${#cResult}
if [[ $size -gt 10 ]]
then
echo 0 > /home/status.txt
echo -e "\n关盾成功"
fi
elif [[ $load <$check ]]
then
echo -e "\n$mode负载低于$check,不做任何改变,$newtime秒"
if [[ $status -eq 1 ]]
then
echo -e "将于$closetime秒后关盾"
fi
exit
elif [[ $load >$check ]] && [[ $status -eq 1 ]] && [[ $newtime -gt $keeptime ]]
then
echo -e "\n$mode负载高于$check,当前已开盾超过$newtime秒,盾无效,请联系管理员定制其他方案"
exit
elif [[ $load >$check ]] && [[ $status -eq 1 ]]
then
echo -e "\n$mode负载高于$check,当前已开盾($newtime秒),请再观察"
exit
elif [[ $load >$check ]]
then
echo -e "\n$mode负载高于$check,开启防御规则"
cResult=$(
curl -X PUT \
-H "X-Auth-Email: $email" \
-H "X-Auth-Key: $globalapi" \
-H "Content-Type: application/json" \
-d '{
"id": "$rulesid1",
"paused": false,
"description": "全部都验证码",
"action": "challenge",
"priority": 1000,
"filter": {
"id": "'$rulesid2'"
}
}' "https://api.cloudflare.com/client/v4/zones/$zoneid/firewall/rules/$rulesid1"
)
echo $cResult
size=${#cResult}
if [[ $size -gt 10 ]]
then
echo 1 > /home/status.txt
echo -e "\n开盾成功"
fi
else
echo 0 > /home/status.txt
fi
在使用脚本之前,你需要创建这样一个 cloudflare firewall rules:
然后开始一步步填写脚本里的变量:
1. 第一行的 email 变量填的是你 cloudflare 账号的登录邮箱
2. 第二行的 globalapi 变量,填写的是下图这里的 key,这个页面需要右上角点头像,然后点击 my profile 里 api tokens 菜单里
3. rulesid1 和 rulesid2 需要打开 cloudflare firewall rules 页面,如下图操作:
先打开浏览器的控制台,然后找到你刚刚添加的规则,开启或关闭他,在控制台的 network 功能里找到如图所示的请求,第一个 key 填在 rulesid1 变量,第二个 key 填在 rulesid2 变量里
4.zoneid 这个变量打开你的域名总览页面,然后看右下角,如图所示:
到这里差不多就配置完了,默认的是 5 秒内 CPU 占用持续超过 85 开启验证码,然后 240 秒后占用下降了自动关盾
配置完之后,你需要设置一个定时任务来执行脚本,如果你是宝塔的话应该就知道怎么做了,设置个 1 分钟就行了
效果图
转载自: 沧水的博客 » cloudflare 自动开启验证码