快捷搜索:   nginx

SHELL脚本实现根据服务器负载开关Cloudflare防御规则 SHELL根据负载调整CF Pagerule

CLOUDFLARE的CDN防御免费又强大,很多人使用,我们也提供了中文面板及批量操作功能供大家使用,面板地址https://cdn.bnxb.com

但是如果在被CC攻击的时候开启五秒盾还是会影响一定的用户体验,因此我们可以根据服务器负载情况来决定开启不开启防御规则,这里我们选择在CF定制一条自定义规则来实现防御,规则里面设置5秒盾,全部缓存等一系列规则,并在负载高的时候通过API自动访问开启该条规则.在开启防御规则后1个小时尝试关闭五秒盾,如果关闭后负载还是不高,那就会持续关闭,如果关闭后1分钟负载又升高,就又会打开防御规则,就是这样的一个持续循环流程,这样就可以不需要人工干预,被打自动打开,攻击停止自动关闭,防止流量损失.


首先服务器必须安装CURL,这个默认是开启的,但是可能还有部分MINI安装的系统可能没有

UBUNTU,DEBIAN运行:

apt-get install curl

CENTOS运行:

yum install curl

接下来创建一个SH文件

mkdir /etc/cloudflare
vi /etc/cloudflare/cf.sh

按I输入下面代码

if [ ! -f "status.txt" ];then
echo "" > status.txt
else
status=$(cat status.txt)
fi
now=$(date +%s)
time=$(date +%s -r status.txt)
load=$(cat /proc/loadavg | colrm 5)
echo "当前负载:$load"
newtime=`expr $now - $time`
if [[ $load <1.5 ]] && [[ $status -eq 1 ]] && [[ $newtime >3600 ]]  
then
cResult=$(curl --insecure -X PATCH "https://api.cloudflare.com/client/v4/zones/你的ZONEID/pagerules/当前自定义规则ID" -H "X-Auth-Email: 您的CF邮箱" -H "X-Auth-Key: CF的API_KEY" -H "Content-Type: application/json" --data '{"status":"disabled"}')
echo $cResult
echo "负载低于1.5,当前已开盾超过1小时($newtime秒),尝试关盾"
echo 0 > status.txt
elif [[ $load <1.5 ]]
then
echo "负载低于1.5,不做任何改变,$newtime秒"
exit
else
cResult=$(curl --insecure -X PATCH "https://api.cloudflare.com/client/v4/zones/你的ZONEID/pagerules/当前自定义规则ID" -H "X-Auth-Email: 您的CF邮箱" -H "X-Auth-Key: CF的API_KEY" -H "Content-Type: application/json" --data '{"status":"active"}')
echo $cResult
echo "负载高于1.5,开启防御规则"
echo 1 > status.txt
fi

然后按ESC,输入wq回车保存

上面负载数要根据你服务器CPU的核心数来设置,一般可以简单的设置为你的核心数*1.2  比如你CPU是双核的,可以设置为2.4

然后执行授权

chmod +x /etc/cloudflare/cf.sh


注意:上面的ZONEID和自定义规则ID的获取方式,可以从

https://cdn.bnxb.com/domainlist.php 访问

选择页面规则定制

blob.png

进去后如果没有自定义过规则,那就添加一条

blob.png

顺序值越小越前面,免费版只支持3条规则,也就是只能写1-3,域名支持*通配符

blob.png

提交后会自动生成一条规则,然后需要点编辑进去添加更多防御规则

blob.png

注意下面浏览器中地址栏后面zoneid=后面就是需要填入sh脚本中zoneid,后面的ID=就是需要填入的自定义规则ID,然后这个自定义规则一定要记得设置抗攻击级别“被攻击中”,这样才能打开5秒盾

blob.png


到这里脚本的设置就完成了

接下来设置自动执行

crontab -e

按i在后面添加

* * * * * sh /etc/cloudflare/cf.sh

然后按ESC,输入wq保存退出,这样脚本就会1分钟执行一次

service crond restart
crontab -l


重启计划任务和查看计划任务是否生效。



PS:读取负载可以改成用

cpu_idle=`top -n 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $9}'` 

判断CPU空闲情况,CPU空闲<10那就是高负载状态,再开盾

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论