一句话:不靠「打不开」下结论,靠对照实验下结论。 每一层都设计成「同一条件下换一个变量」,差异出现在哪一层,问题就在哪一层。 因为这四种情况的处置方式完全不同——换 IP 只对其中一种有用。
域名在境内打不开,可能是四种完全不同的原因。它们的表象很像,但处置方式南辕北辙:
| 原因 | 发生在 | 换 IP 有用吗 | 换域名有用吗 |
|---|---|---|---|
| DNS 污染 | 解析阶段 | 无关 | 有用 |
| SNI 阻断 | TLS 握手 | 无用 | 有用 |
| Host 阻断 | HTTP 请求 | 无用 | 有用 |
| IP 封锁 | TCP 连接 | 有用 | 无用 |
单点测量说明不了任何问题——「连不上」既可能是被墙,也可能是网络抖动、源站故障、 本地 DNS 有问题。所以每一层都做成对的实验:其它条件完全相同,只换一个变量, 看结果是否分叉。
openssl s_client -connect 203.0.113.10:443
-servername 你的域名
openssl s_client -connect 203.0.113.10:443
-servername www.microsoft.com
同一个 IP、同一个端口、同一时刻,只有 SNI 不同。对照组能通说明 IP 是活的、 链路是通的、源站在跑;那么实验组失败就只可能是因为「这个域名」—— 即 SNI 关键字阻断。这个结论是排除法得来的,不是猜的。
dig 你的域名 @1.2.3.4
# 该地址不提供 DNS 服务
dig www.qq.com @1.2.3.4
# 同一个不存在的服务器
向一个不运行 DNS 服务的地址发查询,本该石沉大海。真实域名却收到了应答, 说明有中间设备在抢答。对照组用来排除「本地网络有透明 DNS 劫持」—— 企业网、酒店、部分家宽都会劫持所有 DNS 流量,那种情况下对照组同样会收到应答, 此项判定就失效并自动降级到 TCP:53 / DoH 取真值。
封锁策略是按省份 + 运营商下发的,不是全国一刀切。单节点探测的结论只对那个节点成立。 下面是实测数据里的真实一幕:
| 省份 / 运营商 | 网络 | 判定 | 说明 |
|---|---|---|---|
| 广东 电信 | 固网 | 正常 | 机房节点看到的世界 |
| 广东 移动 | 蜂窝 | SNI 阻断 | 真实用户看到的世界 |
| 广东 联通 | 蜂窝 | SNI 阻断 | |
| 浙江 移动 | 蜂窝 | SNI 阻断 |
还有一个节点是必需的:境外对照节点。境内节点无法区分 「IP 被封」和「源站自己挂了」——两者表现完全一样。有境外节点对比才能定性: 境外通 = IP 被封(换 IP 有效);境外也不通 = 源站故障(换 IP 没用,去修服务器)。
| 判定 | 含义 | 该做什么 |
|---|---|---|
| OK | 各节点均可达 | 无需处置 |
| DNS_POISONED | 仅解析被污染,链路还通 | 客户端指定真实 IP 可绕过;但浏览器用户覆盖不到,仍需准备备用域名 |
| HTTP_HOST_BLOCKED | 明文 Host 被阻断 | 强制全站 HTTPS 可续命,通常是域名级封锁的前兆 |
| SNI_BLOCKED | 域名已进黑名单 | 从入口池摘除,启用备用域名。换 IP、换 CDN、DNS 智能解析全部无效 |
| IP_BLOCKED_OR_DOWN | IP 层不通 | 看境外节点结果:被封则换 IP 段;源站故障则去修服务器 |
说清楚它不能做什么,比夸大它能做什么更有用:
| 局限 | 原因 | 缓解 |
|---|---|---|
| 无法区分 IP 被封 / 源站故障 | 境内视角下两者表现相同 | 部署境外对照节点 |
| 概率性阻断可能漏报 | GFW 并非每次都拦 | --rounds 多次采样,任一次 RST 即判阻断 |
| 节点所在机房不代表全省 | 同省不同城市策略可能不同 | 关键省份多点部署 |
| 透明 DNS 劫持环境下黑洞探测失效 | 本地设备抢答所有 DNS | 自动检测并降级到 TCP:53 / DoH |
| 无法预测何时被墙 | 这是监控,不是预警 | 保持备用域名储备,缩短探测周期 |