如何区分真实流量与机器人流量完全指南
一份面向网站站长与运维人员的深度实战教程,从流量分类、识别方法、工具横评到日志分析实战,全面覆盖真实访问、有益机器人和恶意攻击的甄别与处置。
1. 开头导语
根据 Imperva、Cloudflare 等安全厂商多年发布的《Bad Bot Report》,全球互联网流量中约 40%~50% 来自机器人(Bot),其中恶意机器人占比常年维持在 30% 上下。这意味着,你的网站每收到两个请求,就有一个可能不是真人发出的。
对站长和运维人员而言,能否准确区分真实流量与机器人流量,直接决定了三件事:业务数据的可信度(GA 里的 PV 是不是被灌水了)、SEO 收录的健康度(Googlebot 会不会被误拦)、以及服务器成本与安全风险(CC 攻击会不会打垮带宽、撞库会不会泄露账号)。本教程将系统讲解三类流量的本质差异、主流识别方法、日志分析实战、Cloudflare 规则编写、误拦截排查与自动化监控,帮助你建立一套可持续运转的流量治理体系。
2. 互联网流量的三大类别
在动手识别之前,必须先把流量分门别类。互联网流量按"来源意图"可归为三大类:真实人类访问、有益机器人、恶意机器人。三类流量的识别难度和价值/危害完全不同,混淆它们会导致"放走了攻击者、拦住了搜索引擎"的灾难性后果。
2.1 真实人类访问
真实人类访问指的是由浏览器或 App 用户主动发起、带有明确业务意图的流量。其核心特征不在 HTTP 头本身,而在行为模式:
- 浏览器行为链路完整:会先请求 HTML,再请求 CSS/JS,最后加载图片、字体、XHR 接口,资源加载顺序符合渲染管线。
- 鼠标与滚动轨迹:鼠标移动呈曲线、有停顿、有回看;滚动速度不均匀,常伴随键盘事件。
- 页面停留时间分布合理:首页停留 10~60 秒,详情页 30~180 秒,符合内容深度。
- 交互事件:点击、悬停、表单填写、复制粘贴等高频事件,且事件之间存在合理时间间隔。
- 会话连续性:同一用户在 30 分钟内浏览多个页面,Referer 链路自洽。
2.2 有益机器人
有益机器人是网站运营所必需的自动化程序,它们带来流量、收录、监控和集成能力,应当被识别并主动放行。常见类型包括:
- 搜索引擎爬虫:Googlebot、Bingbot、Baiduspider、YandexBot,负责抓取页面并建立索引。
- SEO 工具爬虫:AhrefsBot、SemrushBot、MJ12bot、DotBot,用于反向链接和外链分析。
- 网站监控机器人:UptimeRobot、Pingdom、StatusCake、阿里云监控,定时探活。
- RSS 聚合器与Feed 抓取器:Feedly、Inoreader、抓虾等,定时拉取 RSS 源。
- API 客户端与合法集成:支付回调、Webhook、官方 App 的 SDK 请求。
2.3 恶意机器人
恶意机器人以窃取数据、消耗资源、欺诈获利为目的,是流量治理的重点打击对象:
- 暴力破解与撞库:针对登录、找回密码接口的高频尝试。
- 漏洞扫描:批量探测
/wp-admin、/.env、/phpmyadmin、/admin等敏感路径。 - 内容爬取:无视 robots.txt,高频抓取商品、文章、价格,用于竞品分析或聚合站。
- DDoS / CC 攻击:通过大量请求耗尽带宽或应用层资源,CC 攻击尤其擅长伪造真实请求。
- 垃圾注册与评论:批量注册账号、群发评论/私信,常伴随 SEO 黑链与钓鱼。
- 广告欺诈(Click Fraud):模拟点击广告消耗对手预算,或刷自家展示位骗取广告主费用。
2.4 三类流量特征对比
| 维度 | 真实人类访问 | 有益机器人 | 恶意机器人 |
|---|---|---|---|
| 来源 | 浏览器/App 主动发起 | 已知厂商服务器 | 数据中心/代理池/僵尸网络 |
| 行为模式 | 资源链路完整、交互丰富 | 单一请求模式、匀速 | 高频、无资源加载、路径固定 |
| UA 特征 | 主流浏览器 UA | 厂商标识 UA(可验证) | 空 UA/伪造 UA/已知恶意 UA |
| robots.txt | 遵守 | 遵守 | 忽略或部分遵守 |
| 价值/危害 | 业务核心价值 | 收录、监控、集成必需 | 数据窃取、资源消耗、欺诈 |
| 识别难度 | 中(行为分析) | 低(UA + 反向 DNS) | 高(持续对抗升级) |
3. 识别真实人类访问的核心方法
识别真实人类,本质是回答一个问题:"屏幕后面是不是有一个会动鼠标、会思考的人?"以下方法从行为、指纹、挑战三个层面逐级加强。
3.1 行为分析(Behavioral Analysis)
行为分析通过收集前端埋点的事件流,判断用户操作是否符合人类习惯。关键指标包括:
- 鼠标移动:人类鼠标轨迹呈贝塞尔曲线,有加速减速;脚本伪造多为直线段或像素级精确跳跃。
- 点击模式:双击间隔 200~500ms,点击位置有抖动;机器点击坐标恒定。
- 滚动速度:人类滚动有停顿和回滚,机器滚动匀速到底。
- 页面停留时间:低于 1 秒的"打开即走"高度可疑。
优点:对无头浏览器(Headless Chrome)有效;缺点:需前端埋点,对性能有损耗,隐私合规需谨慎。
3.2 浏览器指纹(Browser Fingerprinting)
浏览器指纹通过采集客户端可计算的硬件/软件特征,生成唯一标识。常用维度:
- Canvas 指纹:让浏览器绘制一段图形,不同显卡/驱动渲染结果有细微差异,产生哈希。
- WebGL 指纹:读取 GPU 厂商与渲染器字符串。
- 字体列表:通过测量不同字体宽度推断已安装字体集合。
- 屏幕分辨率、时区、语言、颜色深度:组合后唯一性极高。
指纹对识别"同一设备多账号"尤为有效,但需注意 GDPR/个保法合规,且部分反指纹插件会主动混淆。
3.3 JavaScript 挑战(JS Challenge)
JS Challenge 要求客户端执行一段动态生成的 JavaScript 并返回结果,无头浏览器若未实现完整 JS 引擎或 DOM 模拟则无法通过。主流方案:
- Cloudflare Managed Challenge:根据请求风险自动选择放行、JS 挑战或 CAPTCHA。
- hCaptcha:主打隐私友好的无感挑战。
- Cloudflare Turnstile:免费的无感验证组件,可嵌入任意表单。
优点:对低水平脚本一击毙命;缺点:高级无头浏览器(如打了补丁的 Puppeteer)可绕过,需配合行为分析。
3.4 CAPTCHA 验证码
CAPTCHA 是最后一道防线,分两类:
- 传统验证码:图形扭曲字符、滑动拼图、点选汉字,体验差但识别力强。
- 无感验证码:基于行为评分,正常用户无感知,仅高风险时弹挑战。
| 类型 | 体验 | 安全性 | 适用场景 |
|---|---|---|---|
| 传统图形验证码 | 差 | 中(易被 OCR) | 注册/找回密码 |
| 滑动拼图 | 中 | 中 | 登录 |
| 无感验证码(Turnstile/reCAPTCHA v3) | 好 | 高 | 全站默认启用 |
3.5 Cookie 和 Session 追踪
通过设置首次访问 Cookie,并在后续请求中校验,可识别"无状态"的脚本爬虫。典型做法:
- 首次请求返回一段 JS,JS 计算一个 token 写入 Cookie。
- 后续请求需携带该 Cookie,否则触发挑战。
该方法对不执行 JS 的简单脚本有效,但需注意 SameSite、第三方 Cookie 限制带来的误伤。
4. 识别有益机器人(Good Bots)的方法
有益机器人识别的核心原则是**“不要相信 UA,要验证身份”**。任何脚本都能伪造 User-Agent,只有反向 DNS 才能证明来源归属。
4.1 User-Agent 字符串识别
主流搜索引擎和工具厂商都会在 UA 中暴露身份,常见 UA 列表:
- Googlebot:
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) - Googlebot-Mobile:
Mozilla/5.0 (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html) - Bingbot:
Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) - Baiduspider:
Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html) - AhrefsBot:
Mozilla/5.0 (compatible; AhrefsBot/7.0; +http://ahrefs.com/robot/) - SemrushBot:
Mozilla/5.0 (compatible; SemrushBot/7~bl; +http://www.semrush.com/bot.html) - MJ12bot:
Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/) - UptimeRobot:
Mozilla/5.0 (compatible; UptimeRobot/2.0; http://www.uptimerobot.com/)
4.2 反向 DNS 双重验证法
UA 可伪造,但 IP 归属无法伪造。Google、Bing 等均要求通过"正向 DNS + 反向 DNS"双重验证:
- 反向 DNS:对请求 IP 做 PTR 查询,得到主机名(如
crawl-66-249-66-1.googlebot.com)。 - 正向 DNS:对该主机名做 A/AAAA 查询,确认解析回原始 IP。
- 域名校验:确认主机名属于可信域(如
*.googlebot.com、*.google.com、*.search.msn.com)。
只有三步全部通过,才认定为真 Googlebot/Bingbot,否则视为伪造 UA 的恶意爬虫。
4.3 robots.txt 协议的作用与局限
robots.txt 是"君子协定",声明哪些路径允许哪些爬虫访问。其作用与局限:
- 作用:合规爬虫(Googlebot、Bingbot)会严格遵守;可用于引导爬虫抓取预算。
- 局限:恶意爬虫完全无视 robots.txt;甚至有人通过读取 robots.txt 反向发现敏感路径。
- 建议:robots.txt 用于管理有益爬虫的抓取范围,不能作为安全防线。
4.4 常见有益机器人清单
| 名称 | User-Agent 关键字 | 验证域名 | 功能 | 是否放行 |
|---|---|---|---|---|
| Googlebot | Googlebot | *.googlebot.com *.google.com | 搜索索引 | 是 |
| Bingbot | bingbot | *.search.msn.com | 搜索索引 | 是 |
| Baiduspider | Baiduspider | *.baidu.com *.baidu.jp | 中文搜索 | 是 |
| YandexBot | YandexBot | *.yandex.com *.yandex.ru | 俄语搜索 | 按业务 |
| AhrefsBot | AhrefsBot | *.ahrefs.com | SEO 外链分析 | 按需 |
| SemrushBot | SemrushBot | *.semrush.com | SEO 分析 | 按需 |
| MJ12bot | MJ12bot | *.mj12bot.com | 外链爬取 | 可限速 |
| UptimeRobot | UptimeRobot | *.uptimerobot.com | 可用性监控 | 是 |
| Pingdom | Pingdom.com_bot_version | *.pingdom.com | 性能监控 | 是 |
| Applebot | Applebot | *.applebot.apple.com *.apple.com | Siri/Spotlight | 是 |
4.5 在日志中快速识别有益机器人
在 Nginx 访问日志中,可用一条命令快速统计 Top 有益机器人:
awk -F'"' '{print $6}' /var/log/nginx/access.log \
| grep -oiE 'Googlebot|Bingbot|Baiduspider|AhrefsBot|SemrushBot|MJ12bot|UptimeRobot|Pingdom|Applebot|YandexBot' \
| sort | uniq -c | sort -rn
输出即为各有益机器人的请求次数排名。若某"Googlebot"请求量异常高,再对其 IP 做反向 DNS 验证,判断是否伪造。
5. 识别恶意机器人(Bad Bots)的方法
恶意机器人的识别是攻防对抗的持续过程,没有银弹,需要多维度信号交叉验证。以下方法从轻量到重量依次展开。
5.1 User-Agent 异常检测
UA 是最易获取、也最易造假的信号。需重点监控三类异常:
- 空 UA 或过短 UA:正常浏览器 UA 长度通常 100 字符以上,空 UA 多为脚本或扫描器。
- 伪造 UA:UA 声称是 Googlebot 但反向 DNS 不匹配;或声称是 Chrome 但版本号不存在(如
Chrome/9999)。 - 已知恶意 UA:
sqlmap、Nessus、masscan、ZmEu、nikto、dirb、python-requests/2.x、curl/7.x、Wget、Go-http-client等工具型 UA。
# 统计空 UA 请求
awk -F'"' '$6=="" || $6=="-"' /var/log/nginx/access.log | wc -l
# 统计可疑工具 UA
grep -iE 'sqlmap|nikto|masscan|nessus|python-requests|curl/|wget|go-http-client|libwww' /var/log/nginx/access.log | wc -l
5.2 请求频率异常
频率是恶意机器人最难以掩盖的特征。检测维度:
- 高频请求:单 IP 每秒请求数 > 20,或每分钟 > 600,远超人类浏览速度。
- 匀速请求:请求间隔标准差极小(如固定 500ms),人类请求间隔是泊松分布。
- 并发异常:单 IP 同时维持 50+ 个 TCP 连接。
- 时段集中:凌晨 2~5 点请求量与白天持平甚至更高。
频率阈值需结合业务调整:API 接口允许高频,静态页面应严格。
5.3 行为模式异常
行为层面的异常更能暴露"机器人身份":
- 只访问特定路径:仅请求
/admin、/wp-login.php、/.env、/xmlrpc.php,不访问首页。 - 忽略 robots.txt:真爬虫会先读 robots.txt,恶意爬虫直接探测。
- 不加载资源:只请求 HTML/JSON,不请求 CSS/JS/图片,资源请求比 < 0.1。
- 路径遍历:按字典顺序扫描
/admin、/admin.php、/admin/、/administrator/。 - Referer 造假:Referer 指向不存在的页面或第三方域名,与请求路径不匹配。
5.4 IP 信誉库查询
IP 层面的信誉判断:
- 已知恶意 IP 段:威胁情报库(如 AbuseIPDB、Spamhaus、Firehol)提供的恶意 IP 列表。
- TOR 节点:匿名网络出口,常用于撞库和扫描,建议对登录接口直接挑战。
- 数据中心 IP vs 住宅 IP:真实用户多为住宅/移动 IP(ASN 类型
isp);数据中心 IP(ASN 类型hosting)多用于服务器和代理池,是高风险信号。 - 代理/VPN 识别:通过 IP2Location、MaxMind GeoIP2 判断是否为公开代理。
5.5 HTTP 请求头异常
正常浏览器请求头有一组稳定特征,缺失或异常即高度可疑:
- 缺失
Accept-Language:浏览器必带,脚本常省略。 Accept头异常:真浏览器Accept: text/html,application/xhtml+xml,...,脚本常为*/*。Referer造假:Referer 域名与本站无关,或指向尚未生成的页面。- HEAD 请求过多:浏览器几乎不发 HEAD,扫描器常用 HEAD 探测。
X-Forwarded-For多跳伪造:堆叠多个 IP 试图绕过 IP 限速。
5.6 TLS 指纹(JA3/JA4)
TLS 握手时 ClientHello 包含密码套件列表、扩展、椭圆曲线等,组合后形成指纹:
- JA3:基于 ClientHello 字段计算的 MD5,可识别客户端类型(Chrome、Firefox、Python requests 各有固定 JA3)。
- JA4:JA3 的改进版,按字典序排列,更稳定可读。
价值:即使脚本伪造了 Chrome UA,其 JA3 仍是 Python/OpenSSL 的指纹,立即穿帮。Cloudflare、Akamai 等已内置 JA3 识别。
5.7 恶意机器人检测指标汇总
| 指标名 | 检测方法 | 阈值参考 | 置信度 |
|---|---|---|---|
| 空/异常 UA | UA 长度+关键字匹配 | 长度 < 20 或命中黑名单 | 高 |
| 请求频率 | 滑动窗口计数 | > 20 req/s 或 > 600/min | 高 |
| 请求匀速度 | 间隔标准差 | std < 50ms | 中高 |
| 资源加载比 | 静态资源/HTML 请求 | < 0.1 | 高 |
| 路径集中度 | 单 IP 路径熵 | 熵 < 1.5(仅扫少数路径) | 中 |
| 数据中心 IP | ASN 类型查询 | ASN type = hosting | 中 |
| TOR 出口节点 | TOR list 比对 | 命中即标记 | 中高 |
| 缺失 Accept-Language | 头存在性检查 | 缺失即可疑 | 中 |
| HEAD 请求占比 | 方法统计 | > 30% | 中高 |
| JA3/JA4 指纹 | TLS ClientHello 哈希 | 命中已知脚本指纹 | 高 |
| 忽略 robots.txt | 首请求路径 | 未访问 /robots.txt 即扫路径 | 中 |
6. 流量分析工具横评
工欲善其事,必先利其器。以下是五类主流流量分析工具的横评,覆盖从免费到企业级、从日志到 SaaS 的全谱系。
6.1 Google Analytics 4(GA4)
GA4 是 Google 的免费网站分析平台,基于页面埋点 + gtag 采集用户行为。
- 行为流分析:可视化用户在页面间的跳转路径,识别异常跳出。
- Bot 过滤设置:GA4 默认会过滤已知机器人流量(通过"数据设置 > 数据收集 > 排除机器人流量"开启)。
- 局限:依赖 JS 执行,不执行 JS 的爬虫完全采集不到;与服务器日志 PV 差异大正是此因。
- 适合:业务分析、营销归因,不适合安全审计。
6.2 Cloudflare Analytics
Cloudflare 在 DNS/CDN 层采集所有请求,提供免费的可视化分析。
- Bot 分析:按"人类/可能人类/可能机器人/已验证机器人"分类流量。
- Security 事件:记录被 WAF、Rate Limiting、Bot Fight Mode 拦截的请求详情。
- 优势:覆盖 100% 请求(包括被拦的),且集成 JA3、TLS、HTTP/2 指纹。
- 适合:已在用 Cloudflare 的中小站点,免费即可获得强大的 Bot 视图。
6.3 AWStats / Webalizer
老牌的服务器日志分析工具,直接解析 Nginx/Apache 访问日志生成静态报告。
- AWStats:按月/日生成 PV、UV、访客国家、UA 分布、入口页等统计。
- Webalizer:更轻量,按小时统计,适合快速查看。
- 优势:免费、离线、不依赖 JS,能反映所有 HTTP 请求(含爬虫)。
- 局限:无实时能力,无 Bot 识别,仅做原始统计。
- 适合:传统服务器环境、合规要求离线分析的场景。
6.4 Datadog / New Relic
APM(应用性能监控)平台,从应用内部采集请求和 trace。
- 流量监控:按端点、状态码、响应时间监控,可设置异常告警。
- Bot 识别能力弱:侧重性能而非安全,需配合自定义标签实现。
- 适合:已有 APM 投入、关注应用层性能和错误率的中大型团队。
6.5 专业 Bot 管理服务
企业级 Bot 防护方案,以机器学习 + 威胁情报为核心:
- Imperva Bot Management:原 Distil Networks,企业级 Bot 防护标杆。
- DataDome:实时 Bot 检测,部署简单,按流量计费。
- PerimeterX(现 HUMAN Security):行为分析见长,电商场景市占率高。
- Cloudflare Bot Management:基于超级 IP 信誉库 + 行为模型,企业版功能。
- 优势:识别率 95%+,覆盖高级无头浏览器和 Residential Proxy。
- 适合:高价值目标(电商、金融、票务),投入产出比可观的场景。
6.5 工具横评对比表
| 工具 | 免费/付费 | 部署方式 | Bot 识别能力 | 实时告警 | 适合规模 |
|---|---|---|---|---|---|
| Google Analytics 4 | 免费 | JS 埋点 | 弱(仅过滤已知 Bot) | 否 | 任意 |
| Cloudflare Analytics | 免费/付费 | DNS/CDN 边缘 | 强(JA3+IP 信誉) | 是 | 任意 |
| AWStats / Webalizer | 免费 | 服务器日志 | 无 | 否 | 中小 |
| Datadog / New Relic | 付费 | APM Agent | 弱(需自建) | 是 | 中大 |
| Imperva / DataDome / PerimeterX | 付费(昂贵) | 反代/MCDN/SDK | 极强(ML+情报) | 是 | 大型/高价值 |
7. 服务器日志分析实战
服务器日志是"上帝视角"——它记录了所有到达服务器的请求,无论是否执行 JS。掌握日志分析,是流量治理的基本功。
7.1 Nginx / Apache 访问日志格式
Nginx 默认 combined 格式:
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
一条示例日志:
203.0.113.45 - - [30/Sep/2026:10:15:32 +0800] "GET /article/123 HTTP/1.1" 200 5432 "https://www.google.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ..."
字段顺序为:客户端 IP、远程用户、时间、请求行、状态码、响应字节数、Referer、UA。
7.2 命令行分析日志实用命令
统计 Top 10 高频 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
统计各状态码占比
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
统计各 User-Agent 占比(识别异常 UA)
awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
统计被访问最多的路径
awk -F'"' '{print $2}' /var/log/nginx/access.log | awk '{print $2}' | sort | uniq -c | sort -rn | head -20
提取某 IP 的所有请求
grep '^203\.0\.113\.45 ' /var/log/nginx/access.log | less
统计 404 请求(识别扫描行为)
awk '$9==404 {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
7.3 用 GoAccess 做实时日志可视化
GoAccess 是开源的实时日志分析器,支持终端和 HTML 报告:
# 安装
apt install goaccess
# 终端实时分析
goaccess /var/log/nginx/access.log --log-format=COMBINED
# 生成 HTML 报告
goaccess /var/log/nginx/access.log --log-format=COMBINED -o /var/www/report.html --real-time-html
GoAccess 输出包括:独立访客、请求文件、404 列表、主机(IP)、UA、状态码、来源站点等,是 AWStats 的轻量替代。
7.4 实战:从日志提取 Top 10 高频 IP 并判断是否为恶意机器人
# 1. 提取 Top 10 高频 IP
TOP_IPS=$(awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10 | awk '{print $2}')
# 2. 对每个 IP 反向 DNS + 统计行为特征
for ip in $TOP_IPS; do
echo "=== $ip ==="
# 反向 DNS
host "$ip" | head -1
# 请求数
count=$(grep -c "^$ip " /var/log/nginx/access.log)
echo "请求数: $count"
# 访问路径数(路径熵参考)
paths=$(grep "^$ip " /var/log/nginx/access.log | awk -F'"' '{print $2}' | awk '{print $2}' | sort -u | wc -l)
echo "不同路径数: $paths"
# 404 占比(扫描特征)
notfound=$(grep "^$ip " /var/log/nginx/access.log | awk '$9==404' | wc -l)
echo "404 请求: $notfound (占比 $(awk "BEGIN{printf \"%.1f\", $notfound/$count*100}"))%"
# 资源加载比
html=$(grep "^$ip " /var/log/nginx/access.log | grep -cE '\.(html|/)$')
assets=$(grep "^$ip " /var/log/nginx/access.log | grep -cE '\.(css|js|png|jpg|jpeg|gif|woff|svg)$')
echo "HTML/资源: $html / $assets"
done
判断标准:反向 DNS 不属于已知搜索引擎、404 占比 > 50%、资源加载比 < 0.1、单日请求 > 10000,则高度疑似恶意机器人。
7.5 实战:统计各 UA 占比识别异常 UA
# 提取 UA 并按请求次数排序
awk -F'"' '{print $6}' /var/log/nginx/access.log \
| sort | uniq -c | sort -rn \
| awk '{printf "%6d %.1f%% %s\n", $1, $1/NR*100, substr($0, index($0,$2))}' \
| head -30
重点关注:占比异常高的非主流浏览器 UA、含 bot/spider/crawler/scan/curl/python/httpclient 关键字的 UA、空 UA 或 -。
8. 用 Cloudflare 精准区分三类流量
Cloudflare 在边缘对每个请求做 Bot 评分和分类,是中小站点最具性价比的流量治理方案。本节给出实战配置和三条 WAF 规则。
8.1 Bot Fight Mode 如何分类流量
Cloudflare 免费版开启 Bot Fight Mode(Security > Bots)后,会对请求打 Bot Score(1~99)并分四类:
- Verified Bot(已验证机器人):通过反向 DNS 验证的 Googlebot、Bingbot 等,Bot Score 接近 1,默认放行。
- Likely Bot(可能是机器人):行为/IP 特征偏向脚本,Bot Score 1~29,可挑战或监控。
- Likely Human(可能是人类):Bot Score 30~69,正常浏览器特征。
- Definitely Automated(确定自动化):Bot Score 接近 99,明确恶意特征。
免费版 Bot Fight Mode 自动对 Likely Bot 发起 JS Challenge;Pro 版可自定义阈值。
8.2 WAF 规则实战:放行、挑战、拦截
WAF Custom Rules(Security > WAF > Custom rules)支持基于 cf.botmanagement.score、cf.client_bot、ip.geoip.asnum、http.user_agent 等字段的表达式。三条实用规则如下:
规则 1:放行已验证搜索引擎爬虫
目的:确保 Googlebot、Bingbot 等不被任何挑战或拦截规则误伤。
表达式: (cf.client.bot)
动作: Skip (All remaining custom rules)
cf.client_bot 为 true 即 Cloudflare 已验证的反向 DNS 机器人,Skip 让其绕过后续所有限速和拦截规则。
规则 2:对可疑流量发起 JS Challenge
目的:对数据中心 IP + 非人类评分的组合发起 JS 挑战,过滤脚本。
表达式: (ip.geoip.asnum in {14061 16509 7979 24940 36352 63949}) and (cf.botmanagement.score lt 30) and not (cf.client_bot)
动作: Managed Challenge
ASNUM 为常见云厂商(DO、AWS、Akamai、Hetzner、Cologuard、Linode),Bot Score < 30 且非已验证机器人,发起 Managed Challenge。
规则 3:拦截已知恶意 UA + 数据中心 IP 组合
目的:对工具型 UA 与数据中心 IP 的组合直接拦截,无需挑战。
表达式: (http.user_agent contains "sqlmap") or (http.user_agent contains "nikto") or (http.user_agent contains "masscan") or (http.user_agent contains "nessus") or (http.user_agent contains "zgrab") or (http.user_agent eq "") and (ip.geoip.asnum in {14061 24940 36352 63949 7979})
动作: Block
规则顺序
WAF 规则按列表顺序从上到下执行,Skip 优先于 Block,因此规则 1 必须排在规则 3 之前,否则真 Googlebot 若 UA 命中 bot 关键字会被误拦。
8.3 Bot Management 仪表盘解读
Cloudflare 仪表盘的 Bot Management 视图(Pro 及以上)展示:
- Bot Score 分布:人类/机器人占比饼图。
- Top Bots:Top 已验证机器人和 Top 疑似机器人。
- 路径维度 Bot 占比:哪些端点被机器人访问最多(如登录页、API)。
- 趋势:Bot 流量随时间变化,识别突发爬取或攻击。
建议每日查看一次,发现 Bot Score < 30 的请求突增,立即下钻到具体 IP/UA 分析。
8.4 Rate Limiting 配合使用
Rate Limiting(Security > WAF > Rate limiting rules)对单 IP 或单 ASN 限速,是 WAF 规则的补充:
表达式: (http.request.uri.path contains "/api/login")
特征: 根据 IP
阈值: 10 requests per 1 minute
动作: Block for 10 minutes
经验:对登录、注册、找回密码、支付、搜索等"高价值端点"必加 Rate Limiting;对静态资源不加。
9. 误拦截排查与白名单管理
Bot 治理最大的风险不是漏拦,而是误拦——把真用户或有益爬虫挡在门外,直接影响收录、转化和口碑。
9.1 如何判断是否误拦截
- 检查 Security Events 日志:Cloudflare 的 Security > Events 列出所有被挑战/拦截的请求,按 UA、IP、规则筛选,重点关注被 Block 但 UA 看起来正常的请求。
- 对比正常流量模式:若某规则上线后,对应路径 PV 骤降 50%+,且无对应营销动作,高度疑似误拦。
- 观察 GA 实时报表:实时用户数突降且 Cloudflare 拦截量突增,基本可定位误拦。
- 搜索引擎收录监控:Google Search Console 收录数或抓取统计突降,可能误拦了 Googlebot。
9.2 常见误拦截场景
| 场景 | 原因 | 处置 |
|---|---|---|
| 第三方 API 调用 | 合作方服务器 IP 在数据中心,UA 为 SDK | 加入 IP/ASN 白名单 |
| 监控服务(Pingdom/UptimeRobot) | 高频探活触发限速 | UA 白名单 + 限速豁免 |
| CDN 回源 | CDN 节点 IP 段被识别为可疑 | 配置 CDN 回源 IP 白名单 |
| 移动端弱网 | 弱网下请求重试、JS Challenge 超时 | 降低挑战超时阈值或对移动端豁免 |
| Pre-render/SSR 服务 | 服务端渲染 IP 数据中心化 | IP 白名单 + UA 标识 |
| RSS 阅读器 | UA 含 bot,被 Bot Fight Mode 拦截 | UA 白名单 |
9.3 创建 IP 白名单 / ASN 白名单的正确方法
Cloudflare WAF 规则(IP 白名单):
表达式: (src.ip in {192.0.2.0/24 198.51.100.10 203.0.113.0/24})
动作: Skip (All remaining custom rules)
ASN 白名单(适合放行某云厂商所有节点):
表达式: (ip.geoip.asnum eq 13335)
动作: Skip (All remaining custom rules)
注意:白名单规则必须放在拦截规则之前;不要把整段 0.0.0.0/0 或大运营商 ASN 加入白名单,否则等于裸奔。
9.4 持续监控与调优策略
- 每周审计一次 Security Events:抽样 100 条被拦请求,人工复核是否误拦。
- 白名单最小化原则:能用 IP 不用 ASN,能用 UA+反向 DNS 不用 IP。
- 规则灰度上线:新拦截规则先用 Log 动作观察一周,再切 Block。
- 建立"误拦反馈通道":被拦页面提供联系入口,收集用户报告。
10. 自动化与持续监控
人工巡检不可持续,必须建立自动化告警和响应机制,让流量治理"自运转"。
10.1 设置流量异常告警
关键告警指标:
- 频率突增:单 IP 或全站 QPS 较 7 日均值的 3 倍以上。
- UA 分布突变:某 UA 占比从 < 1% 突然升至 > 20%。
- 错误率上升:5xx 错误率 > 5% 或 4xx 突增。
- 路径扫描信号:404 占比 > 30% 或单 IP 30 秒内访问 > 50 个不同路径。
- 登录失败率:登录接口 401/403 占比 > 60%。
Cloudflare 可通过 Analytics & Logs > Logpush 推送日志到 S3/BigQuery,再用 Cloudflare Workers 或外部告警系统做实时检测。
10.2 用 Cloudflare Workers 自动拦截异常流量
以下 Worker 在边缘实时统计单 IP 60 秒内请求数,超阈值则拦截:
export default {
async fetch(request, env, ctx) {
const ip = request.headers.get('CF-Connecting-IP') || 'unknown';
const key = `rate:${ip}`;
const now = Date.now();
const windowMs = 60 * 1000;
const threshold = 120; // 60 秒内 120 次请求即拦截
// 从 KV 读取历史记录
const record = await env.RATE_LIMIT.get(key, 'json');
let entries = (record && record.entries) || [];
// 清理过期记录
entries = entries.filter(ts => now - ts < windowMs);
// 追加本次请求
entries.push(now);
if (entries.length > threshold) {
return new Response('Too Many Requests', {
status: 429,
headers: { 'Content-Type': 'text/plain' }
});
}
// 写回 KV
await env.RATE_LIMIT.put(key, JSON.stringify({ entries }), {
expirationTtl: 60
});
return fetch(request);
}
}
部署步骤:创建 KV 命名空间 RATE_LIMIT,绑定到 Worker,将 Worker 路由绑定到需保护的路径(如 /api/*)。该方案无需后端,延迟在 5ms 内。
10.3 定期审计流量报告的频率和建议
| 审计项 | 频率 | 关注点 |
|---|---|---|
| Cloudflare Bot 报告 | 每日 | Bot 占比突变 |
| Security Events | 每日 | 新增拦截规则误伤 |
| 服务器日志 Top IP/UA | 每周 | 异常 IP 与 UA 出现 |
| WAF 规则效果 | 每月 | 命中率与误拦率 |
| 白名单有效性 | 每季度 | 是否有失效条目 |
| 全站流量基线 | 每季度 | 重新校准阈值 |
10.4 机器学习在 Bot 检测中的应用趋势
- 监督学习:用标注好的 Bot/Human 数据集训练分类器(XGBoost、LightGBM),输入特征为请求频率、UA、IP 信誉、行为特征。
- 无监督学习:聚类异常请求,发现未知攻击模式(如新型 CC 攻击)。
- 图神经网络:建模 IP-Session-UA 关系,识别僵尸网络的关联节点。
- 大模型:用于日志摘要、规则生成和误拦归因,提升运营效率。
趋势:专业 Bot 管理服务已普遍采用 ML,中小站点可用开源方案(如 CrowdSec)获得类似能力。
11. 常见问题排查
Q1:Google Analytics 中的流量为何与服务器日志差异巨大?
A:差异主要来自三方面:第一,GA 依赖 JS 执行,不执行 JS 的爬虫(占流量 30%~50%)不会出现在 GA 中,但会出现在服务器日志;第二,GA 默认过滤已知 Bot,而日志记录所有请求;第三,GA 基于 Client ID 统计 UV,同一 IP 多用户会被合并。建议以 GA 看"人类业务流量",以服务器日志看"全量流量",两者结合才能完整画像。
Q2:搜索引擎收录突然下降,是否被误拦截?
A:排查步骤:① 在 Cloudflare Security > Events 筛选 cf.client_bot eq true 的被拦记录,看是否有 Googlebot 被拦;② 在 Google Search Console 查看"抓取统计信息",对比抓取次数是否骤降;③ 检查 WAF 规则顺序,确保"放行已验证机器人"规则排在所有拦截规则之前;④ 用 Search Console 的"网址检查"工具测试实时抓取,若返回 403/503 即确认误拦。修复后收录通常 1~2 周恢复。
Q3:网站带宽突增但 PV 没有增长?
A:典型场景是"大文件被刷"或"接口被高频调用"。排查:① 在 Cloudflare Analytics 按"请求字节数"排序,找 Top 消耗带宽的端点;② 在服务器日志按 $body_bytes_sent 排序,找大响应请求;③ 检查是否有爬虫批量下载图片/视频/PDF;④ 检查是否有接口返回大数据量 JSON 被脚本循环调用。处置:对大文件端点加 Rate Limiting,对未授权 API 加鉴权和限速。
Q4:登录页被频繁访问但无成功登录?
A:这是撞库攻击的典型特征。处置:① 在登录接口加 Rate Limiting(如单 IP 10 次/分钟);② 对登录接口启用 Managed Challenge,对数据中心 IP 强制 CAPTCHA;③ 监控登录失败率,超阈值自动封禁 IP 1 小时;④ 强制开启二步验证(2FA),即使密码泄露也无法登录;⑤ 在日志中提取登录失败 IP 列表,加入威胁情报库联动封禁。
Q5:评论垃圾突然激增?
A:评论垃圾多来自自动化注册账号和群发脚本。处置:① 接入无感验证码(Turnstile/reCAPTCHA v3),对评论提交做评分;② 检查评论字段是否含大量外链(正则匹配 https?://),含链评论进入审核队列;③ 对新注册账号 24 小时内禁止评论或限频;④ 接入 Akismet 等反垃圾服务;⑤ 在 WAF 中对 /wp-comments-post.php 等评论端点加 Rate Limiting 和 Bot Score 阈值。
Q6:支付接口被异常调用?
A:支付接口被刷可能涉及订单撞库、优惠券薅羊毛、支付回调伪造。处置:① 立即开启支付接口的严格 Rate Limiting(单 IP/单账号 5 次/分钟);② 校验 Referer 和 Origin 头,拒绝非本站来源;③ 对支付回调接口验签(HMAC/签名),拒绝伪造回调;④ 监控同一支付单号的查询/重试次数,超阈值告警;⑤ 对数据中心 IP 的支付请求一律挑战;⑥ 与支付渠道风控联动,共享异常 IP 列表。
12. 最佳实践清单
按优先级从高到低,给出可立即落地的 10 条建议:
- 立即在 Cloudflare 开启 Bot Fight Mode,免费获得基础 Bot 防护。
- 配置"放行已验证机器人"规则并置于所有拦截规则之前,确保搜索引擎收录不受影响。
- 对登录、注册、找回密码、支付、搜索五大端点强制 Rate Limiting,这是攻击最密集的入口。
- 对登录接口启用 Managed Challenge,对数据中心 IP 强制 CAPTCHA。
- 每日检查 Cloudflare Security Events,抽样复核被拦请求是否误伤。
- 每周用
awk/grep分析一次服务器日志,找出 Top IP/UA 和异常路径。 - 建立 IP/ASN 白名单的最小化原则,能用 IP 不用 ASN,定期清理失效条目。
- 配置 GA4 与服务器日志的双视角监控,差异超过 30% 即报警。
- 为被拦页面提供"误拦反馈"入口,收集真用户报告,闭环优化规则。
- 每季度审计一次 WAF 规则和白名单,下线过期规则,校准阈值。
13. 常见问题 FAQ
Q1:开启 Bot Fight Mode 会影响 SEO 收录吗?
不会。Cloudflare 通过反向 DNS 验证的 Googlebot/Bingbot 会被识别为 Verified Bot 自动放行,不受 Bot Fight Mode 影响。但若你自定义了拦截规则且顺序错误,可能误拦,因此"放行已验证机器人"规则必须置顶。
Q2:住宅 IP 的恶意机器人怎么防?
住宅 IP(Residential Proxy)是当前最难防的攻击形态,因为 IP 信誉正常。对策:① 重点依赖行为分析和 TLS 指纹(JA3/JA4),住宅代理背后的脚本仍有指纹特征;② 对登录等关键端点强制 CAPTCHA,不依赖 IP 信誉;③ 接入 DataDome/HUMAN 等专业服务,它们对住宅代理有专门模型。
Q3:CAPTCHA 会影响转化率吗?
传统 CAPTCHA 会显著影响转化率(10%~30% 流失),但无感验证码(Turnstile、reCAPTCHA v3)影响极小。建议:默认启用无感验证码,仅对高风险评分用户弹出交互式挑战,平衡安全与体验。
Q4:服务器日志要保留多久?
建议保留 90 天用于安全审计和合规追溯。日志压缩后单站每日约几十 MB 至几 GB,可存对象存储(S3/OSS)冷存储,成本极低。若涉及等保/PCI-DSS 合规,按法规要求保留 6 个月以上。
Q5:免费方案能做到什么程度?
免费方案(Cloudflare 免费版 + GA4 + GoAccess + 自建 WAF 规则)可拦截 70%~80% 的低中级 Bot,覆盖空 UA、工具型 UA、高频请求、数据中心 IP 等主流攻击。剩余 20%~30% 的高级攻击(住宅代理、无头浏览器、TLS 指纹伪造)需付费方案,建议业务量做大后再投入。
14. 总结与行动清单
流量治理不是一次性项目,而是持续运营。本教程覆盖了从分类、识别、工具、日志、规则到自动化监控的完整链路。请按以下时间线落地:
- 今天:开启 Cloudflare Bot Fight Mode,配置"放行已验证机器人"置顶规则。
- 本周:对登录/注册/支付端点加 Rate Limiting,用
awk跑一次日志分析。 - 本月:部署 GoAccess 实时报表,设置 GA 与日志差异告警,编写三条 WAF 规则。
- 本季度:审计 WAF 规则和白名单,配置 Cloudflare Worker 自动限速,评估专业 Bot 服务。
- 长期:建立每周日志审计、每月规则调优、每季度基线校准的常态化机制,让流量治理自运转。
记住核心原则:先识别后处置,先放行有益再打击恶意,先日志后规则,先灰度后全量。 持续观察、持续调优,你的网站就能在 50% 机器人流量的洪流中守住真实用户的价值。
「织码间」主理人:用代码构建世界,期待与你同频共振。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)