cloudflare自动开启验证码

发布于 / 系统运维 / 5 条评论

【原创文章】应某些朋友的反馈,说是现在很多攻击平台和软件,已经可以随意打穿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分钟就行了

效果图

本文基于《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权
转载原创文章请注明,转载自: 沧水的博客 » cloudflare自动开启验证码
  1. Fate

    貌似不行- -不知道为啥
    /home/waf.sh: line 8: $’\r’: command not found
    /home/waf.sh: line 46: syntax error in conditional expression
    /home/waf.sh: line 46: syntax error near `]]

    /home/waf.sh: line 46: `if [[ $status -eq 1 ]]

    —————————————————————————-
    ★[2019-11-08 11:58:24] Successful
    —————————————————————————-

    1. 沧水
      @Fate 直接粘贴在shell里运行会出现这种情况吗?
      1. Fate
        @沧水 我发现先把笨牛的脚本先复制粘贴进去保存一下,然后把你写的博客脚本复制粘贴进去就解决了- -不知道什么玄学问题
  2. 无名小卒

    大佬你之前发的ons游戏合集链接早挂了,跪求合集链接

    1. 沧水
      @无名小卒 已补,重新压缩上传了,解压密码换了