分享宝塔面板接入CF自动开启5秒盾 + 验证码脚本

作者:寒风笔记 2020-11-25 浏览:56
今日头条: 趣闲赚一个单干一天赚一百的项目


有大神分享了CF自动开启5秒盾 + 验证码脚本,原理就是通过检测系统负载(cpu或load)自动开启cloudflare UAM和challenge质询(验证码)!!

大鸟这里分享下宝塔面板下如何用起来,使用的前提是你的域名需要接入cloudflare。

1、简介

项目:https://github.com/jiuqiMax/autouam

2、申请api_key

开搞之前先申请CloudFlare API KEY,登录cf之后,点击右上角的个人资料(My Profile),选择{API Tokens}选择{Global API Key}

3、申请zone_id

回到后台首页,点击域名管理,在右侧就可以看到Zone ID,如图:

4、代码

脚本代码如下:





  1. #!/bin/bash

  2.  

  3. #

  4. # Usage:

  5. # screen -dmS autouam &&

  6. # screen -x -S autouam -p 0 -X stuff "bash /root/autouam.sh" &&

  7. # screen -x -S autouam -p 0 -X stuff $'\n'

  8. #

  9.  

  10. mode="load"

  11. # 两种模式可选,一:cpu 二:load

  12.  

  13. challenge="1"

  14. # 是否同时开启验证码质询 设为1即开启

  15.  

  16. keeptime="300"

  17. # ≈开盾最小时间,如60 则开盾60秒内负载降低不会关,60秒后关

  18.  

  19. interval="0.5"

  20. # 检测间隔时间,默认0.5秒

  21.  

  22. email="wdnmd@cloudflare.com"

  23. # CloudFlare 账号邮箱

  24.  

  25. api_key="(´இ皿இ`)"

  26. # CloudFlare API KEY

  27.  

  28. zone_id="ಥ_ಥ"

  29. # 区域ID 在域名的概述页面获取

  30.  

  31. default_security_level="high"

  32. # 默认安全等级 关闭UAM时将会把安全等级调整为它

  33.  

  34. api_url="https://api.cloudflare.com/client/v4/zones/$zone_id/settings/security_level"

  35. # API的地址

  36.  

  37. api_url1="https://api.cloudflare.com/client/v4/zones/$zone_id/firewall/access_rules/rules"

  38. # API的地址之二

  39.  

  40. # 安装依赖

  41. if [ ! $(which jq 2> /dev/null) ]; then

  42.    echo "jq not found!"

  43.    if [ -f "/usr/bin/yum" ] && [ -d "/etc/yum.repos.d" ]; then

  44.        yum install jq -y

  45.    elif [ -f "/usr/bin/apt-get" ] && [ -f "/usr/bin/dpkg" ]; then

  46.        apt-get install jq -y

  47.    fi

  48. fi

  49.  

  50. for((;;))

  51. do

  52. if [ "$mode" = "cpu" ];

  53. then

  54. check=90   #5秒内CPU连续超过80 则开启UAM【可以根据您的服务器负荷情况调整】

  55. #系统空闲时间

  56. TIME_INTERVAL=5

  57. time=$(date "+%Y-%m-%d %H:%M:%S")

  58. LAST_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')

  59. LAST_SYS_IDLE=$(echo $LAST_CPU_INFO | awk '{print $4}')

  60. LAST_TOTAL_CPU_T=$(echo $LAST_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')

  61. sleep ${TIME_INTERVAL}

  62. NEXT_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')

  63. NEXT_SYS_IDLE=$(echo $NEXT_CPU_INFO | awk '{print $4}')

  64. NEXT_TOTAL_CPU_T=$(echo $NEXT_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')

  65.  

  66. #系统空闲时间

  67. SYSTEM_IDLE=`echo ${NEXT_SYS_IDLE} ${LAST_SYS_IDLE} | awk '{print $1-$2}'`

  68. #CPU总时间

  69. TOTAL_TIME=`echo ${NEXT_TOTAL_CPU_T} ${LAST_TOTAL_CPU_T} | awk '{print $1-$2}'`

  70. load=`echo ${SYSTEM_IDLE} ${TOTAL_TIME} | awk '{printf "%.2f", 100-$1/$2*100}'`

  71. else

  72. load=$(cat /proc/loadavg | colrm 5)

  73. check=$(cat /proc/cpuinfo | grep "processor" | wc -l)

  74.  

  75. fi

  76.  

  77. if [ ! -f "status.txt" ];then

  78. echo "" > status.txt

  79. else

  80. status=$(cat status.txt)

  81. fi

  82. now=$(date +%s)

  83. time=$(date +%s -r status.txt)

  84.  

  85.  

  86.  

  87. echo "当前$mode负载:$load"

  88. if [[ $status -eq 1 ]]

  89. then

  90. echo "UAM ON!"

  91. else

  92. echo "UAM OFF!"

  93. fi

  94.  

  95. newtime=`expr $now - $time`

  96. closetime=`expr $keeptime - $newtime`

  97.  

  98. if [[ $load <$check ]]&&[[ $status -eq 1 ]]&&[[ $newtime -gt $keeptime ]]

  99. then

  100.    echo -e "\n$mode负载低于$check,当前已开盾超过规定时间$newtime秒,尝试调整至默认安全等级($default_security_level)"

  101.    # Disable Under Attack Mode

  102.    result=$(curl -X PATCH "$api_url" \

  103.        -H "X-Auth-Email: $email" \

  104.        -H "X-Auth-Key: $api_key" \

  105.        -H "Content-Type: application/json" \

  106.        --data "{

  107.            \"value\": \"$default_security_level\"

  108.        }" --silent \

  109.    | jq -r '.success')

  110.    if [ "$result" = "true" ]; then

  111.        echo 0 > status.txt

  112.        echo -e "\n成功"

  113.    fi

  114.    if [ "$challenge" -eq 1 ]; then

  115.        rulesid=$(curl -X GET "$api_url1?per_page=1000&mode=challenge&configuration.target=country" \

  116.            -H "X-Auth-Email: $email" \

  117.            -H "X-Auth-Key: $api_key" \

  118.            -H "Content-Type: application/json" \

  119.            --silent \

  120.        | jq -r '.result[].id')

  121.        for i in $rulesid

  122.        do

  123.            result=$(curl -X DELETE "$api_url1/$i" \

  124.                -H "X-Auth-Email: $email" \

  125.                -H "X-Auth-Key: $api_key" \

  126.                -H "Content-Type: application/json" \

  127.                --data "{

  128.                    \"cascade\": \"none\"

  129.                }" --silent \

  130.            | jq -r '.success')

  131.            if [ "$result" = "true" ]; then

  132.                echo -e "\n删除验证码 成功 ID: $i"

  133.            fi

  134.        done

  135.    fi

  136.  

  137. elif [[ $load <$check ]]

  138. then

  139.    echo -e "\n$mode负载低于$check,不做任何改变,状态持续了$newtime秒"

  140.    if [[ $status -eq 1 ]]

  141.    then

  142.        echo -e "将于$closetime秒后调整安全等级至$default_security_level"

  143.    fi

  144.  

  145. elif [[ $load >$check ]] && [[ $status -eq 1 ]] && [[ $newtime -gt $keeptime ]]

  146. then

  147.    echo -e "\n$mode负载高于$check,当前已开启UAM超过$keeptime秒,UAM无效"

  148. elif [[ $load >$check ]] && [[ $status -eq 1 ]]

  149. then

  150.    echo -e "\n$mode负载高于$check,当前已开启($newtime秒),请再观察"

  151. elif [[ $load >$check ]]

  152. then

  153.    echo -e "\n$mode负载高于$check,开启UAM"

  154.    # Enable Under Attack Mode

  155.    result=$(curl -X PATCH "$api_url" \

  156.        -H "X-Auth-Email: $email" \

  157.        -H "X-Auth-Key: $api_key" \

  158.        -H "Content-Type: application/json" \

  159.            --data "{

  160.                \"value\": \"under_attack\"

  161.            }" --silent \

  162.    | jq -r '.success')

  163.    if [ "$result" = "true" ]; then

  164.        echo 1 > status.txt

  165.        echo -e "\n成功"

  166.    fi

  167.    if [ "$challenge" -eq 1 ]; then

  168.        for i in AF AX AL DZ AS AD AO AI AQ AG AR AM AW AU AT AZ BS BH BD BB BY BE BZ BJ BM BT BO BQ BA BW BV BR IO BN BG BF BI KH CM CA CV KY CF TD CL CN CX CC CO KM CG CD CK CR CI HR CU CW CY CZ DK DJ DM DO EC EG SV GQ ER EE ET FK FO FJ FI FR GF PF TF GA GM GE DE GH GI GR GL GD GP GU GT GG GN GW GY HT HM VA HN HK HU IS IN ID IR IQ IE IM IL IT JM JP JE JO KZ KE KI KP KR KW KG LA LV LB LS LR LY LI LT LU MO MK MG MW MY MV ML MT MH MQ MR MU YT MX FM MD MC MN ME MS MA MZ MM NA NR NP NL NC NZ NI NE NG NU NF MP NO OM PK PW PS PA PG PY PE PH PN PL PT PR QA RE RO RU RW BL SH KN LC MF PM VC WS SM ST SA SN RS SC SL SG SX SK SI SB SO ZA GS SS ES LK SD SR SJ SZ SE CH SY TW TJ TZ TH TL TG TK TO TT TN TR TM TC TV UG UA AE GB UM UY UZ VU VE VN VG VI WF EH YE ZM ZW XX T1

  169.        do

  170.            result=$(curl -X POST "$api_url1" \

  171.                -H "X-Auth-Email: $email" \

  172.                -H "X-Auth-Key: $api_key" \

  173.                -H "Content-Type: application/json" \

  174.                --data "{

  175.                    \"mode\": \"challenge\",

  176.                    \"configuration\": {

  177.                        \"target\": \"country\",

  178.                        \"value\": \"$i\"

  179.                    }

  180.                }" --silent \

  181.            | jq -r '.success')

  182.            if [ "$result" = "true" ]; then

  183.            echo -e "\n开启对$i国家的验证码 成功"

  184.            fi

  185.        done

  186.    fi

  187. else

  188. echo 0 > status.txt

  189. fi

  190. sleep $interval

  191. clear

  192. done


注意:该修改的地方,要修改。

5、计划任务

宝塔面板的计划任务中新建一个任务,如图:

保存之后,可以试着执行下看看效果:

6、最后

如果你的站点被攻击频繁,可以试着把执行周期改成每天,或者每小时啥的,这个自行调整。如果有更新,请自行进入项目获取最新脚本。

注意!默认challenge=1,将在开启UAM的同时开启验证码。如果你不想,请将它设为0


来源大鸟博客

转载请注明出处:寒风笔记,如有疑问,请联系(寒风日记)。
本文地址:https://www.uscbbs.com/37.html