Fail2Ban 不直接限流,而是通过分析 Nginx 日志自动封禁恶意 IP;实际“自动限流”是 Nginx 原生限流(如每分钟30次)与 Fail2Ban 封禁(如1分钟10次503即封1小时)协同实现。

Fail2Ban 本身不直接“限流”,它做的是自动封禁 IP——通过分析 Nginx 日志识别异常行为(如高频请求、爆破、扫描),达到阈值后调用防火墙规则(如 iptables)临时拉黑该 IP。所谓“自动限流”在实际部署中,是Nginx 原生限流 + Fail2Ban 封禁恶意源头的组合策略。下面分三块讲清楚怎么做:
一、先用 Nginx 做基础限流(实时生效)
这是第一道防线,在请求到达应用前就压制流量洪峰:
- 在
http{}块中定义限流区域:limit_req_zone $binary_remote_addr zone=cc_limit:10m rate=30r/m;
(每 IP 每分钟最多 30 次请求,内存区 10MB) - 在需要保护的位置(如
location /或location /api/)启用:limit_req zone=cc_limit burst=60 nodelay;
(允许最多 60 个突发请求,超限立即返回 503) - 若需放行白名单(如运维 IP),配合
geo+map实现动态跳过限流
二、用 Fail2Ban 监控 access.log 封禁高频攻击者
当 Nginx 限流触发大量 503 或攻击者绕过限流反复试探时,Fail2Ban 从日志中揪出真实恶意 IP 并封禁:
- 新建过滤器
/etc/fail2ban/filter.d/nginx-cc.conf:[Definition]<br>failregex = ^<HOST> -.*"(GET|POST).*" 503 .*$<br>ignoreregex =
(匹配返回 503 的请求,说明已被 Nginx 限流拒绝) - 在
/etc/fail2ban/jail.local或独立 jail 文件中添加:[nginx-cc]<br>enabled = true<br>filter = nginx-cc<br>logpath = /var/log/nginx/access.log<br>maxretry = 10<br>findtime = 60<br>bantime = 3600<br>action = iptables-multiport[name=NGINX_CC, port="http,https"]
(1 分钟内出现 10 次 503 即封 1 小时)
三、进阶:监控 error.log 补充防御盲区
Nginx 的 error.log 记录更底层的异常,适合捕获限流未覆盖的行为:
- 匹配典型攻击痕迹:
•limiting requests, excess:.*by zone(CC 攻击已触发限流)
•upstream timed out(扫描探测后端)
•client intended to send too large body(大包上传攻击) - 对应过滤器可命名为
nginx-error-cc.conf,jail 中指定logpath = /var/log/nginx/error.log,maxretry = 5、findtime = 60更激进些(因 error 级别更高)
整个流程是:Nginx 先限流 → 高频者被压出 503 或写入 error.log → Fail2Ban 捕获日志 → 封禁其 IP。两者协同,既保服务可用,又断攻击源头。


















