防范nginx暴力扫描的核心是让攻击者无利可图、高成本、易被发现;需结合error.log分析、fail2ban自动封禁、nginx配置层拦截及策略性反制形成闭环防御。

防范 Nginx 服务免受自动化脚本暴力扫描,关键不是“堵死所有可能”,而是“让扫描无利可图、高成本、易被发现”。攻击者用工具(如 zgrab、nmap、sqlmap、fofa 爬虫)批量扫 IP 和路径,目标是找备份文件、管理后台、未授权接口、漏洞入口。Nginx 层能做的,是第一时间识别异常行为、拦截高频试探、隐藏暴露面,并联动日志与封禁机制形成闭环。
盯紧 error.log,从“找不到文件”里揪出扫描器
全路径暴力扫描最稳的痕迹不在 access.log,而在 error.log。只要 Nginx 尝试打开一个根本不存在的路径(比如 /.env、/wp-admin/install.php),就会记下:[error] ... open() "/www/site/public/.env" failed (2: No such file or directory), client: 192.168.32.11, request: "GET /.env HTTP/1.1"
这类日志不受 rewrite 或重定向干扰,真实可靠。重点关注:
• client 字段——提取来源 IP,用于后续封禁
• request 中的路径——是否含 .git、.env、phpmyadmin、backup、install、admin 等敏感关键词
• server 字段——确认是否针对你的某个虚拟主机(避免误判其他站点流量)
用 fail2ban 实时封禁高频试探 IP
靠人工查日志太慢,必须自动化。fail2ban 是成熟方案,宝塔面板已集成,只需配置专用于 error.log 的 jail:
• 日志路径设为 /www/wwwlogs/your-domain.com.error.log(注意是 error.log)
• filter 正则匹配: open\(\) ".*?(\.git|\.env|\.htaccess|phpmyadmin|wp-admin|backup|install)\b.*?failed \(2: No such file or directory\)
• 触发条件建议:3 分钟内命中 5 次,封禁 1 小时(兼顾压制效果与防误伤)
• 启用 jail 并重启 fail2ban 服务
在 Nginx 配置层提前拦截高危路径和请求
fail2ban 是“事后响应”,Nginx 本身才是第一道防线。在对应 server 块中加这些规则:
• 禁止访问点开头的隐藏文件:location ~ /\. { return 404; }
• 禁止下载敏感后缀:location ~ \.(zip|rar|sql|bak|gz|7z|env|log|conf)$ { return 444; }(444 是直接断连,不返回任何响应)
• 拦截恶意 User-Agent:if ($is_bad_agent) { return 403; },配合 map 指令屏蔽 zgrab、nmap、sqlmap、bot、spider 等关键词
• 关闭非必要 HTTP 方法:if ($request_method !~ ^(GET|HEAD|POST|OPTIONS)$) { return 405; }
主动反制:让扫描器“下到爽”或“连不上”
对付顽固扫描器,可以策略性反制:
• 对常见备份后缀(.zip、.sql、.tar 等)做 301 跳转到公网大文件(如 http://speedtest.tele2.net/100GB.zip),消耗其带宽和时间
• 或更彻底:直接用 return 444 让连接瞬间中断,不占 worker 进程、不写 access 日志、CPU 零开销
• 不推荐对正常业务网站开放 IP 直接访问,加一条默认 server:server { listen 80 default_server; server_name _; return 500; },只放行已知域名











