Nginx通过特征识别、行为控制和分层拦截封锁恶意爬虫:基于User-Agent、请求头缺失、敏感路径扫描等特征判断,配合if规则封禁、限流机制及Fail2ban动态封禁实现多层防护。

Nginx 识别并封锁恶意爬虫,核心在于“特征识别 + 行为控制 + 分层拦截”。它不依赖复杂算法,而是利用请求头、路径、频率和响应日志等可观测信号,在流量入口快速过滤掉大部分低质量自动化访问。
识别恶意爬虫的关键特征
真实用户浏览器与恶意爬虫在行为模式上有明显差异,Nginx 可直接提取以下字段做判断:
-
User-Agent 异常:为空、含
python-requests、curl、scrapy、go-http-client、HeadlessChrome等典型工具标识 -
请求头缺失或失配:缺少
Accept、Accept-Language或Referer(尤其对非首页请求) -
路径扫描痕迹:高频访问
/phpmyadmin/、/wp-admin/、/.git/、/backup.zip等敏感路径 -
无 robots.txt 遵守行为:跳过
/robots.txt直接请求管理后台或配置文件
用 Nginx 做实时拦截的常用配置
所有 if 规则必须写在 server 块顶层(location 外),否则可能失效:
- 封禁空 UA 和常见爬虫 UA:
if ($http_user_agent = "") { return 444; }
if ($http_user_agent ~* "(python-requests|curl|wget|scrapy|go-http-client|headlesschrome)") { return 444; } - 拒绝缺失关键请求头:
if ($http_accept = "") { return 403; }
if ($http_accept_language = "") { return 403; } - 屏蔽高危路径(返回 404 避免暴露存在性):
location ~* ^/(phpmyadmin|wp-admin|adminer|\.git|\.env|web\.config) { return 404; }
用限流机制压制高频爬虫
单纯封 UA 拦不住伪装良好的脚本,必须叠加速率控制。推荐按场景分级限流:
- 全局基础防护(防 IP 扫描):
limit_req_zone $binary_remote_addr zone=perip:10m rate=5r/s;
limit_req zone=perip burst=10 nodelay; - 后台接口严控(防爆破):
location /api/v1/auth {
limit_req zone=perip burst=0;
# 不留缓冲,超速即拒
} - 静态资源宽松放行(保页面加载):
location ~*\.(js|css|png|jpg|gif)$ {
limit_req zone=perip rate=100r/s;
}
结合 Fail2ban 实现动态封禁闭环
Nginx 做事前过滤,Fail2ban 做事后封禁,两者配合可覆盖更多攻击形态:
- 监控 404 扫描:每 10 分钟内触发 30 次 404 即封 IP 24 小时
- 监控登录爆破:对
/login或/wp-login.php的 POST 请求,5 次失败即封 1 小时 - 白名单保护:在
ignoreip中加入你自己的出口 IP 和 Googlebot、Bingbot 等可信网段,避免误伤


















