新手识别网络层恶意扫描的核心是盯住“高频、低交互、无业务逻辑”的请求特征,可借助head+404组合、路径重复性、referer为空、get变体(短路径/零响应/异常ua/等间隔)及基础日志聚类命令快速定位可疑ip与行为。

新手识别网络层恶意扫描,核心是盯住“高频、低交互、无业务逻辑”的请求特征。不需要复杂工具,用几条命令就能快速定位可疑行为。
从HEAD + 404组合入手,锁定最典型的扫描痕迹
全网扫描器(如gobuster、ffuf、DirBuster)为提速,默认大量使用HEAD方法探测路径是否存在。真实用户几乎不用HEAD,所以日志中出现成片的HEAD + 404,基本就是扫描器在干活。
- 用这条命令快速筛出: awk '$6 ~ /^"HEAD/ && $9 == 404 {print $1, $4, $6, $9}' /var/log/nginx/access.log | head -20
- 重点关注同一IP在1分钟内是否发出15条以上这类请求
- 如果某IP的HEAD请求占比超过80%,基本可判定为扫描源
结合路径特征和Referer字段交叉验证
单纯看状态码容易误判,加两个维度能显著提高准确率:
- 扫描路径高度重复且无上下文,比如连续请求 /.git/config、/phpmyadmin/、/wp-config.php、/backup.zip
- Referer字段为空(即日志中显示为 "-"),说明不是从页面跳转触发,排除浏览器正常行为
- 组合命令示例:grep -E '"HEAD /(\.git|phpmyadmin|wp-admin|backup\.|test\.php)' /var/log/nginx/access.log | awk '$9==404 && $11=="-" {print $1}' | sort | uniq -c | sort -nr
注意伪装成GET的变体扫描行为
有些新型扫描器会改用GET绕过规则,但保留扫描特征:
- 路径极短且无参数,例如 GET /a.php、GET /conf、GET /x
- 响应体长度恒为0或极小(可用 $body_bytes_sent 字段辅助判断)
- User-Agent异常,比如含 sqlmap、nikto、dirsearch 或空白、极简字符串
- 时间戳呈等间隔规律(如每1.1秒一条),这是脚本循环探测的典型节奏
用基础命令做初步聚类和排序
不依赖ELK或GoAccess,也能快速发现异常IP和行为模式:
- 查高频访问IP(过去一小时):awk -v d="$(date -d '1 hour ago' '+%d/%b/%Y:%H:[0-5][0-9]')" '$4 ~ d {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
- 查高频404路径:awk '$9==404 {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
- 查异常User-Agent:awk '$6 ~ /bot|spider|curl|wget|sqlmap|nikto/ {print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -nr











