Fail2ban通过分析Nginx日志识别异常行为(如高频404、暴力登录)并调用防火墙封禁IP,配合Nginx前置过滤(UA屏蔽、请求头校验)实现事前事后双重防护。

Fail2ban 不是直接拦截请求的防火墙,而是通过分析 Nginx 日志中的异常行为,自动调用系统防火墙封禁恶意 IP。它和 Nginx 配合,构成“日志识别 + 实时封禁”的闭环防御,特别适合对抗低频持续扫描、暴力破解、简单爬虫等场景。
识别并封禁高频 404 扫描行为
攻击者常通过遍历路径(如 /wp-admin、/phpmyadmin、/backup.zip)探测漏洞,这类行为会在 access.log 中留下大量 404 记录。Fail2ban 可据此精准识别:
- 新建过滤规则文件:/etc/fail2ban/filter.d/nginx-404.conf,内容为:
[Definition]
failregex = ^<HOST> -.*"(GET|HEAD|POST).*HTTP/1\.[01]" 404 - 在 /etc/fail2ban/jail.local 中启用对应 jail:
[nginx-404]
enabled = true
filter = nginx-404
logpath = /var/log/nginx/access.log
maxretry = 30
findtime = 600
bantime = 86400 - maxretry=30 表示 10 分钟内出现 30 次 404 即触发;对真实用户几乎无感,但能有效拦住目录爆破脚本
拦截暴力登录与接口滥用
针对 WordPress、后台登录页、API 接口等易被爆破的目标,可基于返回状态码(如 401、403)或特定 URL 路径建模:
- 例如防护 /login 或 /api/v1/auth,新建 nginx-brute.conf:
failregex = ^<HOST> -.*"(POST).*\/(login|auth|wp-login\.php).*HTTP/1\.[01]" (401|403) - 配置 jail 时建议更严格:
maxretry = 5
findtime = 300
bantime = 3600 - 务必在 ignoreip 中加入你自己的管理 IP 和主流搜索引擎 UA 对应的可信网段(如 Googlebot 的 ASN),避免误封
结合 Nginx 基础层做前置过滤
Fail2ban 是“事后响应”,Nginx 则可做“事前拦截”。两者叠加效果更稳:
- 在 Nginx 配置中屏蔽已知恶意 UA:
if ($http_user_agent ~* "(python-requests|Scrapy|Go-http-client|curl|wget)") { return 444; } - 校验基础请求头完整性,拒绝缺失 Accept 或 Accept-Language 的请求:
if ($http_accept = "") { return 403; } - 这些规则让低质量爬虫连日志都不会留下,减轻 Fail2ban 负担,也减少误判可能
验证与日常维护要点
配置完成后别跳过验证环节:
- 用 sudo fail2ban-client status nginx-404 查看 jail 状态和当前封禁数
- 手动模拟扫描:curl -I http://your-site.com/xxx.php 多次,观察是否进黑名单
- 检查 /var/log/fail2ban.log 是否有匹配失败或权限错误提示
- 确认 logrotate 未切断日志流——Fail2ban 默认依赖 inotify 监控,轮转后需配置 create 或启用 systemd-journald 后端


















