Nginx在请求入口实时识别恶意访问,关键在于即时匹配请求头(如异常User-Agent、缺失Referer)、敏感路径扫描、高频异常响应(如60秒内>50次且30%为404)等四类信号,无需依赖日志分析或复杂模型。

在 Nginx 层直接识别恶意访问,关键不是等日志攒够再分析,而是利用请求实时特征做即时判断。它不依赖后台系统或复杂模型,靠的是对 请求头、路径、频率、响应结果 这四类信号的快速抓取和规则匹配。
看 User-Agent 和请求头是否“不像人”
真实浏览器会带全基础字段,而多数爬虫或扫描器会精简甚至伪造:
- User-Agent 为空、含
python-requests、curl、sqlmap、nmap、go-http-client、HeadlessChrome等关键词 - 缺少
Accept、Accept-Language或Referer(尤其对非首页路径如/admin/login) -
Referer是空值(显示为-)或来自明显垃圾域名
盯敏感路径和异常请求方法
攻击者常靠“试错”找入口,行为非常机械:
- 高频访问
/.git/、/wp-admin/、/phpmyadmin/、/backup.zip、/etc/passwd、/config.php等已知风险路径 - URL 中带典型攻击参数:
?id=1' OR 1=1--、?file=../../etc/passwd、?redirect=http:// - 使用非标准 HTTP 方法:
PUT、DELETE、TRACE、TRACK(除非业务明确需要)
抓高频与低质量响应组合
单看频率或状态码容易误杀,但二者叠加就很有指向性:
- 同一 IP 在 60 秒内发起 >50 次请求,且其中 ≥30% 返回 404(说明在暴力扫目录)
- 大量请求返回 403(权限探测)、500(尝试触发漏洞)或 0 字节响应(可能是探测型请求)
- 请求 URI 长度异常(如超 2000 字符),或包含大量编码字符(
%20%27%22)
用 Nginx 原生命令快速验证模式
无需写脚本,几条命令就能现场筛查:
- 查高频 404 扫描:
awk '$9==404 {print $1,$7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20 - 查可疑 UA:
awk '$12 ~ /curl|sqlmap|nmap|scrapy/ {print $1,$12}' /var/log/nginx/access.log | sort | uniq -c - 查敏感路径访问:
grep -E "/(\.git|phpmyadmin|wp-admin|\.env|backup\.zip)" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c
这些信号在 Nginx 配置里可以直接用 if + return 或 limit_req 拦截,也可以输出到独立日志供 Fail2Ban 后续处理。核心是把“可疑”变成可配置、可复用的规则,而不是靠人工翻日志猜。


















