LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

Nginx 动态封禁 IP 实战指南

admin
2025年11月2日 0:33 本文热度 42

Nginx 动态封禁 IP 实战指南

在 Nginx 中实现动态封禁 IP,可以有效保护网站或应用免受恶意请求、爬虫或 DDoS 攻击。相比于传统的修改配置文件 + 重载 Nginx 的静态方式,动态封禁能够自动识别、实时阻断恶意 IP,大大提升安全性和运维效率。

本文将从三种主流方案展开,结合实战配置与应用场景,帮助你快速落地。


 动态封禁 IP 的常用方案

方案类型

实现方式

优点

缺点

适用场景

Fail2ban 工具

监控 Nginx 日志,达到阈值后调用防火墙或修改配置封禁

配置简单,社区成熟,支持多种服务

依赖日志分析,有延迟,频繁重载影响性能

防暴力破解、扫描器、异常请求攻击

Nginx Lua + Redis

使用 ngx_lua 在访问阶段查询 Redis 黑名单

性能高,实时生效,可分布式共享

需要 OpenResty/Lua,架构复杂

高并发场景,分布式共享黑名单,精细化策略

Nginx 内置模块

limit_req_zone 和 limit_conn_zone 限制请求频率和并发

原生支持,无需第三方依赖

仅限流/限连接,不能真正封禁

防 CC 攻击、防止单 IP 滥用


️ 各方案配置要点

1. 使用 Fail2ban 动态封禁

Fail2ban 通过监控 Nginx 日志(如 403/401/404 错误码、访问过于频繁的 IP),动态调用 iptables 或 firewalld 进行封禁。

核心步骤:

  1. 安装 Fail2ban

sudo apt-get install fail2ban    # Debian/Ubuntusudo yum install fail2ban        # CentOS/RHEL

  1. 配置 Nginx 日志

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;

  1. 创建过滤规则 /etc/fail2ban/filter.d/nginx-cc.conf

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

  1. 配置 Jail /etc/fail2ban/jail.local

[nginx-cc]enabled = trueport = http,httpsfilter = nginx-cclogpath = /var/log/nginx/access.logmaxretry = 100findtime = 60bantime = 3600action = iptables[name=NGINX, port=http, protocol=tcp]

  1. 启动服务

sudo systemctl enable fail2bansudo systemctl restart fail2ban


2. 使用 Nginx Lua + Redis 动态封禁

此方案依赖 OpenResty(集成了 Nginx + LuaJIT),在请求到达时即时查询 Redis 黑名单,效率极高。

核心步骤:

  1. 安装 OpenResty

sudo yum install yum-utilssudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.reposudo yum install openresty

  1. 配置 Nginx

http {    lua_shared_dict ip_blacklist 10m;    server {        listen 80;        location / {            access_by_lua_file /etc/nginx/lua/ip_blacklist.lua;        }    }}

  1. 编写 Lua 脚本 /etc/nginx/lua/ip_blacklist.lua

local redis = require "resty.redis"local red = redis:new()red:set_timeout(1000)local ok, err = red:connect("127.0.0.1", 6379)if not ok then    ngx.log(ngx.ERR, "Redis connection failed: ", err)    returnend
local client_ip = ngx.var.remote_addrlocal is_banned = red:sismember("ip_blacklist", client_ip)if is_banned == 1 then    ngx.exit(ngx.HTTP_FORBIDDEN)end
red:set_keepalive(10000100)

  1. 管理黑名单

redis-cli SADD ip_blacklist 192.168.1.100   # 封禁redis-cli SREM ip_blacklist 192.168.1.100   # 解封


3. 使用 Nginx 内置模块限流

Nginx 自带 limit_req_zone 和 limit_conn_zone,可限制请求速率与连接数。虽不能真正封禁,但能有效缓解 CC 攻击。

配置示例

http {    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
    server {        location / {            limit_req zone=req_limit burst=20 nodelay;            limit_conn conn_limit 10;        }    }}

效果:超限请求返回 503 Service Temporarily Unavailable


 实战经验与注意事项

  1. 确保获取真实 IP

    在有 CDN/代理的情况下,记得配置:

set_real_ip_from  0.0.0.0/0;real_ip_header    X-Forwarded-For;real_ip_recursive on;

  1. 组合拳效果更佳
  • Fail2ban → 封禁恶意行为 IP。
  • Nginx 内置限流 → 防瞬时高频攻击。
  • Lua + Redis → 分布式实时黑名单。
  1. 封禁策略要分层
  • 瞬时保护:limit_req/limit_conn。
  • 短期封禁:Fail2ban(分钟 ~ 小时)。
  • 长期全局封禁:Lua + Redis(天级甚至永久)。

 总结

在 Nginx 中实现动态封禁 IP,主要有三种方式:

  • Fail2ban:日志驱动,适合单机和简单场景;
  • Nginx Lua + Redis:高性能实时黑名单,适合分布式和大规模业务;
  • Nginx 内置模块:原生限流/限连,适合应对 CC 攻击。

推荐实战落地:

  • 单机 → Fail2ban + 内置限流
  • 分布式/高并发 → Lua + Redis + 内置限流

这样既能快速见效,又能兼顾长期扩展性。


阅读原文:原文链接


该文章在 2025/11/10 14:56:07 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved