Fail2Ban 针对 HTTP 错误日志自动封禁扫描 IP 的核心在于精准识别错误行为、还原真实客户端 IP、配置可落地的封禁动作,需日志、规则、防火墙三者严丝合缝配合;必须启用 real_ip 模块还原真实 IP,日志含 $remote_addr 和 status,编写专用 filter 匹配 404 等扫描特征,配置 jail 设定 maxretry/findtime/bantime,并用 fail2ban-client 验证生效。

Fail2Ban 针对 HTTP 错误日志自动封禁扫描 IP,核心在于精准识别错误行为、还原真实客户端 IP、配置可落地的封禁动作。它不是装完就生效的“黑盒”,而是需要日志、规则、防火墙三者严丝合缝配合的闭环系统。
确保 Nginx 日志含真实 IP 和关键状态码
若服务器前有 CDN 或反向代理(如 Cloudflare、Nginx 自身做负载),$remote_addr 默认是上游地址,无法定位真实攻击者。必须启用 real_ip 模块还原:
- 在
nginx.conf的http块中添加可信代理网段(例如你自己的负载均衡器或 CDN 回源段):set_real_ip_from 10.10.0.0/16;(按实际调整) - 指定真实 IP 来源头:
real_ip_header X-Forwarded-For; - 日志格式中必须使用已还原的
$remote_addr,并包含状态码:log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent ...';
验证方式:访问一个不存在路径(如 /xxx),检查 /var/log/nginx/access.log 是否记录的是你的真实公网 IP,且状态码为 404。
编写专用过滤器匹配扫描特征
扫描行为常表现为大量 404(目录遍历)、403(试探敏感路径)或高频 401(爆破登录)。以拦截高频 404 为例:
- 新建过滤器文件:
/etc/fail2ban/filter.d/nginx-404.conf - 内容如下(严格匹配,避免误伤):
[Definition]<br>failregex = ^<HOST> -.*"(GET|HEAD|POST) .+ HTTP/1\.[01]" 404 .+$<br>ignoreregex = ^<HOST> -.*"(GET|HEAD) /health|/ping HTTP/.*" 404 .+$
<host></host> 是 Fail2Ban 内置变量,自动提取 IP;ignoreregex 可排除健康检查等合法 404 请求,防止误封。
配置 jail 规则并绑定防火墙动作
在 /etc/fail2ban/jail.local 中新增段落:
[nginx-404]<br>enabled = true<br>filter = nginx-404<br>logpath = /var/log/nginx/access.log<br>maxretry = 15<br>findtime = 300<br>bantime = 1800<br>action = iptables-multiport[name=nginx-404, port="http,https", protocol=tcp]
-
maxretry = 15+findtime = 300表示:5 分钟内出现 15 条匹配 404 的日志即触发封禁 -
action明确限定只封 HTTP/HTTPS 端口,不影响 SSH、数据库等其他服务
注意:云服务器(如阿里云 ECS、AWS EC2)若未启用本地 iptables/nftables,该 action 无效——需改用支持安全组 API 的自定义 action,或依赖平台级防护。
验证与日常校准
配置后必须验证是否真正生效:
- 重启服务:
sudo systemctl restart fail2ban - 查看 jail 状态:
sudo fail2ban-client status nginx-404(应显示Number of jail matches和当前封禁数) - 手动模拟扫描:
for i in {1..20}; do curl -sI "http://your-domain.com/$(uuidgen)" >/dev/null; done,再查状态确认 IP 是否被 ban - 检查防火墙规则:
sudo iptables -L INPUT -n | grep f2b-nginx-404
长期运行中需定期翻看 /var/log/fail2ban.log,关注 Found 和 ban 记录是否合理,根据实际攻击强度微调 maxretry 和 findtime,避免过严(误封)或过松(漏防)。

















