Fail2ban可通过分析Nginx访问日志识别高频失败请求并自动封禁恶意IP。需确认日志格式含真实客户端IP与状态码,编写自定义过滤器匹配登录爆破路径及401/403响应,配置jail参数后重启服务即可生效。

Fail2ban 能通过分析 Nginx 访问日志,识别高频失败请求(如 401、403、404 或特定路径爆破行为),自动将恶意 IP 加入 iptables 或 nftables 黑名单,实现对 SSH、Web 登录、后台接口等暴力破解的实时防御。
确认 Nginx 日志格式并启用详细记录
Fail2ban 依赖日志中的客户端 IP、时间戳和响应状态码。默认 main 日志格式通常已满足要求,但建议显式定义并确保记录真实客户端 IP(尤其在有 CDN 或反向代理时):
- 在
nginx.conf的http块中确认或添加:
若使用 CDN(如 Cloudflare),需用 $http_x_forwarded_for 替换 $remote_addr,并配合 set_real_ip_from 和 real_ip_header 正确提取源 IP。
编写自定义 Fail2ban 过滤器匹配爆破行为
Fail2ban 默认 filter 对 Nginx 支持有限,需创建针对性规则。例如拦截针对 /wp-login.php 或 /admin/login 的密码爆破:
- 新建过滤器文件:
/etc/fail2ban/filter.d/nginx-bf.conf - 内容示例(匹配 5 分钟内对登录路径返回 401/403 超过 6 次的 IP):
failregex = ^
ignoreregex =
注意:<host></host> 自动匹配 IP;正则需与实际日志字段顺序一致;避免过度宽松(如不加路径限定易误封)。
配置 jail 并启用防护
在 /etc/fail2ban/jail.local 中添加:
enabled = true
filter = nginx-bf
logpath = /var/log/nginx/access.log
maxretry = 6
findtime = 300
bantime = 3600
action = %(action_)s
-
maxretry和findtime共同决定触发阈值(如 5 分钟 6 次) -
bantime单位为秒(3600 = 1 小时),设为 -1 表示永久封禁 - 确保
logpath指向正确的 Nginx 访问日志路径,支持通配符如/var/log/nginx/*access.log
重启服务:systemctl restart fail2ban,再用 fail2ban-client status nginx-bf 查看是否生效。
验证与日常维护要点
测试是否正常工作:用 curl 或脚本模拟多次失败登录,观察日志是否被匹配、IP 是否进入黑名单。
- 查看匹配日志:
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-bf.conf - 检查封禁状态:
iptables -L INPUT -n | grep f2b-(iptables 后端)或fail2ban-client status nginx-bf - 避免误伤:排除健康检查 IP(如监控探针)、内网地址,可在 jail 中加
ignoreip = 127.0.0.1/8 192.168.0.0/16 - 日志轮转需兼容:确保 logrotate 不中断 Fail2ban 读取,推荐使用
copytruncate或配置logrotate后 reload fail2ban
不复杂但容易忽略细节,关键在日志可解析、正则精准、网络环境适配。

















