CF Tunnel 优选笔记

§4 自建优选:从域名解析到逐 IP 实测

状态:已可用。脚本已实测跑通(E-06),全部判据来自本机实测。

4.1 方法:为什么不能相信"优选域名",而要自己测

社区做法是直接把自己的域名 CNAME 到别人维护的"优选域名"。问题在于你完全不知道那个域名此刻解析出什么——实测(E-06/E-07)三种翻车方式:

  1. 解析出的 IP 里混着受限 IP 空间的地址(HTTP 403 + error code: 1034
  2. 解析结果随时间漂移,昨天的"最快"今天可能是最慢
  3. 同一个 IP 的成败本身有随机性(E-08)

所以正确姿势是:把候选域名当"IP 来源"而不是"答案",自己实测

流程只有三步:

候选域名 ──dig A──> IP 列表 ──curl --resolve(用你的目标域名)──> 成功率 + colo + TTFB ──> 选出 IP

4.2 脚本:scripts/cf-optip-scan.sh

脚本在 touch-cf-tutorial/scripts/cf-optip-scan.sh。三个最关键实现点,对应三个实测踩过的坑:

坑一:只取 A 记录

dig +short A "$d" 2>/dev/null \
  | awk '$0 ~ /^([0-9]{1,3}\.){3}[0-9]{1,3}$/'

dig +short 会把 CNAME 目标主机名混进输出(实测 cf.877774.xyz 首行是 cmcc.877774.xyz.,E-03)。直接拿去用会得到 connect=0 的假失败样本。必须用正则只留点分十进制。

坑二:用目标域名做 Host/SNI,而不是候选域名

curl -s --connect-timeout "$CONNECT_TIMEOUT" --max-time "$MAX_TIME" \
  -w '\n__META__ %{http_code} %{time_connect} %{time_starttransfer}' \
  --resolve "$TARGET:443:$ip" "https://$TARGET/cdn-cgi/trace"

--resolve 把目标域名强行指向候选 IP;边缘按 SNI/Host 路由到正确站点(原理见 §1.2、证据 E-01)。 一次请求同时拿到三样东西:http_code(成不成)、time_connecttime_starttransfer(多快),以及响应体里的 colo=(落点)。

坑三:必须解析错误码,不能只看"通不通"

ecode="$(printf '%s' "$body" | awk -F'error code: ' 'NF>1{split($2,a," ");print a[1];exit}')"

失败原因决定了这个 IP 是"暂时抖动"还是"根本不该用"——见 4.3 的判据表。

4.3 判据:怎么读结果

现象含义处置
200,有 colo可用参与排序
403 + error code: 1034受限 IP 空间(BYOIP / 专用 IP 等,非授权账户不可用)剔除,别浪费时间重试
403 + error code: 1003Direct IP access not allowed(探测方式 / Host 不对)检查前提:目标是橙云记录吗
000(超时/连接失败)链路不通或被阻断按成功率剔除;成功率低的别用
525(出现在根路径而非 trace 路径)边缘连上了源站但回源 TLS 失败这是源站问题,不是优选问题(E-05)

排序口径(E-06 实测教训):

4.4 用法

cd touch-cf-tutorial
TARGET=www.example.com bash scripts/cf-optip-scan.sh          # 基本用法
TARGET=www.example.com SAMPLES=5 PARALLEL=8 bash scripts/cf-optip-scan.sh
DOMAINS="saas.sin.fan icook.hk" TARGET=www.example.com bash scripts/cf-optip-scan.sh

选出 IP 之后的落地方式(下一章 §5 展开):

4.5 常见错误清单

错误做法后果正确做法
ping 或只测 TCP 握手会把 403/1034 的受限 IP 选进来测 HTTPS 状态码 + 错误码
单次采样就下结论被随机抖动误导多次采样 + 看成功率
按平均 TTFB 排序好 IP 被抖动埋掉用最快值 / 中位数
直接信"优选域名"给的 IP混入受限 IP / 漂移自己解析 + 自己实测
灰云记录做优选完全不生效(DNS 直接返回源站 IP)先用 §0.2 的方法确认是橙云
选了 IP 就长期不重跑半年后线路全变定期重跑,脚本可挂定时任务

4.6 落地方式之二:本地 DNS 优选(不改生产 DNS)

hosts 之外还有一条更“像系统配置”的路子:用本地 DNS(如 smartdns)做优选——社区提出该方案时明确的前置条件是“本地要有测速服务”(M-025)。

方式改动位置优点缺点
hosts本机静态表最简单、随时可撤只对本机生效;IP 变更要手改
本地 DNS 优选本地解析器(如 smartdns)+ 测速对内网多设备生效;可自动更新结果需要额外服务;解析器自身成为单点
生产 DNS 优选CF 面板记录对全部用户生效见 §5 的全部风险

这也解释了社区那句“能不能用优选 IP 也不太清楚,需要本地有 smartdns 这类测速服务才好用”(M-025 #103)——优选不是“填个 IP”,而是“要有人持续测”

4.7 候选优选域名:只保留方法,不背书时效

本教程列出过的候选域名(如 saas.sin.fanicook.hk 等,M-001 的 15 个)只作为“域名型优选”的例子