Fail2ban可自动分析Nginx日志识别爆破等异常行为并调用iptables实时封禁IP;需配置real_ip模块还原真实客户端IP,定义过滤器匹配401等攻击特征,通过jail规则设定触发阈值与封禁动作,并支持白名单防误封。

Fail2ban 能自动扫描 Nginx 访问日志或错误日志,识别出高频异常行为(如爆破登录、大量 404/401 请求),并调用系统防火墙(iptables 或 nftables)实时封禁对应 IP,整个过程无需人工干预,也不依赖 Nginx reload。
确保 Nginx 日志格式支持精准识别
Fail2ban 依赖日志中的真实客户端 IP 和状态码。若使用 CDN 或反向代理,$remote_addr 可能是上游地址,需改用 $http_x_forwarded_for 并配合 real_ip 模块还原真实 IP:
- 在 nginx.conf 的 http 块中添加:set_real_ip_from 10.0.0.0/8;(根据实际可信代理网段调整)
- 启用 real_ip_header X-Forwarded-For;
- 日志格式中必须包含 $remote_addr(已还原)和 $status,例如:log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent';
编写专用的 Fail2ban 过滤器
过滤器定义了“什么算攻击”。以拦截 /login 接口的暴力破解为例(返回 401):
- 新建文件 /etc/fail2ban/filter.d/nginx-login.conf
- 内容示例:
[Definition]
failregex = ^<HOST> - .+ "POST /login HTTP/.*" 401 .+
ignoreregex = - <HOST> 是 Fail2ban 内置占位符,自动匹配 IP;正则需严格避免误匹配正常请求(如含 401 的健康检查)
配置 jail 规则并启用监控
在 /etc/fail2ban/jail.local 中新增规则段:
- [nginx-login]
enabled = true
filter = nginx-login
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 60
bantime = 3600
action = iptables-multiport[name=nginx-login, port="http,https", protocol=tcp] - maxretry 和 findtime 共同决定触发阈值(如 1 分钟内失败 5 次)
- action 指定使用 iptables 封禁,端口限定为 HTTP/HTTPS,避免影响 SSH 等其他服务
验证与日常维护
配置完成后需重启服务并确认生效:
- 执行 sudo systemctl restart fail2ban
- 查看状态:sudo fail2ban-client status nginx-login(显示当前封禁数及 IP 列表)
- 手动测试:用 curl 多次触发 401,观察是否出现在 banned 列表中
- 白名单设置:在 jail.local 的 [DEFAULT] 段添加 ignoreip = 127.0.0.1/8 192.168.1.0/24,防止误封运维地址


















