宝塔面板使用计划任务,自动开启cloudflare的5秒盾

转载文章 建站运维 1.0K
原项目地址:https://github.com/csh733/autouam_control
原理: 通过检测系统负载(cpu或load)自动开启 Cloudflare UAM 和 challenge(验证码)

研究了下这个项目,开启后无限循环,感觉很费劲,修改了下,然后使用宝塔面板计划任务,可以按需检测,从而自动开启cloudflare5秒盾

#!/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秒盾

上一篇SEO中的分页技巧!可以提升网站权重与排名

下一篇当前分类已是最新一篇

发布评论 0条评论)

您需要 登录账户 后才能发表评论
  • Refresh code

还木有评论哦,快来抢沙发吧~