• 欢迎访问南思工作室官方站点.
  • 文章内容如有失效请文章下留言,我们看到后会第一时间处理。
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏南思工作室吧。
  • 图片服务器和主服务器都挂了CDN,如有异常,请留言,我们会尽快处理。

宝塔面板Nginx配合shell脚本实现自动封禁IP 防御CC DDOS攻击方法

服务器 nansi 2个月前 (07-13) 134次浏览 0个评论

宝塔面板现在很多小白用户使用的非常多,功能比较简单易用,但是其中防御功能较弱,内置的 WAF 并不能实现服务器级别的防火墙封 IP,所以我们只能借用一下其中的功能,加上 LINUX 系统天然自带的 SHELL+IPTABLES 防火墙来封禁 IP

宝塔安装的 NGINX 按下面配置

软件管理-Nginx 管理-配置修改

error_log  /www/wwwlogs/nginx_error.log  crit;

改成

error_log  /www/wwwlogs/nginx_error.log  error;

然后到需要开启防御的网站管理 点 设置-流量限制

这里启用流量限制,并将单 IP 并发数进行限制,一般如果网站页面不复杂设置为 10 就行。如果网页有很多调用 CSS,JS 之类的,自行计算一下

宝塔面板 Nginx 配合 shell 脚本实现自动封禁 IP 防御 CC DDOS 攻击方法

这样重启 NGINX 后当有客户端频繁刷新你的网页,发起的请求将在超过设置的每秒钟允许数量后被禁止访问,同时将在 NGINX error.log(默认在 /www/wwwroot/nginx_error.log) 中看到类似记录:

2018/04/27 14:25:27 [error] 6307#0: *1472746 limiting connections by zone “perip”, client: 182.161.35.139, server: 104.153.102.68, request: “GET /index.php?10=8 HTTP/1.1”

此时请求已经被 NGINX 限流,但是客户端仍然能够继续发送请求到 NGINX,还是会占用一定的服务器资源。

因此接下来进行 shell 脚本设置,将这个 client 的 IP 直接通过防火墙封杀

首先升级系统软件并安装 iptables

连接 SSH 执行

yum -y update

对系统软件进行必要升级。

接下来确认你的系统版本,脚本在 CENTOS6,CENTOS7 下均测试可用,但是 CENTOS7 默认防火墙是 firewalle,这个暂时没研究怎么设置,所以还是建议大家安装一下 iptables,如果是 CENTOS6 默认的防火墙是 iptables 那就无须这一步操作

#先检查是否安装了 iptables

service iptables status
#安装 iptables
yum install -y iptables
#升级 iptables
yum update iptables
#安装 iptables-services
yum install iptables-services

禁用/停止自带的 firewalld 服务

#停止 firewalld 服务
systemctl stop firewalld
#禁用 firewalld 服务
systemctl mask firewalld

二、进行脚本设置

进 CENTOS

vi /www/wwwroot/iptables.sh

shell 脚本如下

#!/bin/bash
tail /www/wwwlogs/nginx_error.log -n 200 | grep "perip"| awk -F'[ ,]' '{print $13}' | sort | uniq | sort -n > /www/wwwroot/drop_ip.txt 
for i in $(cat /www/wwwroot/drop_ip.txt)
do 
FLAG=0  
  for j in $(cat /www/wwwroot/drop_ip_all.txt)
do
      if [ $i = $j ]; then  
        FLAG=1  
        break  
      fi  
  done  
  if [ $FLAG -eq 0 ]; then  
    echo --new drop ip:$i 
    #add to iptables  
    /sbin/iptables -C INPUT -s $i -j DROP  
  fi  
done  
  
#select drop_ip.txt append to drop_ip_all.txt  
cat /www/wwwroot/drop_ip.txt >> /www/wwwroot/drop_ip_all.txt  
  
#drop_ip_all remove repeat ip  
#cat /www/wwwroot/drop_ip_all.txt | sort | uniq > /www/wwwroot/drop_ip_all.txt

对于部分较低版本的 IPTABLES 防火墙可能不支持-C 参数,可以改成-I,

iptables -C INPUT -s $i -j DROP

改成

iptables -I INPUT -s $i -j DROP

另外针对部分环境,宝塔存在 BUG,无法记录到流量控制信息,比如部分系统反代的情况下就有出现无法记录流控错误信息的情况,造成无法防御的情况,可以将第一句改成从网站日志取值

tail /www/wwwlogs/nginx_error.log -n 200 | grep "perip"| awk -F'[ ,]' '{print $13}' | sort | uniq | sort -n > /www/wwwroot/drop_ip.txt

替换成

tail -1000 /www/wwwlogs/bnxb.com.log |cut -d ' ' -f 1 | sort |uniq -c | awk '{if ($1 > 100) print $0}' > /www/wwwroot/drop_ip.txt

意思是读取网站日志的前一千条记录(防止日志过大读取压力大),然后取这一千条中访问超过 100 的记录,进行屏蔽,但是不建议用这种方式,这种方式对于平时没什么访问量的网站会造成,前一千条可能都是蜘蛛的爬行记录,这里的 IP 都是搜索引擎的蜘蛛 IP,可能会误杀

三、对脚本进行权限提升和写入自动任务

chmod +x /www/wwwroot/iptables.sh
echo "* * * * * root /www/wwwroot/iptables.sh" >> /etc/crontab
service crond restart

这里设置为每分钟执行一次。

然后还可以设置每天凌晨重启防火墙

echo "01 1 * * * root /etc/init.d/iptables restart" >> /etc/crontab
service crond restart

四、确定计划任务已经执行

执行

crontab -l

看看有没有一条

* * * * * root /www/wwwroot/iptables.sh

如果没有可能是服务器用的系统,计划任务配置文件已经被改动过不是/etc/crontab 了

可以执行

crontab -e

按 i 进入插入模式,手动将下面代码黏贴进去

* * * * * root /www/wwwroot/iptables.sh

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

service crond restart
crontab -l

当然如果你是套了 CDN,那也是有解决办法的,但是需要你的 CDN 提供商支持 IP 防火墙,也就是 IP 黑名单功能。


南思工作室 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:宝塔面板 Nginx 配合 shell 脚本实现自动封禁 IP 防御 CC DDOS 攻击方法
免责声明:本站一切资源仅用作交流学习,请勿用作商业或违法行为!如造成任何后果,本站概不负责!
喜欢 (12)
关于作者:
南思工作室管理员
发表我的评论
取消评论
表情 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址