让 CoreDash bot 顺利通过 CDN 或防火墙

防火墙或 CDN 设置有时会拦截 CoreDash bot。本文介绍具体的解决方法。

Trusted by market leaders · Client results

nestlewhowhatwearvpnebaymonarchkpnsnvworkivacomparenina careharvarddpg mediasaturnloopearplugsmy work featured on web.devperionhappyhorizonmarktplaatsadevintaaleteiafotocasaerasmusmc

在 CDN 或防火墙中放行两个 CoreDash bot

速览

  • 两个 CoreDash bot 的 user agent 均以 CoreDash/ 开头,只需一条针对该前缀的规则,就能同时放行 cRUM audit 和 uptime check。
  • 基于项目的 bot token 配置规则更为安全。
  • Cloudflare Free 计划中的 Bot Fight Mode 会忽略自定义规则,需要单独处理。

CoreDash 会通过两个 bot 访问你的网站:cRUM audit 和 uptime check。要充分发挥 CoreDash 的作用,CDN 或防火墙必须同时放行这两者。有时某些防护设置会拦截它们。本文介绍如何在 Cloudflare 和 AWS WAF 中配置一条规则,同时放行这两个 bot。

这两个 bot 各自的作用:

  • cRUM audit。 在 CoreDash 菜单的 cRUM (beta) 下选择页面后,CoreDash 会像普通访客一样,在其 audit 服务器的 Chrome 中加载该页面,并指出拖慢速度的具体原因。它的 user agent 是 CoreDash/1.0 (audit; +https://www.coredash.app/bot)。
  • uptime check。 CoreDash 每 30 分钟从自身服务器请求一次受监控的站点,并在站点宕机时发出通知。其发送的 user agent 为 CoreDash/1.0 (uptime; +https://www.coredash.app/bot)。

user agent 是浏览器或 bot 在每次请求时附带的自身身份标识。CoreDash 的两个 bot 均以 CoreDash/ 开头,规则只需匹配该前缀即可。

audit 或 uptime check 被拦截时的表现

防火墙或 CDN 检测到来自数据中心的访问,且 user agent 并非普通浏览器,就会将其判定为不可信 bot,并返回错误码或质询页面。两个 bot 对此的表现各有不同。

若 cRUM audit 被拦截,任务会直接终止并提示“Audit failed”,下方附带具体错误。另一种情况是 audit 照常运行,但测试的其实是拦截页:此时 Page load filmstrip 中显示的不是你的页面,而是质询或错误页,审计报告里的所有数值也全部属于该拦截页。

uptime 监控的状态会显示为 Blocked,其提示“A firewall blocks the checker”会列出检查收到的状态码以及拦截开始的时间。CoreDash 不会将受阻的检查计入停机时间,因此拦截不会拉低可用率数值。但在所有检查都被拦截的情况下,请求根本无法触达你的站点,监控也就无法在站点真正发生故障时发出通知。

example-shop.com 的 CoreDash uptime 监控显示 Blocked:自 10 月 17 日起每次检查均收到 Cloudflare 返回的 403,附带指向本页及 bot token 的链接

当 Cloudflare 对每次 uptime check 均返回 403 时,example-shop.com 的监控页面。

防火墙如何识别 CoreDash

你只需在防火墙或 CDN 中为 CoreDash 添加一条例外规则,最常见的做法是匹配 user agent:一条针对 CoreDash/ 的规则即可同时放行 audit 和 uptime check。使用项目的 bot token 则更为严密,因为只有你自有项目的 bot 才会携带该 token。基于 CoreDash IP 地址放行仅作为兜底手段:当 CoreDash 增加或迁移服务器时 IP 就会变动,你必须自行手动维护 IP 规则。

具体需要为哪项设置添加例外,可查看防火墙日志。下一节会介绍 Cloudflare 日志的查看方式。如果使用 AWS WAF,请直接跳到下方的“在 AWS WAF 中放行 CoreDash(置于 Bot Control 之上)”一节。

排查 Cloudflare 中拦截 CoreDash 的功能

在 Cloudflare 中进入对应域名,前往 Security › Analytics,切换到 Events 标签页。在 Sampled logs 下,找到带有 CoreDash user agent 的请求。如果是高流量站点,点击 Filter,将字段选为 User agent,并填入完整的 user agent 值:uptime check 填入 CoreDash/1.0 (uptime; +https://www.coredash.app/bot),audit 填入 CoreDash/1.0 (audit; +https://www.coredash.app/bot)。

点击该请求展开详情。Service 一行标明了具体拦截它的 Cloudflare 功能。

www.example-shop.com 的 Cloudflare Security Events:带有 CoreDash uptime user agent 的请求,Action 为 Block,Service 为 Browser integrity check

在 example-shop.com 上,Browser Integrity Check 拦截了此次 uptime check。

Service 行的内容决定了对应的解决方式:

  • Bot fight mode:这是 Cloudflare Free 计划的 bot 防护功能,自定义规则无法对其配置例外。请直接跳到下文关于 Bot Fight Mode 的章节。
  • 其他任何功能(如截图中的 Browser integrity check、托管规则或 Super Bot Fight Mode):按下方步骤创建一条 Skip 规则即可。

在 Cloudflare 中配置 Skip 规则放行 CoreDash

Skip 规则会指示 Cloudflare 对携带 CoreDash user agent 的请求跳过指定的功能检查。该规则能同时覆盖 audit 和 uptime check,且适用于 Cloudflare 的所有计划。

  1. 前往 Security › Security rules。在 Custom rules 下,点击 Create rule。
example-shop.com 的 Cloudflare Security rules 页面,包含空白的 Custom rules 区域及 Create rule 按钮

创建第一条自定义规则前的 example-shop.com Security rules 页面。

  1. 将规则命名为 CoreDash。在“When incoming requests match”下方,点击“Edit expression”,在打开的文本框中粘贴以下内容:
    http.user_agent contains "CoreDash/"
名为 CoreDash 的 Cloudflare 新建自定义规则,表达式为 http.user_agent contains "CoreDash/"

点击“Edit expression”后的规则名称与表达式。CoreDash 后面的斜杠必须保留。

  1. 在“Then take action”下选择 Skip,并选择 Cloudflare 对 CoreDash 跳过的检查项目。在“WAF components to skip”中,勾选“All managed rules”和“All Super Bot Fight Mode Rules”。点击展开“More components to skip”,同样勾选“Browser Integrity Check”。保持“Log matching requests”开启,以便后续在 Events 中查看规则生效记录。
操作设为 Skip 的 Cloudflare 自定义规则,已勾选 All managed rules、All Super Bot Fight Mode Rules 和 Browser Integrity Check

操作选择 Skip,并勾选上述三个选项。

  1. 点击 Deploy。如果域名下已有其他自定义规则,Cloudflare 会询问放置顺序:将其排在首位。
Cloudflare 自定义规则表单底部:状态为 Active,规则验证通过,Deploy 按钮

若此前没有其他自定义规则,无需调整顺序,直接点击 Deploy 即可。

  1. 确认 CoreDash 已成功放行。下一次 audit 或 uptime check 到达后,Cloudflare 的 Events 会记录该请求,操作显示为 Skip。在 CoreDash 中检查你使用的 bot(或两者都查)。

针对 cRUM audit:在 cRUM (beta) 下重新选择该页面,或者刷新打开该页面的浏览器标签页,即可触发新的 audit。一旦成功放行,Page load filmstrip 就会逐帧展示真实页面在 Chrome 中的加载过程。

CoreDash cRUM audit 的 Page load filmstrip 卡片:页面在 5 秒内逐帧加载,标有 TTFB、DCL、Load、FCP、LCP 和 CLS 关键节点

完成的 audit,帧图上标有 TTFB、FCP、LCP 和 CLS。

uptime check 无需手动操作:CoreDash 会在整点和半点自动检查,因此在 30 分钟内监控状态就会恢复为 Up,新的柱状条也会变绿。

example-shop.com 的 CoreDash uptime 监控恢复为 Up:Cloudflare 以 403 拦截检查期间为黄色柱状条,规则生效后变为绿色

example-shop.com 已恢复 Up 状态:此前有 38 次检查返回 403,规则生效后的每次检查均返回 200。

使用 CoreDash bot token 配置更安全的 Cloudflare 规则

任何人都可以伪造以 CoreDash/ 开头的 user agent,因此冒充 CoreDash 的恶意 bot 也能穿透 Skip 规则。项目的 bot token 是一串私密凭证:每次 audit 和 uptime check 都会在名为 X-CoreDash-Bot 的请求头中附带它。基于该 token 配置的规则只会放行你自有项目的 bot。

获取方式:在 CoreDash 中打开 Project settings,进入“CoreDash bot token”标签页(仅项目所有者有权访问)。如果监控状态为 Blocked,通知中的“View your CoreDash bot token”链接也能直接跳转过去。点击“Copy Cloudflare rule”,即可复制包含你专属 token 的完整表达式。

Example Shop 的 Project settings 页面 CoreDash bot token:token 已隐藏,带有 Show、Copy token 和 Copy Cloudflare rule 按钮

点击“Copy Cloudflare rule”会将包含 token 的表达式复制到剪贴板。

如果你之前已创建了 Skip 规则,进入 Security › Security rules 打开该 CoreDash 规则。将表达式中的 user agent 那一行替换为刚才复制的内容并保存。操作和已勾选的选项保持不变。如果尚未创建规则,按照上述 Skip 规则的步骤操作,在第 2 步中直接粘贴 token 表达式即可。

该 token 仅会发送给你项目自有的站点及其子域名。如果监控或 audit 的是其他域名的页面,请求中不会包含 token,因此那些域名仍需保留 user agent 规则。如果 token 不慎泄露,点击“Make a new token”即可。旧 token 会立即失效,生成后需尽快将新 token 更新到 Cloudflare 规则中。

Cloudflare Free 计划中的 Bot Fight Mode

如果 Events 中的 Service 一行显示为 Bot fight mode,请参考本节内容。

www.example-shop.com 的 Cloudflare Security Events:带有 CoreDash uptime user agent 的请求,Action 为 Managed Challenge,Service 为 Bot fight mode

一次 CoreDash uptime check,Action 显示为 Managed Challenge,Service 为 Bot fight mode。

Bot Fight Mode 会对运行在云服务器上的简易 bot 发起质询,而在 Cloudflare 看来,CoreDash 的两个 bot 正属于此类。Cloudflare 官方文档指出,Skip 和 Allow 规则对其无效。因此处理方式只有两种:要么将其关闭,要么保持开启并放行 CoreDash 的 IP 地址。

关闭 Bot Fight Mode

前往 Security › Settings,按 Bot traffic 筛选。找到“Bot fight mode”所在行并关闭其开关。Cloudflare 随后将停止对全站此类简易 bot 发起质询。如果你仍希望保留这种防护,Pro 计划提供了 Super Bot Fight Mode,该功能支持 Skip 规则。关闭开关后,同样需要按照上文创建 Skip 规则,以免 CoreDash 随后被 Browser Integrity Check 或托管规则拦截。

按 Bot traffic 筛选后的 Cloudflare Security Settings,展示 Bot fight mode 所在行及其开关

Bot fight mode 的开关位于 Status 列中。截图中已处于关闭状态。

保持 Bot Fight Mode 开启并放行 CoreDash 的 IP 地址

开始之前请注意:这些地址并非固定不变。你填写的 IP access rules 是静态的,而最新的地址列表始终维护在 app.coredash.app/bot/ips.json。如果日后 CoreDash 再次被拦截,请先对照该列表核对你的规则。

IP access rule 允许特定 IP 地址绕过防火墙规则;一旦请求优先匹配了此类规则,Bot Fight Mode 就不会对其进行质询。前往 Security › Security rules,在 IP access rules 下点击 Create rule。如果 Cloudflare 建议将其创建为自定义规则,选择“No, go to IP access rules”。输入 51.195.222.219,操作选择 Allow,范围选择“This website”,点击 Create。每个地址创建一条规则:uptime check 对应 51.195.222.219 和 51.195.222.220,cRUM audit 对应 135.125.202.210。

新建 Cloudflare IP access rule,针对本网站放行 CoreDash uptime 地址 51.195.222.219

每个 CoreDash 地址配置一条 IP access rule,针对当前网站(This website)设为 Allow。

完成任一修复后,按照 Skip 规则第 5 步的方法,验证 CoreDash 是否能正常通行。

在 AWS WAF 中放行 CoreDash(置于 Bot Control 之上)

在 AWS WAF 中,拦截 CoreDash 的通常是 Bot Control(AWS 提供的防 bot 托管规则组)。解决方法是为 CoreDash user agent 配置一条 Allow 规则并将其置于 Bot Control 之上,单凭这一条规则就能同时放行 audit 和 uptime check。此处的 AWS 截图来自专为本文搭建的 acme-aws.com 演示环境。

  1. 在 AWS WAF 控制台中,打开站点的 web ACL(保护站点的规则集),进入 Sampled requests 标签页。点击某条请求的 URI 查看其请求头:CoreDash 请求的 user agent 以 CoreDash/ 开头。“Rule inside rule group”一列标明了拦截它的具体规则。
acme-aws.com 演示环境中的 AWS WAF Sampled requests:CoreDash 检查被 Bot Control 规则 SignalNonBrowserUserAgent 拦截

Bot Control 规则 SignalNonBrowserUserAgent 拦截了 acme-aws.com 上的 CoreDash uptime check。

  1. 在 web ACL 页面中,点击 Add rules › “Add my own rules and rule groups”打开 Rule builder(新版 AWS 控制台中称为 Custom rule)。参照截图填写:创建名为 CoreDash 的常规规则(Regular rule),检查 user-agent 请求头,并 Allow 所有以 CoreDash/ 开头的请求。然后向下滚动表单并点击“Add rule”。
演示环境中的 AWS WAF Rule builder:规则名为 CoreDash,Single header 为 user-agent 且以 CoreDash/ 开头,操作为 Allow

CoreDash 规则:Single header 为 user-agent,Starts with string CoreDash/,操作为 Allow。

  1. AWS 随后会打开“Set rule priority”。选中 CoreDash,点击“Move up”直至其排在最顶端,然后点击 Save。AWS 自上而下执行规则,匹配到 Allow 规则的请求不会继续向下匹配,因此 Bot Control 根本不会处理 CoreDash 请求。
演示环境中的 AWS WAF Set rule priority:操作为 Allow 的 CoreDash 排在最顶端,位于 Bot Control 规则组上方

CoreDash 置顶,位于 Bot Control 规则组上方。

  1. 验证 CoreDash 是否已顺利放行。在 Sampled requests 中,最新的 CoreDash 请求现在应该显示匹配了 CoreDash 规则,操作为 Allow。
acme-aws.com 演示环境中的 AWS WAF Sampled requests:CoreDash 检查现已匹配 CoreDash 规则,操作为 Allow

acme-aws.com 上最新的 CoreDash 检查已命中 CoreDash 规则并成功放行。

在 CoreDash 中,按照 Cloudflare Skip 规则第 5 步的方法检查你使用的 bot:发起新 audit 后,Page load filmstrip 会展示你的真实页面;下一次 uptime check 之后,监控状态也会恢复为 Up。

与 Cloudflare 一样,使用项目的 bot token 能让该规则更加安全。具体原理及哪些站点会附带 token,参见上文关于 Cloudflare token 的部分。若要将 AWS 规则切换为基于 token 匹配:

  1. 在 CoreDash 中打开 Project settings,进入“CoreDash bot token”标签页,点击“Copy token”。
  2. 在 AWS WAF 中,重新打开 web ACL 下的 CoreDash 规则(即上方 Rule builder 截图中的表单)。
  3. 将请求头字段名称从 user-agent 改为 x-coredash-bot。AWS 读取请求头时不区分大小写,因此它指的就是 X-CoreDash-Bot 请求头。
  4. 将匹配类型设为“Exactly matches string”,将你的 token 作为匹配字符串粘贴进去,然后保存规则。

CDN 后方的源站检查超时

本节仅针对 uptime check,且仅适用于在配置监控时于 Advanced 下填写了 Origin IP 的情况。配置后,CoreDash 会绕过 CDN 直接检查你的服务器。某些服务器只接受来自 CDN 自身地址的请求。此时监控会变为 Down 并提示“The origin check fails: Connect timeout”,而普通访客却仍能正常从 CDN 获取页面。

example-shop.com 的 CoreDash 监控显示 Down:CDN 仍在提供缓存页面,而源站检查出现连接超时

CDN 仍在正常响应缓存页面,但针对服务器本身的检查发生了超时。

基于 user agent 或 token 的规则对此无济于事:这类服务器在读取任何请求头之前,就已经直接根据来源丢弃了请求。因此,必须通过 IP 地址让服务器识别 CoreDash。请在服务器防火墙中放行两个 uptime 地址:51.195.222.219 和 51.195.222.220,或联系主机提供商处理。如果后续源站检查再次发生超时,请先查看最新地址列表:IP 地址可能有所变动。

CoreDash 依然被拦截

如果监控依然显示 Blocked 或 audit 仍旧报错,请重新打开日志并点击最新的 CoreDash 请求:Cloudflare 查看 Events,AWS 查看 Sampled requests。其中记录的名称就是当前拦截 CoreDash 的功能。常见原因如下:

  • 拦截功能与之前不同。例如关闭 Bot Fight Mode 后,请求转而被 Browser integrity check 拦截。此时同样需要配置 Skip 规则。
  • 规则未激活,或在 AWS 中未置顶。在 Cloudflare 中,Custom rules 下的 CoreDash 规则状态应为 Active;AWS 则要求将其排在“Set rule priority”的最上方。
  • 规则内容与步骤要求不一致。Cloudflare 要求使用 contains 且 CoreDash/ 必须带有末尾斜杠;AWS 要求检查请求头 user-agent,且匹配方式为“Starts with string”。
  • 被你自建的其他 Cloudflare 规则拦截(例如拦截特定国家/地区的规则)。Skip 规则不会跳过自定义规则,因此需要修改该规则将 CoreDash 排除在外。Events 中会标明请求来自哪个国家或地区。
  • 开启了 Under Attack Mode。该模式会质询包括 CoreDash 在内的所有访客,直到你将其关闭。
  • 请求显示放行,或者日志中根本没有 CoreDash 请求。这说明在 Cloudflare 或 AWS 前后还存在其他防火墙,例如主机商的防火墙或服务器本身的规则。请在相应层级同样放行 CoreDash/ user agent。

问题仍未解决?联系 CoreDash,并附上监控或受测页面的 URL 以及被拦截的时间。

关于两个 bot 发送的具体内容及设计原理,可参阅 CoreDash bot 详情页。了解更多监控相关内容:uptime 监控,脚本调用可参考 Uptime API。

让 CoreDash bot 顺利通过 Cloudflare 和 AWS WAF Core Web Vitals 让 CoreDash bot 顺利通过 Cloudflare 和 AWS WAF