宝塔面板自动拉黑恶意IP到Cloudflare防火墙
以下代码由PHP站长网 52php.cn收集自互联网现在PHP站长网小编把它分享给大家,仅供参考 宝塔面板免费版本足够用了,所以我们从来也不去折腾什么开新版本,当然了土豪可以购买专业版,但是对于屌丝来说,免费版真的是足够好用,如果我们动手能力稍微强一点,那么使用起来和专业版也是没有什么差别的,而且都是自己动手,这样对于提高自己的服务器水平还是很有帮助的。 关于 Cloudflare 也讲过不少了,不过今天还是要说的是它,如果我们的网站遭遇 CC 和 DDoS 攻击时,我们可以启用 Cloudflare 经典的 5 秒盾防攻击,如果把握不了攻击的频率的话,可以设置一个定时任务,当系统负载超过某一个值(一般来攻击会导致系统负载爆增),调用 Cloudflare API 启用 5 秒盾。 当然,如果我们是宝塔用户的话,那设置起来会更简单一点,但是当我们启用 Cloudflare CDN 时候,需要在 Nginx 中启用 Real IP 模块,然后利用脚本分析网站日志,从日志中搜集异常 IP,然后使用 Cloudflare API 批量将恶意 IP 添加到 Cloudflare 的防火墙当中。不过看这篇文章之前,我们需要了解下,如何启用 Real IP 模块。不过宝塔面板 6.9.0 默认是已经开启了 Real IP 模块,如图: 如果你的宝塔面板没有开启这个模块,可以按照上文就设置。这篇文章我们就说说如何利用 shell 脚本,自动拉黑恶意 IP 到 Cloudflare 防火墙,自动切换 5 秒盾防 CC 攻击。 一:定位恶意 IP我们需要找到恶意 ip,可以利用脚本分析在一分钟单个 IP 访问的频率,超过一定的频率(一般来正常的访问,一分钟内应该不超过 60 次,你可以设置为更小),即认定为恶意 IP。宝塔面板的 shell 脚本如下: #/bin/bash #日志文件,如不是宝塔面板可以根据需要改成你自己的路径 logfile=/www/wwwlogs/ last_minutes=1 #开始时间1分钟之前(这里可以修改,如果要几分钟之内攻击次数多少次,这里可以自定义) start_time= date +"%Y-%m-%d %H:%M:%S" -d '-1 minutes' echo $start_time #结束时间现在 stop_time=`date +"%Y-%m-%d %H:%M:%S"` echo $stop_time cur_date="`date +%Y-%m-%d`" echo $cur_date #过滤出单位之间内的日志并统计最高ip数,请替换为你的日志路径 tac $logfile/www.daniao.org.log | awk -v st="$start_time" -v et="$stop_time" '{t=substr($2,RSTART+14,21);if(t>=st && t<=et) {print $0}}' | awk '{print $1}' | sort | uniq -c | sort -nr > $logfile/log_ip_top10 ip_top=`cat $logfile/log_ip_top10 | head -1 | awk '{print $1}'` ip=`cat $logfile/log_ip_top10 | awk '{if($1>2)print $2}'` # 单位时间[1分钟]内单ip访问次数超过2次的ip记录入black.txt,这里为了测试设置了2,你需要改成其它的数字 for line in $ip do echo $line >> $logfile/black.txt echo $line # 这里还可以执行CF的API来提交数据到CF防火墙 done 二:计划任务关于宝塔面板的计划任务如何设置,就不多说了,我们看看如何把上面的 ip 定位的脚本放在计划任务中。点击计划任务选择 Shell 脚本即可如图: 这个脚本,我们需要测试是否可用,我们设置的是每隔 3 分钟执行一次,所以我们可以自己手动不停刷新自己的网站或者自己的测试站点即可。我们看看最终的效果,如图: 几乎无时无刻没有扫描的,所以还是很有必要做一个防御的。 三:添加 IP 到 CF 防火墙使用以下代码就可以将恶意 IP 批量添加到 Cloudflare 的防火墙了,记得替换为你的 Cloudflare API。 #!/bin/bash # Author: Zhys # Date : 2018 # 填Cloudflare Email邮箱 CFEMAIL="daniao@gmail.com" # 填Cloudflare API key CFAPIKEY="xxxxxxxxxxxxxxxx" # 填Cloudflare Zones ID 域名对应的ID ZONESID="xxxxxxxxxxxxxxxxxxxx" # /www/wwwlogs/black.txt存放恶意攻击的IP列表 # IP一行一个。 IPADDR=$(</www/wwwlogs/black.txt) # 循环提交 IPs 到 Cloudflare 防火墙黑名单 # 模式(mode)有 block,challenge,whitelist,js_challenge for IPADDR in ${IPADDR[@]}; do echo $IPADDR curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONESID/firewall/access_rules/rules" -H "X-Auth-Email: $CFEMAIL" -H "X-Auth-Key: $CFAPIKEY" -H "Content-Type: application/json" --data '{"mode":"block","configuration":{"target":"ip","value":"'$IPADDR'"},"notes":"CC Attatch"}' done # 删除 IPs 文件收拾干净 rm -rf /data/wwwlogs/black.txt 四:自动找出恶意 IP 并添加到防火墙我们用宝塔面板当然是越省事越好,我们可以把定位 ip 和封锁 ip 到 CF 防火墙合并在一起。 #/bin/bash #日志文件,你需要改成你自己的路径 logfile=/www/wwwlogs/ last_minutes=1 #开始时间1分钟之前(这里可以修改,这里为了测试设置了2,你需要改成其它的数字 for line in $ip do echo $line >> $logfile/black.txt echo $line # 这里还可以执行CF的API来提交数据到CF防火墙 done # 填Cloudflare Email邮箱 CFEMAIL="xxx@xxx.com" # 填Cloudflare API key CFAPIKEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 填Cloudflare Zones ID 域名对应的ID ZONESID="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # /www/wwwlogs/black.txt存放恶意攻击的IP列表 # IP一行一个。 IPADDR=$(</www/wwwlogs/black.txt) # 循环提交 IPs 到 Cloudflare 防火墙黑名单 # 模式(mode)有 block,"notes":"CC Attatch"}' done # 删除 IPs 文件收拾干净 rm -rf /www/wwwlogs/black.txt 这里我们可以编辑在第二中编辑的计划任务的 Shell 脚本重新添加下即可。如果被猛烈的 CC 可以设置成每 1 分钟就执行一次,这里测试是设置成每 3 分钟执行一次脚本。自动添加恶意 IP 到 CloudFlare 防火墙的效果如下: 这样我们就实现了 CC 攻击临时救急的半自动流量清洗的功能。屏蔽成功的效果图如下: 这个错误页面提示,该网站所有者已经禁止了你的 ip 地址,额,总的来说效果还不错。 五:总结(编辑:ASP站长网) |