【原創文章】應某些朋友的反饋,說是現在很多攻擊平台和軟體,已經可以隨意打穿 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 自動開啟驗證碼