Fail2Ban 不直接统计请求频率,而是通过监控 Nginx 限流日志(如 limiting requests, excess:...)或访问日志中高频成功响应(如 /api/v1/user/profile 的 200 状态)来触发封禁,实现对 API 超限调用的兜底防护。

Fail2Ban 本身不直接统计请求频率,而是基于日志中可识别的失败或异常行为模式触发封禁。要防止 API 超限调用,关键不是让 Fail2Ban 去“数请求”,而是让它监控 Nginx(或其他反向代理/应用层)记录下来的超限痕迹——比如限流响应、大包拒绝、高频错误等。这才是它真正擅长的场景。
需先由 Nginx 实现限流,Fail2Ban 再做兜底防护
Nginx 的 limit_req 模块是控制 API 请求频率的第一道防线。Fail2Ban 不替代它,而是监听 Nginx 在执行限流后写入日志的明确信号,比如返回 503 Service Temporarily Unavailable 或记录 limiting requests, excess: X by zone "api"。只有当日志里留下可匹配的线索,Fail2Ban 才能介入。
例如,在 http 块中配置:
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
server {
location /api/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://backend;
}
}当某 IP 每秒超过 10 次请求,Nginx 就会开始返回 503,并在 error.log 中写入类似:
2026/06/13 19:22:45 [error] 12345#0: *6789 limiting requests, excess: 12.345 by zone "api", client: 203.0.113.45
创建专用过滤器匹配限流日志
新建 /etc/fail2ban/filter.d/nginx-api-rate-limit.conf:
[Definition]
failregex = limiting requests, excess:.*by zone "api".*client: <HOST>
^.*\[error\].*limiting requests.*client: <HOST>
ignoreregex =这条规则会精准捕获被 Nginx 主动限流的客户端 IP。
配置 Jail 触发封禁
在 /etc/fail2ban/jail.d/nginx-api.conf 中添加:
[nginx-api-rate-limit] enabled = true filter = nginx-api-rate-limit logpath = /var/log/nginx/error.log maxretry = 3 findtime = 60 bantime = 1800 action = iptables[name=nginx-api, port=http,http,https,ssl,80,443,8080]
含义是:60 秒内出现 3 次限流记录,就封禁该 IP 30 分钟。时间窗口和次数可根据业务容忍度调整——比如对高敏感接口可设为 maxretry = 1 + findtime = 300。
补充:也可监控访问日志中的高频成功请求
如果某些攻击绕过限流(如故意压低速率但持续调用),可配合 Nginx 访问日志分析。需确保 access.log 包含 $status 和 $request_uri,然后定义过滤器匹配特定接口的高频 200 响应:
# /etc/fail2ban/filter.d/nginx-api-flood.conf [Definition] failregex = ^<HOST> -.*"GET /api/v1/user/profile HTTP/.*" 200 ignoreregex =
再配一个 jail,把 logpath 指向 /var/log/nginx/access.log,并调高 maxretry(如 50 次/60 秒)。注意:这种方式开销略大,适合重点接口,不宜全站开启。
Fail2Ban 对 API 频率防护的本质,是把 Nginx 的限流动作“日志化”并“自动化响应”。它不追求实时毫秒级拦截,而是在攻击已暴露特征后,快速切断其后续尝试。


















