一份面向网站站长与运维人员的深度实战教程,从流量分类、识别方法、工具横评到日志分析实战,全面覆盖真实访问、有益机器人和恶意攻击的甄别与处置。


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,并在后续请求中校验,可识别"无状态"的脚本爬虫。典型做法:

  1. 首次请求返回一段 JS,JS 计算一个 token 写入 Cookie。
  2. 后续请求需携带该 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"双重验证:

  1. 反向 DNS:对请求 IP 做 PTR 查询,得到主机名(如 crawl-66-249-66-1.googlebot.com)。
  2. 正向 DNS:对该主机名做 A/AAAA 查询,确认解析回原始 IP。
  3. 域名校验:确认主机名属于可信域(如 *.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 关键字验证域名功能是否放行
GooglebotGooglebot*.googlebot.com *.google.com搜索索引是
Bingbotbingbot*.search.msn.com搜索索引是
BaiduspiderBaiduspider*.baidu.com *.baidu.jp中文搜索是
YandexBotYandexBot*.yandex.com *.yandex.ru俄语搜索按业务
AhrefsBotAhrefsBot*.ahrefs.comSEO 外链分析按需
SemrushBotSemrushBot*.semrush.comSEO 分析按需
MJ12botMJ12bot*.mj12bot.com外链爬取可限速
UptimeRobotUptimeRobot*.uptimerobot.com可用性监控是
PingdomPingdom.com_bot_version*.pingdom.com性能监控是
ApplebotApplebot*.applebot.apple.com *.apple.comSiri/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 恶意机器人检测指标汇总

指标名检测方法阈值参考置信度
空/异常 UAUA 长度+关键字匹配长度 < 20 或命中黑名单高
请求频率滑动窗口计数> 20 req/s 或 > 600/min高
请求匀速度间隔标准差std < 50ms中高
资源加载比静态资源/HTML 请求< 0.1高
路径集中度单 IP 路径熵熵 < 1.5(仅扫少数路径)中
数据中心 IPASN 类型查询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 条建议:

  1. 立即在 Cloudflare 开启 Bot Fight Mode,免费获得基础 Bot 防护。
  2. 配置"放行已验证机器人"规则并置于所有拦截规则之前,确保搜索引擎收录不受影响。
  3. 对登录、注册、找回密码、支付、搜索五大端点强制 Rate Limiting,这是攻击最密集的入口。
  4. 对登录接口启用 Managed Challenge,对数据中心 IP 强制 CAPTCHA。
  5. 每日检查 Cloudflare Security Events,抽样复核被拦请求是否误伤。
  6. 每周用 awk/grep 分析一次服务器日志,找出 Top IP/UA 和异常路径。
  7. 建立 IP/ASN 白名单的最小化原则,能用 IP 不用 ASN,定期清理失效条目。
  8. 配置 GA4 与服务器日志的双视角监控,差异超过 30% 即报警。
  9. 为被拦页面提供"误拦反馈"入口,收集真用户报告,闭环优化规则。
  10. 每季度审计一次 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% 机器人流量的洪流中守住真实用户的价值。

「织码间」主理人:用代码构建世界,期待与你同频共振。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐