自动封禁高访问量 IP 段的 Nginx 脚本

lance 2023-07-25 AM 69℃ 0条

为什么需要封禁 IP

在服务器运维中,保护服务器免受恶意攻击是至关重要的任务之一。
常见的攻击方式之一是使用大量请求来消耗服务器资源,这可能导致服务器性能下降甚至崩溃。
为了应对这种情况,我们需要一种自动化的方法来识别高访问量的IP段并封禁与之相关的IP地址,以保护服务器的稳定性和安全性。


脚本的简单介绍

这个脚本是一个自动化的解决方案,用于封禁访问量比较大的IP
该脚本通过分析访问日志中的IP地址并统计其请求量,然后根据设定的阈值决定是否封禁该IP
脚本还具备解封之前封禁的IP的功能,并在完成封禁操作后重新加载Nginx服务器,以确保封禁规则生效。


脚本如下

脚本

#!/bin/bash
# 把访问量比较大的IP段封掉,同时解封之前封禁的IP,并重新循环
# 筛选时间段(5分钟前至当前时间)
start_time=$(date -d "-5 minutes" "+%d/%b/%Y:%H:%M")
end_time=$(date "+%d/%b/%Y:%H:%M")
log="/tmp/www.itwordsweb.net_ip_block.log"
blocked_ips="/etc/nginx/blockips_new.conf"

block_ip() {
    # 截取5分钟以前至当前的日志
    awk -v start="$start_time" -v end="$end_time" -F '[][]' '$2 >= start && $2 <= end' "$log" >/tmp/tmp_last_minute.log
    # 将所有ip都过滤出来,存到临时文件
    awk '{print $1}' /tmp/tmp_last_minute.log >/tmp/tmp_last_minute_ip.log
    # 处理IP,只留前面三位,排序、去重,获取多于1500次请求的ip段,这个数字可以根据实际情况来调整
    awk -F '.' '{print $1"."$2"."$3"."}' /tmp/tmp_last_minute_ip.log | sort | uniq -c | sort -n | awk '$1 > 1500 {print $2}' >/tmp/bad_ip_minute.list

    # 当ip数大于0时,才会将它写入到封禁IP文件中
    ip_n=$(wc -l /tmp/bad_ip_minute.list | awk '{print $1}')
    if [ ${ip_n} -ne 0 ]; then
        cat /dev/null >"$blocked_ips"
        for ip in $(cat /tmp/bad_ip_minute.list); do
            # 封ip,不能直接封ip段
            for ip2 in $(grep "^$ip" /tmp/tmp_last_minute_ip.log | sort -n | uniq); do
                echo "deny $ip2;" >>"$blocked_ips"
            done
        done
        echo "allow all;" >>"$blocked_ips"
    fi

    # 注意nginx的二进制执行路径
    ngins_status=$(/usr/sbin/nginx -t)
    if [ $? -eq 0 ]; then
        # 重新加载nginx
        /usr/sbin/nginx -s reload
    fi
}

# 检查命令行参数
if [[ $# -ne 1 ]]; then
    echo "请输入参数:start"
    exit 1
fi

# 根据命令行参数调用相应的函数
if [[ $1 == "start" ]]; then
    block_ip
else
    echo "参数输入错误。"
    exit 1
fi

定时任务

*/5 * * * * /bin/bash /tmp/block_ips.sh block_ip

使用说明

以下是使用该脚本的步骤:

  1. 在脚本中定义好日志文件路径、封禁IP配置文件路径等相关变量。
  2. 根据实际需求,可以调整脚本中的时间范围和访问量阈值等参数。
  3. 将脚本添加到定时任务中,以便每隔一定时间自动执行脚本。
  4. 运行脚本后,它会根据设定的时间范围和阈值分析访问日志,识别出访问量较大的IP,并将其封禁在Nginx配置文件中。
  5. 脚本会检查Nginx配置文件是否正确,并在验证通过后重新加载Nginx服务器,使封禁规则生效。

请注意,该脚本需要在具有适当权限的环境中运行,以便修改Nginx配置文件并重新加载服务器。


总结

通过自动化封禁高访问量IPNginx脚本,我们可以快速响应恶意攻击并保护服务器的稳定性和安全性。
这种自动化的解决方案可以减轻管理员的负担,并提供及时的保护措施。
定期审查和调整脚本中的参数,以确保其适应实际的攻击情况,并保持服务器的安全性。


非特殊说明,本博所有文章均为博主原创。

觉得文章不错,打赏一点吧,1分也是爱😀

WeChat Pay

微信打赏

Alipay

支付宝打赏

评论啦~