Nginx实现动态封禁IP的步骤指南

2025-02-25 17:50

本文主要是介绍Nginx实现动态封禁IP的步骤指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Nginx实现动态封禁IP的步骤指南》在日常的生产环境中,网站可能会遭遇恶意请求、DDoS攻击或其他有害的访问行为,为了应对这些情况,动态封禁IP是一项十分重要的安全策略,本篇博客将介绍如何通过NG...

1、简述

在日常的生产环境中,网站可能会遭遇恶意请求、DDOS 攻击或其他有害的访问行为。为了应对这些情况,动态封禁 IP 是一项十分重要的安全策略。本篇博客将介绍如何通过 NGINX 实现动态封禁 IP,从配置到自动化的实现步骤。

2、实现方式

NGINX 本身支持简单的基于 IP 的访问控制(如 deny 和 allow 指令),但要实现动态封禁,通常结合以下几种方案:

  • fail2ban:一个常用的自动封禁工具,通过监控日志发现恶意行为并自动修改 NGINX 配置文件。
  • nginx 动态模块:如 ngx_http_limit_req_module 和 ngx_http_limit_conn_module,用于限制请求频率和并发数,结合脚本实现 IP 封禁。
  • 基于 Redis数据库的方案:可以通过 Lua 脚本或第三方模块,从 Redis 或 mysql 等存储中动态加载封禁的 IP 列表。

3、使用 fail2ban 动态封禁

fail2ban 是一种常见的动态封禁工具,通过监控日志文件中的恶意行为自动更新 NGINX 配置。下面是通过 fail2ban 实现动态封禁的步骤。

3.1 安装 fail2ban

sudo apt-get update
sudo apt-get install fail2ban

3.2 配置 NGINX 日志

确保 NGINX 配置中的日志能记录恶意请求。以下是一个简单的日志配置:

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    Access_log  /var/log/nginx/access.log  main;
}

3.3 配置 fail2ban 规则

创建 NGINX 的过滤规则,编辑 /etc/fail2ban/filter.d/nginx-http-auth.conf,加入以下规则来匹配日志中的恶意行为:

[Definition]
failrezWkIcxtLYgex = ^<HOST> -.*"(GET|POST).*HTTP/.*".* 403
ignoreregex =

3.4 设置 fail2ban 的 jail 配置

在 /etc/fail2ban/jail.local 文件中,增加对 NGINX 的监控配置:

[nginx-http-auth]
enabled  = true
port     = http,https
filter   = nginx-http-auth
logpath  = /var/log/nginx/access.log
maxretry = 5
  • logpath:指向 NGINX 的日志文件。
  • maxretry:设置多少次失败后封禁 IP。

3.5 启动 fail2ban

sudo service fail2ban restart

这样,当某个 IP 连续访问 5 次 403 页面时,它将被自动封禁。

4、使用 NGINX 的 limit 模块动态限制

NGINX 自带的 ngx_http_limit_req_module 和 ngx_http_limit_conn_module 可以用于动态限制请求。通过设置请求频率和并发连接数,可以有效抵御恶意爬虫和 DDoS 攻击。

4.1 配置请求频率限制

在 NGINX 配置中加入以下代码来限制每个 IP 的请求频率:

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    server {
        location / {
            limit_req zone=one burst=5;
        }
 zWkIcxtLY   }
}
  • limit_req_zone:定义一个共享内存区域,用于记录请求速率。
  • rate=1r/s:每个 IP 限制为每秒最多 1 次请求。

4.2 动态调整限制

要用 Redis 和 Lua 实现动态封禁恶意 IP 的功能,可以借助 Redis 的计数和过期特性。在 Redis 中,可以用 Lua 脚本来动态检测某个 IP 的请求频率,一旦超过设定的阈值,就对该 IP 进行封禁。

以下是一个 Lua 脚本的样例,用于封禁恶意 IP。假设我们会在 Redis 中记录每个 IP 的请求次数,并在达到限制后进行封禁。以下 Lua 脚本实现了上述逻辑,设定了一个限制:IP 在 60 秒内请求 10 次以上会触发封禁,封禁持续 3600 秒(1 小时):

-- Lua 脚本实现动态封禁恶意IP
local ip = KEYS[1]                -- 传入的 IP 地址
local max_requests =python tonumber(ARGV[1]) -- 最大请求次数
local ban_time = tonumber(ARGV[2])     -- 封禁持续时间
local expire_time = tonumber(ARGV[3])  -- IP 计数的过期时间

-- 构建 Redis 键
local ip_key = "ip:" .. ip
local ban_key = "ban:" .. ip

-- 检查 IP 是否已封禁
if redis.call("EXISTS", ban_key) == 1 then
    return {false, "IP 已封禁"}
end

-- 增加 IP 请求计数
local count = redis.call("INCR", ip_key)

-- 如果是首次请求,设置请求计数的过期时间
if count == 1 then
    redis.call("EXPIRE", ip_key, expire_time)
end

-- 检查请求次数是否超过最大请求限制
if count > max_requests then
    -- 达到限制,封禁 IP 并设置封禁时间
    redis.call("SET", ban_key, "1")
    pythonredis.call("EXPIRE", ban_key, ban_time)
    return {false, "已达请求限制,IP 已封禁"}
end

-- 如果请求未超限,返回当前请求计数
return {true, count}

要在 Redis 中执行这个 Lua 脚本,你可以通过 Redis 客户端执行 EVAL 命令。假设 IP 地址是 192.168.0.1,请求限制为 10 次,封禁时间为 3600 秒,计数过期时间为 60 秒:

EVAL "<LUA_SCRIPT>" 2 192.168.0.1 10 3600 60

5、总结

通过以上方法,可以实现 NGINX 下的动态封禁 IP,从而有效保护网站免受恶意攻击。在实际应用中,可以根据需求选择 fail2ban 或 NGINX 自带的模块,甚至结合数据库方案实现更复杂的动态封禁机制。

这篇博客为初学者提供了 NGINX 实现动态封禁 IP 的思路和具体配置示例。你可以根据业务场景灵活调整参数,提升系统安全性。

到此这篇关于Nginx实现动态封禁IP的步骤指南的文章就介绍到这了,更多相关Nginx动态封禁IP内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于Nginx实现动态封禁IP的步骤指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153541

相关文章

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Python实现Microsoft Office自动化的几种方式及对比详解

《Python实现MicrosoftOffice自动化的几种方式及对比详解》办公自动化是指利用现代化设备和技术,代替办公人员的部分手动或重复性业务活动,优质而高效地处理办公事务,实现对信息的高效利用... 目录一、基于COM接口的自动化(pywin32)二、独立文件操作库1. Word处理(python-d

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

使用Python实现网络设备配置备份与恢复

《使用Python实现网络设备配置备份与恢复》网络设备配置备份与恢复在网络安全管理中起着至关重要的作用,本文为大家介绍了如何通过Python实现网络设备配置备份与恢复,需要的可以参考下... 目录一、网络设备配置备份与恢复的概念与重要性二、网络设备配置备份与恢复的分类三、python网络设备配置备份与恢复实

Java 中实现异步的多种方式

《Java中实现异步的多种方式》文章介绍了Java中实现异步处理的几种常见方式,每种方式都有其特点和适用场景,通过选择合适的异步处理方式,可以提高程序的性能和可维护性,感兴趣的朋友一起看看吧... 目录1. 线程池(ExecutorService)2. CompletableFuture3. ForkJoi

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个