直接从日志筛选HEAD+404请求是识别扫描器最轻量有效方法,因其高频、固定路径、空Referer、等间隔探测且基本无真实交互。

直接从日志里筛出无效 HEAD 请求,是识别全网扫描器最轻量、最有效的切入点。这类请求几乎不带业务语义,高频、固定路径、无真实交互意图,且大量集中在 404 状态,极易批量捕获。
盯住 HEAD 方法 + 404 状态组合
扫描器(尤其是 DirBuster、gobuster、ffuf 等)为提速常默认用 HEAD 方法探测路径是否存在。人工访问极少用 HEAD,所以日志中出现大量 HEAD + 404 的记录,基本可判定为自动化扫描。
- Apache/Nginx 默认日志中,请求方法在第 6 字段(如 "HEAD /admin.php HTTP/1.1"),状态码在第 9 字段
- 用命令快速提取:
awk '$6 ~ /^"HEAD/ && $9 == 404 {print $1, $4, $6, $7, $9}' /www/wwwlogs/your-site.log | head -30 - 重点关注同一 IP 在 1 分钟内发出 20+ 条以上此类请求
过滤典型扫描路径和空 Referer
扫描器试探路径高度重复且缺乏上下文,比如连续请求 /.git/config、/phpmyadmin/、/backup.zip、/test.php 等,同时 Referer 字段为空或为“-”。
- 结合路径特征增强判断:
grep -E '"HEAD /(\.git|phpmyadmin|wp-admin|backup\.|test\.php)' /www/wwwlogs/your-site.log | awk '$9==404 && $11=="-"' | awk '{print $1}' | sort | uniq -c | sort -nr - Referer 为空(字段 $11 是 "-")说明非页面跳转触发,进一步排除浏览器正常行为
- 若某 IP 同时命中“HEAD + 404 + 扫描路径 + 空 Referer”,基本可锁定为扫描源
用宝塔或日志工具做可视化初筛
如果你用宝塔面板,无需写命令也能快速定位:
- 进「网站日志 → 日志扫描」,开启「恶意爬虫检测」,系统会自动标出高频 HEAD 请求 IP
- 点击可疑 IP,在请求列表中按 Method 列排序,一眼可见全是 HEAD
- 观察时间列:是否呈等间隔(如每 1.2 秒一条),这是脚本循环探测的典型节奏
- 导出该 IP 全部请求后,用文本编辑器搜索 "HEAD /",统计占比——超 80% 即高度可疑
补充:警惕伪装成 GET 的扫描器变体
部分新型扫描器为绕过规则,改用 GET 方法但保留扫描特征:
- 路径极短且无参数:如 GET /a.php、GET /conf、GET /x
- 响应体长度恒为 0 或极小(
- 配合 User-Agent 异常(如 python-requests/2.28.1、curl/7.81.0)更可确认
- 可用命令补查:
awk '$6 ~ /^"GET/ && $9==404 && length($7)











