通过nginx日志可直接识别扫描器指纹,关键特征包括可疑user-agent(如sqlmap/1.7.1)、非常规url路径(如/phpmyadmin/)、空或极简ua配合敏感路径、高频请求及异常状态码,无需额外部署waf或ids。

直接通过 Nginx 日志识别扫描器指纹,核心是分析请求的 User-Agent、URL 模式、请求频率、HTTP 方法、Referer 和响应状态码 等特征,无需额外部署 WAF 或 IDS,靠日志本身就能发现常见自动化扫描行为。
关注高频出现的可疑 User-Agent
大量扫描器会暴露自身身份,比如:
- sqlmap/1.7.1、Nikto/2.1.6、DirBuster/1.0 —— 明确带工具名和版本
-
Mozilla/5.0 (compatible; Baiduspider) 正常,但若频繁访问
/phpmyadmin/或/wp-admin/就值得怀疑 - - / -(空 UA)或极简 UA(如 curl/7.68.0)配合非常规路径,也可能是脚本直连
建议在 Nginx 日志格式中确保包含 $http_user_agent,并用 awk/grep/GoAccess 等工具定期提取高频异常 UA。
识别 URL 路径中的扫描特征
扫描器常批量探测已知敏感路径,这些请求往往不符合真实用户行为:
- 连续访问
/phpmyadmin/、/wp-config.php.bak、、<code> + <code> + <code> - 路径含典型漏洞 payload 片段:如
?id=1%20UNION%20SELECT、 - 大量 404 请求集中在同一 IP,且路径无规律(如
、<code>、<code>)
可写简单脚本统计单 IP 在 5 分钟内触发 >20 个 404 的路径集合,再匹配已知指纹库(如 nginx-scan-detect 的规则)。
结合请求节奏与 IP 行为建模
真实用户有停顿、跳转、JS 渲染延迟;扫描器则呈现强规律性:
- 相同 IP 在 1 秒内发出 10+ 请求,间隔稳定(如 123ms、200ms 整数倍)
- 大量 HEAD 或 OPTIONS 请求试探服务(正常业务极少批量发 HEAD)
- 同一 IP 同时扫多个子目录(
/api/、/static/、),但每个只发 1–2 次请求
Nginx 自身不支持会话级限速,但可通过 limit_req 配合 zone 临时封禁高频 IP,再结合日志导出做离线聚类分析(如用 Python 的 pandas 统计 IP 的 request/sec 和 path entropy)。
利用响应状态码反向验证
扫描器对响应更“贪婪”,容易暴露意图:
- 大量 401/403 请求 → 探测管理后台未授权访问
- 连续 301/302 跳转后仍继续请求重定向目标 → 可能是爬虫无视跳转逻辑
- 对静态资源(
.js、.css)返回 200,但对/login返回 500 → 可能触发了未处理异常,属 fuzz 类扫描
在 log_format 中加入 $status 和 $request_time,筛选出 “高请求数 + 高 4xx/5xx 比例 + 低平均耗时” 的 IP 组合,命中率较高。











