返回顶部
分享到

Nginx实现动态封禁IP的步骤

nginx 来源:互联网 作者:佚名 发布时间:2025-02-25 22:25:36 人浏览
摘要

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

在日常的生产环境中,网站可能会遭遇恶意请求、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

1

2

sudo apt-get update

sudo apt-get install fail2ban

3.2 配置 NGINX 日志

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

1

2

3

4

5

6

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,加入以下规则来匹配日志中的恶意行为:

1

2

3

[Definition]

failregex = ^<HOST> -.*"(GET|POST).*HTTP/.*".* 403

ignoreregex =

3.4 设置 fail2ban 的 jail 配置

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

1

2

3

4

5

6

[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

1

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 的请求频率:

1

2

3

4

5

6

7

8

9

http {

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

 

    server {

        location / {

            limit_req zone=one burst=5;

        }

    }

}

  • 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 小时):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

-- Lua 脚本实现动态封禁恶意IP

local ip = KEYS[1]                -- 传入的 IP 地址

local max_requests = 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")

    redis.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 秒:

1

EVAL "<LUA_SCRIPT>" 2 192.168.0.1 10 3600 60

5、总结

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

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


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • Nginx搭建自己的CDN服务器的方法
    nginx安装 1 2 sudo apt update sudo apt install nginx nginx配置文件 /etc/nginx/nginx.conf或/etc/nginx/sites-available/default 设置缓存 在Nginx配置中启用缓存,这样
  • Nginx实现动态封禁IP的步骤
    在日常的生产环境中,网站可能会遭遇恶意请求、DDoS 攻击或其他有害的访问行为。为了应对这些情况,动态封禁 IP 是一项十分重要的安全
  • Nginx HTTP Status 400 –错误的请求问题解决

    Nginx HTTP Status 400 –错误的请求问题解决
    第一:实验故障 今天小编在搭建完Nginx反向代理两个Tomcat站点,实现负载均衡的实验,访问网页内容时,提示如下报错: HTTP Status 400 错误的
  • nginx反向代理java项目方式
    nginx反向代理java项目 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 server { listen 80; server_name ***.***.com; location / { proxy_pass http://127.0.0.1:8686; } #一键申请SSL证
  • 使用Nginx解决前端跨域问题
    1. 理解 CORS 和同源策略 1.1 同源策略 同源策略是一种浏览器安全机制,用于阻止不同源(不同域名、协议或端口)的 Web 应用相互访问数据。
  • Nginx如何集成到Windows服务

    Nginx如何集成到Windows服务
    Nginx集成到Windows服务 nginx版本:nginx-1.20.2; windows版本:win11,将nginx解压,要保证nginx的目录不含空格 下载winsw 下载地址为: 官方地址:
  • Nginx FastCGI缓存的实现
    随着 Web 应用的发展和流量的不断增长,如何提高应用性能、减少服务器负载成为开发者和系统管理员关注的重点。FastCGI 缓存作为一种常用
  • Nginx实现TCP和UDP代理的方法
    Nginx是一个高性能的HTTP和反向代理服务器,同时也支持TCP/UDP代理。在1.9.13版本后,Nginx已经支持端口转发,包括TCP和UDP协议。Nginx的TCP/UDP代
  • Nginx搭建Webdav服务的方法
    一、 自签名根证书 1. 生成根证书密钥 1 openssl genrsa -out ./root.key 2048 2. 生成根证书 1 2 3 4 5 6 7 8 9 10 openssl req -x509 -new -key ./root.key -out ./root.p
  • 当Nginx所在服务器的磁盘空间满时的影响以及如何
    大家好,我是G探险者! 最近遇到一个问题是,nginx所在服务器磁盘满了,导致前端页面上的一个文件上传功能不好使了,搞得我排查半天,
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计