识别高频恶意扫描源的关键是发现“非人方式反复试探”的行为,如1分钟内20条head+404请求、高频访问.git等敏感路径、等间隔探测或error.log中重复出现“open() failed (2: no such file or directory)”,结合ip、时间、路径、ua三维度交叉验证可精准锁定。

识别高频恶意扫描源,关键不是看“有没有异常”,而是看“谁在用非人方式反复试探”。真实用户不会在一分钟内发20条 HEAD 请求、扫15个 .git 路径、或每1.2秒固定 GET 一个空响应的 /a.php。这些行为在日志里非常扎眼,几条命令就能揪出来。
盯住 HEAD + 404 组合,筛出最典型的扫描痕迹
绝大多数目录爆破工具(如 gobuster、ffuf)默认用 HEAD 方法提速,而浏览器几乎不用它。只要看到成片的 HEAD 请求返回 404,基本就是扫描器在干活。
- 快速提取:`awk '$6 ~ /^"HEAD/ && $9 == 404 {print $1, $7}' /var/log/nginx/access.log | head -20`
- 重点看同一 IP 在 60 秒内是否超过 15 条;若该 IP 的 HEAD 占比超 80%,基本可锁定
- 配合路径过滤更准:`grep -E '"HEAD /(\.git|phpmyadmin|wp-admin|backup\.zip)' /var/log/nginx/access.log | awk '$9==404 && $11=="-" {print $1}' | sort | uniq -c | sort -nr`
从 error.log 里抓“找不到文件”的重复记录
access.log 可能被重写或跳转干扰,但 error.log 中的 `open() failed (2: No such file or directory)` 是铁证——只要文件系统没这个路径,Nginx 就稳稳记一笔。攻击者扫 /.env、/.git/config、/wp-config.php 时,这条日志必现。
- 直接搜敏感关键词:`grep -i '\.git\|\.env\|phpmyadmin\|backup\.' /var/log/nginx/error.log`
- 统计扫得最凶的 IP:`awk '/No such file/ && /(\.git|\.env)/ {print $12}' /var/log/nginx/error.log | sort | uniq -c | sort -nr | head -10`(注意:$12 是 client IP 字段,你的日志格式可能需微调)
- 查某 IP 扫了哪些路径:`grep 'client: 192.168.1.100' /var/log/nginx/error.log | grep 'No such file'`
用时间+路径+UA 三维度交叉验证
单看状态码或 IP 容易误判,加时间规律和语义逻辑才能确认是扫描而非误点。
- 查短时间爆发:`awk -v d="$(date -d '10 minutes ago' '+%d/%b/%Y:%H:%M')" '$4 ~ d {print $1, $7, $9}' /var/log/nginx/access.log | grep '404' | head -15`
- 看路径是否成组:连续出现 /.git/config、/.git/HEAD、/.git/index,或 /admin/、/administrator/、/wp-login.php
- 查 UA 异常:`awk '$6 ~ /sqlmap|nikto|dirsearch|curl|wget|python-requests/ || length($6)
不依赖工具,用基础命令做初步聚类
不需要 ELK 或商业平台,Linux 自带命令就能发现异常模式。
- 高频访问 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`
- 异常 UA 汇总:`awk '$6 ~ /bot|spider|scan|nmap/ {print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -nr`











