§4 自建优选:从域名解析到逐 IP 实测
状态:已可用。脚本已实测跑通(E-06),全部判据来自本机实测。
4.1 方法:为什么不能相信"优选域名",而要自己测
社区做法是直接把自己的域名 CNAME 到别人维护的"优选域名"。问题在于你完全不知道那个域名此刻解析出什么——实测(E-06/E-07)三种翻车方式:
- 解析出的 IP 里混着受限 IP 空间的地址(HTTP
403+error code: 1034) - 解析结果随时间漂移,昨天的"最快"今天可能是最慢
- 同一个 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_connect、time_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: 1003 | Direct IP access not allowed(探测方式 / Host 不对) | 检查前提:目标是橙云记录吗 |
000(超时/连接失败) | 链路不通或被阻断 | 按成功率剔除;成功率低的别用 |
525(出现在根路径而非 trace 路径) | 边缘连上了源站但回源 TLS 失败 | 这是源站问题,不是优选问题(E-05) |
排序口径(E-06 实测教训):
- 先看成功率,再看速度。成功率不是 100% 的 IP 不要放进最终清单。
- 速度用"最快 TTFB"或多次采样中位数,不要用平均值。实测
104.19.54.2平均 2.506 s、最快 0.493 s——均值被抖动污染,按均值排序会把好 IP 排到后面。 - 采样次数与环境有关:
SAMPLES建议 ≥3;大陆出口抖动大,单次结果不构成结论(E-08)。
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 展开):
- 自己的设备 / 内网调试:写
hosts - 业务域名走 SaaS 自定义主机名:把优选结果作为 CNAME 目标的选择依据
- 不要把优选 IP 写死进证书或长期 DNS 记录——IP 会失效,必须定期重跑
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.fan、icook.hk 等,M-001 的 15 个)只作为“域名型优选”的例子:
- 它们会过期、会换 IP、会失效(实测 E-06 与 20 分钟后重跑已证明可用集合变化)
- 因此稿中不标注“哪个最好”,只标注采样日期 + 当时结论 + 复核命令
- 推荐做法:把候选域名当输入源,用 §4.2 的脚本自己实测后再决定