核心是通过分析nginx error.log中“open() ... failed (2: no such file or directory)”模式识别全路径暴力扫描,再结合fail2ban实时封禁ip及nginx层location规则(如禁止/.git、/wp-admin等路径和.zip/.env等文件)进行主动拦截,辅以日志隔离与敏感文件清理实现纵深防御。

识别并防御针对 Nginx 虚拟主机的全路径暴力扫描,核心在于“从错误日志里抓异常行为,用规则及时拦住它”。这类攻击不走常规页面,而是直接拼接大量可疑路径(如 /.git/config、/wp-admin/install.php、/backup.zip),试图暴露敏感文件或探测 CMS 漏洞。它们往往绕过正常访问逻辑,但会在 Nginx 的 error.log 中留下清晰痕迹——反复出现的 open() ... failed (2: No such file or directory)。
盯紧 error.log 里的“找不到文件”模式
全路径扫描的本质是高频试探,Nginx 在找不到对应文件时会记录 error 日志,格式类似:
2026/05/07 14:22:31 [error] 12345#0: *6789 open() "/www/site/public/.env" failed (2: No such file or directory), client: 192.168.32.11, server: example.com, request: "GET /.env HTTP/1.1"这类日志比 access.log 更可靠,因为即使请求没触发 404 页面(比如被 rewrite 或内部重定向干扰),只要文件系统找不到路径,就会稳稳记在这里。重点关注三个字段:
- client:来源 IP,用于后续封禁
-
server:虚拟主机名(如
example.com),确认是否针对你的某个站点 -
request 中的路径:是否含常见敏感路径关键词(
.git、.env、phpmyadmin、backup、wp-、admin等)
用 fail2ban 实时监控并自动拉黑
宝塔面板中已集成 fail2ban 插件,只需配置一个专用于 error.log 的 jail,就能把扫描 IP 自动加入 iptables 黑名单。操作要点:
- 在 fail2ban 设置里新增 jail,日志路径指向
/www/wwwlogs/example.com.error.log(注意是 error.log,不是 access.log) - 定义正则过滤器(filter),匹配:
open\(\) ".*?(\.git|\.env|\.htaccess|phpmyadmin|wp-admin|backup|install)\b.*?failed \(2: No such file or directory\) - 设置触发阈值,例如:3 分钟内命中 5 次即封禁 1 小时(避免误伤爬虫,又足够压制扫描节奏)
- 确保该 jail 的
enabled = true并重启服务
在 Nginx 配置层提前拦截高危路径
fail2ban 是事后响应,而 Nginx 本身可做第一道防线,在请求到达后端前就拒绝。在对应虚拟主机的 server 块中添加 location 规则:
- 禁止访问所有以点开头的隐藏文件:
location ~ /\. { return 444; } - 屏蔽常见扫描目标目录:
location ~ ^/(phpmyadmin|wp-admin|adminer|install|backup|database|\.git|\.svn|\.env) { return 444; } - 限制文件类型下载:
location ~ \.(zip|rar|sql|tar|7z|bak|old)$ { return 444; }
使用 return 444 是关键——它直接断开连接,不返回任何响应,既节省资源,也让扫描器难以判断服务是否存在。
辅助加固:减少日志噪音与暴露面
降低扫描成功率,也等于提升防御效率:
- 关闭 Nginx 的
autoindex on,防止目录列表泄露(尤其测试环境容易误开) - 检查网站根目录下是否残留
.git、.env、config.php.bak等敏感文件,有则立即删除或移出 Web 可访问范围 - 为每个虚拟主机单独配置
error_log路径,便于 fail2ban 精准监听,避免多个站点日志混杂干扰判断 - 定期用
grep -E '\.git|\.env|phpmyadmin' /www/wwwlogs/*.error.log | head -20快速抽检,验证防护是否生效











