原项目地址:https://github.com/csh733/autouam_control 原理: 通过检测系统负载(cpu或load)自动开启 Cloudflare UAM 和 challenge(验证码)
研究了下这个项目,开启后无限循环,感觉很费劲,修改了下,然后使用宝塔面板的计划任务,可以按需检测,从而自动开启cloudflare的5秒盾。
#!/bin/bash # -------------------------- 配置部分 -------------------------- mode="load" # 模式:load(默认)或cpu challenge="1" # 启用挑战:1(默认)或0 keeptime="180" # 最小屏蔽时间(秒) interval="1" # 检查间隔(秒) email="" # CloudFlare账号邮箱 api_key="" # CloudFlare API密钥 zone_id="" # CloudFlare区域ID default_security_level="high" # 当UAM关闭时的默认安全级别 check="4" # 自定义屏蔽阈值(负载模式下为CPU核心数+2) # -------------------------- 配置结束 -------------------------- api_url="https://api.cloudflare.com/client/v4/zones/$zone_id/settings/security_level" api_url1="https://api.cloudflare.com/client/v4/zones/$zone_id/firewall/rules" api_url2="https://api.cloudflare.com/client/v4/zones/$zone_id/filters" # 如果未找到jq,则安装 if ! command -v jq &> /dev/null; then echo "未找到jq!正在安装..." if [[ -f "/usr/bin/apt-get" ]]; then sudo apt-get update sudo apt-get install -y jq elif [[ -f "/usr/bin/dnf" ]]; then sudo dnf install -y epel-release sudo dnf install -y jq elif [[ -f "/usr/bin/yum" ]]; then sudo yum install -y epel-release sudo yum install -y jq else echo "不支持的包管理器,请手动安装jq。" exit 1 fi fi # 获取系统负载或CPU使用率的函数 get_load() { if [[ "$mode" == "cpu" ]]; then check=${check:-90} TIME_INTERVAL=5 LAST_CPU_INFO=$(awk '/^cpu / {print $2,$3,$4,$5,$6,$7,$8}' /proc/stat) sleep $TIME_INTERVAL NEXT_CPU_INFO=$(awk '/^cpu / {print $2,$3,$4,$5,$6,$7,$8}' /proc/stat) SYSTEM_IDLE=$(( $(echo $NEXT_CPU_INFO | awk '{print $4}') - $(echo $LAST_CPU_INFO | awk '{print $4}') )) TOTAL_TIME=$(( $(echo $NEXT_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}') - $(echo $LAST_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}') )) load=$(awk "BEGIN {print 100 - ($SYSTEM_IDLE / $TOTAL_TIME * 100)}") else load=$(awk '{print $1}' /proc/loadavg) check=${check:-$(nproc)} fi echo $load } # 读取或初始化状态和ID status=$(cat status.txt 2>/dev/null || echo "") ruleid=$(cat ruleid.txt 2>/dev/null || echo "") filterid=$(cat filterid.txt 2>/dev/null || echo "") now=$(date +%s) file_time=$(date +%s -r status.txt 2>/dev/null || echo 0) newtime=$((now - file_time)) closetime=$((keeptime - newtime)) load=$(get_load) # 设置Cloudflare安全级别的函数 set_security_level() { local level=$1 curl -X PATCH "$api_url" \ -H "X-Auth-Email: $email" \ -H "X-Auth-Key: $api_key" \ -H "Content-Type: application/json" \ --data "{\"value\": \"$level\"}" --silent \ | jq -r '.success' } # 管理挑战的函数 manage_challenge() { local action=$1 if [[ "$action" == "enable" ]]; then filterid=$(curl -X POST "$api_url2" \ -H "X-Auth-Email: $email" \ -H "X-Auth-Key: $api_key" \ -H "Content-Type: application/json" \ --data '{"expression": "(ip.geoip.country eq \"CN\")"}' --silent | jq -r '.result[0].id') ruleid=$(curl -X POST "$api_url1" \ -H "X-Auth-Email: $email" \ -H "X-Auth-Key: $api_key" \ -H "Content-Type: application/json" \ --data "{\"action\": \"challenge\", \"filter\": {\"id\": \"$filterid\"}, \"description\": \"China Challenge\"}" --silent | jq -r '.result[0].id') echo $ruleid > ruleid.txt echo $filterid > filterid.txt else curl -X DELETE "$api_url1/$ruleid" \ -H "X-Auth-Email: $email" \ -H "X-Auth-Key: $api_key" \ -H "Content-Type: application/json" --silent curl -X DELETE "$api_url2/$filterid" \ -H "X-Auth-Email: $email" \ -H "X-Auth-Key: $api_key" \ -H "Content-Type: application/json" --silent fi } # 打印当前状态 echo "当前$mode负载:$load" if [[ $status -eq 1 ]]; then echo "UAM已开启!挑战$( [[ "$challenge" -eq 1 ]] && echo "已开启" || echo "已关闭" )" else echo "UAM已关闭!挑战$( [[ "$challenge" -eq 1 ]] && echo "已关闭" || echo "已关闭" )" fi # 决策逻辑 if (( $(awk "BEGIN {print ($load < $check)}") )) && (( status == 1 )) && (( newtime > keeptime )); then echo -e "\n$mode负载低于$check,UAM已开启$now秒,恢复到默认安全级别($default_security_level)" if [[ "$(set_security_level $default_security_level)" == "true" ]]; then echo 0 > status.txt echo -e "\n成功" fi if [[ "$challenge" -eq 1 ]]; then manage_challenge disable echo -e "\n成功关闭挑战" fi elif (( $(awk "BEGIN {print ($load < $check)}") )); then echo -e "\n$mode负载低于$check,无变化,状态已持续$newtime秒" if (( status == 1 )); then echo -e "将在$closetime秒后恢复到$default_security_level" fi elif (( $(awk "BEGIN {print ($load > $check)}") )) && (( status == 1 )) && (( newtime > keeptime )); then echo -e "\n$mode负载高于$check,UAM已开启超过$keeptime秒,UAM无效" elif (( $(awk "BEGIN {print ($load > $check)}") )) && (( status == 1 )); then echo -e "\n$mode负载高于$check,UAM已激活$newtime秒,请观察" elif (( $(awk "BEGIN {print ($load > $check)}") )) && (( status != 1 )); then echo -e "\n$mode负载高于$check,启用UAM保护" if [[ "$(set_security_level 'under_attack')" == "true" ]]; then echo 1 > status.txt echo -e "\n成功" fi if [[ "$challenge" -eq 1 ]]; then manage_challenge enable echo -e "\n成功开启挑战" fi fi echo "------------------------------------------------------------"
标签: 宝塔面板 计划任务 cloudflare 5秒盾
文章来源:
zk的思想创意收集馆
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~