Fail2Ban 默认不防Web扫描,需手动配置监控Nginx/Apache访问日志、定义敏感路径扫描规则(如/phpmyadmin、/.git等)、设置maxretry=3/findtime=60,并确保后端防火墙(nftables/firewalld)联动生效,同时添加ignoreip白名单防误封。

Fail2Ban 本身不防 Web 扫描,必须明确配置它去读 Nginx 或 Apache 的访问日志,并定义“什么请求算非法扫描”,否则它只会守 SSH 和 FTP。
关键:让 Fail2Ban 看到 Web 日志
默认安装后,Fail2Ban 只监控 /var/log/auth.log(或 /var/log/secure),完全忽略网站日志。要防扫描,必须指定真实日志路径:
- Nginx 默认访问日志路径通常是
/www/wwwlogs/access.log(宝塔)或/var/log/nginx/access.log(标准安装) - Apache 常用路径是
/var/log/apache2/access.log或/var/log/httpd/access_log - 确认你的日志里包含
$remote_addr字段——这是 Fail2Ban 提取 IP 的唯一依据
写一条真正管用的扫描识别规则
不能只封“404 多的 IP”,正常用户也会点错链接。重点是封“高频扫敏感路径”的行为:
- 创建自定义 filter:
/etc/fail2ban/filter.d/nginx-scan.conf - 内容示例(匹配常见后台和泄露路径):
failregex = ^<HOST> -.*"(GET|HEAD).*(/phpmyadmin|/wp-admin|/administrator|/\.git|/\.env|/backup\.zip|/docker-compose\.yml|/\.aws/credentials).*HTTP.*$ - 在
jail.local中启用该规则,设置maxretry = 3、findtime = 60,1 分钟内扫 3 个高危路径就封
联动防火墙,确保封禁生效
Fail2Ban 封 IP 是靠调用系统防火墙实现的,不是改 Nginx 配置:
- 检查 Fail2Ban 后端是否匹配你当前的防火墙:
sudo fail2ban-client status查看 “firewallcmd” 或 “nftables” 是否活跃 - 若用 firewalld,需确保
backend = firewallcmd-nft(推荐)或firewallcmd在fail2ban.conf中正确设置 - 验证是否真封了:
sudo iptables -L -n | grep 'f2b-'或sudo nft list chain inet filter f2b-
防误封与增强防护
Web 流量复杂,白名单和日志质量直接影响效果:
- 在
[DEFAULT]区块加ignoreip = 127.0.0.1/8 192.168.0.0/16,避免本地或内网被误伤 - 若使用 Cloudflare,把 Cloudflare IP 段加入
ignoreip,否则所有流量都显示为 CF 中转 IP,封错源头 - 启用内置
nginx-badbots规则可拦截已知扫描器 UA,配合路径规则形成双层识别

















