Nginx网关层通过map指令精准匹配恶意User-Agent实现轻量高效拦截,覆盖工具名、空UA、攻击关键词等特征,并需白名单放行合法爬虫与监控系统。

直接在 Nginx 网关层过滤恶意 User-Agent,是阻断低级爬虫和自动化扫描器最轻量、最有效的第一道防线。关键不在于“拦所有爬虫”,而在于精准识别并拒绝已知高危或无意义的 UA 字符串。
识别常见恶意 User-Agent 特征
非法扫描器和恶意爬虫通常暴露明显痕迹:
- UA 字符串中包含 sqlmap、nikto、dirbuster、gobuster、acunetix、nuclei、whatweb、masscan、zmap 等工具名
- 使用空 UA(
User-Agent:)或极简 UA(如User-Agent: -、User-Agent: () { :; }; echo vulnerable) - UA 中含明显攻击意图关键词,如 scanner、crawler、exploit、hack、pentest、vuln
- 伪造主流浏览器但格式异常,例如
Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36后紧跟可疑路径或参数
在 Nginx 配置中实现 UA 黑名单拦截
推荐在 http 或 server 块中使用 map 指令做高效匹配(比 if + return 更安全、性能更好):
map $http_user_agent $blocked_ua {
default 0;
"~*sqlmap" 1;
"~*nikto" 1;
"~*dirbuster" 1;
"~*gobuster" 1;
"~*acunetix" 1;
"~*nuclei" 1;
"~*whatweb" 1;
"~*masscan" 1;
"~*zmap" 1;
"~*scanner|crawler|exploit|hack|pentest|vuln" 1;
"~*^$|^-$|^\s*$" 1; # 空、短横线、纯空白
}然后在 server 或 location 中拦截:
if ($blocked_ua) {
return 403 "Access denied.";
}⚠️ 注意:if 在 location 外可用,但避免嵌套复杂逻辑;生产环境建议将该逻辑统一放在 server 块顶层,并配合日志记录便于审计。
增强策略:结合日志与渐进式响应
单纯返回 403 可能暴露防御存在。可进一步提升隐蔽性与可观测性:
- 在
log_format中加入$http_user_agent和$blocked_ua,方便快速筛查被拦请求 - 对高频 UA 拦截 IP,配合
limit_req限流,防暴力试探 - 对疑似扫描行为,可返回 403 + 空白 HTML 或重定向到无害页面(非必须,需权衡运维成本)
- 定期更新 UA 规则 —— 可从开源项目如 nginx-ultimate-bad-bot-blocker 获取维护良好的黑名单
注意边界:别误伤合法流量
User-Agent 过滤容易误封:
- 部分监控系统(如 Zabbix、Prometheus Alertmanager)、CI/CD 工具、内部健康检查脚本会自定义 UA,需白名单放行
- 搜索引擎爬虫(Googlebot、Bingbot)应保留,除非业务明确不需要收录
- 移动端 App 或小程序内嵌 WebView 可能 UA 不标准,测试阶段务必灰度验证
- 建议先用
log_only模式运行一周(例如设置变量但不 return),分析日志确认无误后再启用真实拦截










