Fail2ban日志过滤优化,减少误封正常访客IP
Fail2ban 默认规则比较激进,很多站长发现正常访客、CDN 回源 IP 甚至搜索引擎爬虫被误封。
本文从日志过滤规则和白名单两个方向入手,帮你把误封率降下来,同时保留对暴力破解的拦截能力。
先确认是不是真的误封
在改配置之前,先确认封禁来源。
执行 fail2ban-client status 查看当前启用的 jail,再执行 fail2ban-client status nginx-http-auth(jail 名称以实际为准)查看被封 IP 列表。
如果被封 IP 属于 CDN 节点段、公司出口 IP 或搜索引擎官方 IP,基本可以判定为误封。
另一个判断依据是查看 /var/log/fail2ban.log,搜索 Ban 关键字,观察被封 IP 对应的日志行。
如果触发原因是 GET /favicon.ico、GET /robots.txt 等正常请求,说明过滤规则过于宽泛。
调整过滤规则,减少误匹配
Fail2ban 的过滤规则存放在 /etc/fail2ban/filter.d/ 目录下。
以 Nginx 为例,常用文件是 nginx-http-auth.conf 和 nginx-botsearch.conf。
打开对应 filter 文件,找到 failregex 部分。
默认规则可能匹配了所有 401 或 404 请求,建议缩小匹配范围。
例如,只匹配登录失败而非普通 404:
[Definition]
failregex = ^ -.*"(GET|POST) /wp-login\.php.*" 401
^ -.*"(GET|POST) /admin/.*" 403
修改后执行 fail2ban-client reload 重新加载。注意:每次修改 filter 文件后都要 reload,否则规则不生效。
配置 ignoreip 白名单
最直接减少误封的方法是把可信 IP 加入白名单。
编辑 /etc/fail2ban/jail.local,在 [DEFAULT] 段落下添加:
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 203.0.113.0/24
把 203.0.113.0/24 替换成你的 CDN 回源 IP 段或公司固定 IP。
如果使用 Cloudflare,可以从官方文档获取最新 IP 段,不要直接复制过时列表。
保存后执行 fail2ban-client reload,再用 fail2ban-client get nginx-http-auth ignoreip 确认白名单已生效。
用测试命令验证过滤规则
改完规则后不要直接等线上反馈,先用 fail2ban-regex 测试。
命令格式:
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-http-auth.conf
输出会显示匹配行数和示例。
如果匹配行数突然减少,说明规则收窄有效;
如果仍然匹配大量正常请求,继续调整 failregex。
常见避坑点
- 不要直接删除 fail2ban 规则:全部放行等于放弃防护,正确做法是收窄匹配条件。
- IP 段不要写错:
203.0.113.0/24表示一个 C 段,写错会导致白名单失效。 - reload 不是 restart:
reload只重载配置,restart会中断所有 jail,优先用 reload。 - 日志路径要匹配:Nginx 日志可能在
/var/log/nginx/或宝塔的/www/wwwlogs/,路径不对会导致规则完全不匹配。
效果验证与日常维护
执行 fail2ban-client status nginx-http-auth 查看当前封禁数量。
如果正常访客不再出现在 Ban 列表,且暴力破解尝试仍被拦截,说明优化到位。
建议每周检查一次 /var/log/fail2ban.log 中的 Ban 记录,发现新误封及时补充 ignoreip。
关键结论:减少误封的核心是收窄 failregex 匹配范围,而不是关闭 fail2ban;
ignoreip 白名单要覆盖 CDN 回源段和固定办公 IP;
每次改动后必须用 fail2ban-regex 验证匹配结果。