Nginx自动封禁IP的脚本实现

引言

在网站运营过程中,我们经常会遇到一些恶意的IP频繁访问,甚至进行攻击。为了保护网站的安全和稳定,我们可以使用Nginx来封禁这些恶意的IP。本文将介绍如何通过编写shell脚本,结合Nginx和crontab,实现自动封禁每分钟访问超过60次的IP。

一、Nginx封禁指定IP的实现

  1. 创建blockip.conf文件

    在Nginx的conf目录下创建一个blockip.conf文件,用于存放需要封禁的IP。格式如下:

    deny 192.168.1.1;
    deny 192.168.1.2;
    
  2. 修改Nginx配置

    在Nginx的HTTP配置中添加如下内容,以包含blockip.conf文件:

    http {
        ...
        include /usr/local/nginx/conf/blockip.conf;
        ...
    }
    
  3. 重启Nginx

    修改完配置后,重启Nginx以使配置生效:

    /usr/local/nginx/sbin/nginx -s reload
    
  4. 验证封禁效果

    尝试从被封禁的IP访问网站,应该会看到403禁止访问的提示。

二、使用AWK统计access.log,记录每分钟访问超过60次的IP

操作一:统计访问次数

我们可以使用AWK来统计access.log中每分钟访问超过60次的IP。以下是具体的命令:

awk '{print $1}' access.log | sort | uniq -cd | awk '{if($1>60)print $0}'
  • awk '{print $1}' access.log:取出access.log的第一列,即IP地址。
  • sort | uniq -cd:对IP地址进行排序、去重,并统计每个IP的出现次数。
  • awk '{if($1>60)print $0}':判断每个IP的出现次数是否超过60次,如果超过则输出。

示例运行结果

假设access.log中有以下内容:

192.168.1.1 - - [12/Mar/2023:12:00:01] "GET / HTTP/1.1" 200 123
192.168.1.1 - - [12/Mar/2023:12:00:02] "GET / HTTP/1.1" 200 123
...(省略多行)
192.168.1.1 - - [12/Mar/2023:12:01:00] "GET / HTTP/1.1" 200 123
192.168.1.2 - - [12/Mar/2023:12:01:01] "GET / HTTP/1.1" 200 123

运行上述AWK命令后,可能得到以下输出:

123 192.168.1.1

表示192.168.1.1这个IP在日志中出现了123次,超过了60次。

三、编写shell脚本,实现自动封禁功能

以下是一个完整的shell脚本,用于自动封禁每分钟访问超过60次的IP:

#!/bin/bash

# 清除blockip.conf文件内容,以免误封IP
echo "" > /usr/local/nginx/conf/blockip.conf

# 统计每分钟访问超过60次的IP
ip_list=$(awk '{print $1}' /usr/local/nginx/logs/access.log | sort | uniq -cd | awk '{if($1>60)print $2}')

# 判断变量是否为空
if test -z "$ip_list"
then
    # 为空则记录日志,并重新加载Nginx
    echo "没有超过访问限制的IP" >> /usr/local/nginx/logs/11.log
    /usr/local/nginx/sbin/nginx -s reload
else
    # 如果不为空,则将IP以deny格式写入blockip.conf
    for ip in $ip_list; do
        echo "deny $ip;" >> /usr/local/nginx/conf/blockip.conf
    done
    
    # 重新加载Nginx
    /usr/local/nginx/sbin/nginx -s reload
    
    # 清空access.log,以便从最新日志开始统计(根据实际情况决定是否清空)
    # echo "" > /usr/local/nginx/logs/access.log
fi

注意事项

  1. 脚本中使用了for循环来处理多个超过访问限制的IP。
  2. 清空access.log的操作是可选的,根据实际情况决定是否执行。
  3. 确保脚本具有执行权限,可以使用chmod +x ip_test.sh来赋予权限。

示例运行结果

假设access.log中有多个IP超过了访问限制,运行脚本后,blockip.conf文件可能包含以下内容:

deny 192.168.1.1;
deny 192.168.1.2;

四、使用crontab定时执行脚本

为了定时检查并封禁恶意IP,我们可以使用crontab来定时执行上述脚本。

  1. 编辑crontab

    crontab -e
    
  2. 添加定时任务

    在crontab文件中添加以下行,以每分钟执行一次脚本:

    * * * * * /usr/local/nginx/logs/ip_test.sh
    

    确保脚本路径正确,且脚本具有执行权限。

  3. 重启crond服务

    修改完crontab后,重启crond服务以使配置生效:

    systemctl restart crond.service
    

结语

通过以上步骤,我们可以实现Nginx自动封禁每分钟访问超过60次的IP。这有助于保护网站的安全和稳定,防止恶意IP的频繁访问和攻击。希望本文对你有所帮助,如果有任何问题或建议,欢迎留言交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值