Blocking Probe / 验证逻辑

这套东西在验证什么

一句话:不靠「打不开」下结论,靠对照实验下结论。 每一层都设计成「同一条件下换一个变量」,差异出现在哪一层,问题就在哪一层。 因为这四种情况的处置方式完全不同——换 IP 只对其中一种有用。

01

要解决的问题

域名在境内打不开,可能是四种完全不同的原因。它们的表象很像,但处置方式南辕北辙:

原因发生在换 IP 有用吗换域名有用吗
DNS 污染解析阶段无关有用
SNI 阻断TLS 握手无用有用
Host 阻断HTTP 请求无用有用
IP 封锁TCP 连接有用无用
猜错的代价很实在。把 SNI 阻断误判成 IP 封锁, 你会不停换 IP、换 CDN、加钱买高防,全部无效——因为流量在 TLS 握手阶段就被 RST 了, 根本不是 IP 的问题。反过来把 IP 封锁误判成域名被墙,则会白白丢掉一个还能用的域名。
02

核心方法:换一个变量

单点测量说明不了任何问题——「连不上」既可能是被墙,也可能是网络抖动、源站故障、 本地 DNS 有问题。所以每一层都做成对的实验:其它条件完全相同,只换一个变量, 看结果是否分叉。

实验组 · 真实域名
openssl s_client -connect 203.0.113.10:443
  -servername 你的域名
连接被 RST
对照组 · 无关域名
openssl s_client -connect 203.0.113.10:443
  -servername www.microsoft.com
握手成功

同一个 IP、同一个端口、同一时刻,只有 SNI 不同。对照组能通说明 IP 是活的、 链路是通的、源站在跑;那么实验组失败就只可能是因为「这个域名」—— 即 SNI 关键字阻断。这个结论是排除法得来的,不是猜的。

实验组 · 真实域名
dig 你的域名 @1.2.3.4
# 该地址不提供 DNS 服务
收到应答 127.0.0.1
对照组 · 必定没被墙的域名
dig www.qq.com @1.2.3.4
# 同一个不存在的服务器
无应答(超时)

向一个不运行 DNS 服务的地址发查询,本该石沉大海。真实域名却收到了应答, 说明有中间设备在抢答。对照组用来排除「本地网络有透明 DNS 劫持」—— 企业网、酒店、部分家宽都会劫持所有 DNS 流量,那种情况下对照组同样会收到应答, 此项判定就失效并自动降级到 TCP:53 / DoH 取真值。

这个对照是实测中补上的。第一版直接判「黑洞有应答 = 注入」, 在有透明 DNS 劫持的环境里 100% 误报。没有对照组,方法本身就是错的。
03

判定树

目标域名 + 真实 IP 黑洞地址抢答? 对照域名无应答 而本域名有 是 → DNS 层已污染 否 TCP 443 能连吗 timeout / RST / ok 都不通 能连 对照 SNI 通 而真实 SNI 断? 同 IP 同端口 只换 SNI DNS_POISONED 链路可能还通,继续往下测 IP_BLOCKED_OR_DOWN 需境外节点对照才能定性 是 SNI_BLOCKED 域名级,换 IP 无效 否 → 再看明文 Host HTTP_HOST 或全通 → OK 每项重复 3 次:阻断是概率性的,单次结果会误判。任意一次 RST 即判阻断(宁可误报不可漏报)。
DNS 层 域名级(换域名) IP 级(换 IP) 判定顺序不可颠倒:先排除 DNS,再排除 IP,最后才能归因到域名
04

为什么需要多节点,且要按省份 × 运营商

封锁策略是按省份 + 运营商下发的,不是全国一刀切。单节点探测的结论只对那个节点成立。 下面是实测数据里的真实一幕:

省份 / 运营商网络判定说明
广东 电信固网正常机房节点看到的世界
广东 移动蜂窝SNI 阻断真实用户看到的世界
广东 联通蜂窝SNI 阻断
浙江 移动蜂窝SNI 阻断
如果只在机房放固网节点,这个域名会一直显示「正常」, 而你的手机用户已经全线打不开了。蜂窝网络的封锁策略和固网经常不同, 而你的用户绝大多数在手机上。这就是为什么要用安卓机做拨测节点。

还有一个节点是必需的:境外对照节点。境内节点无法区分 「IP 被封」和「源站自己挂了」——两者表现完全一样。有境外节点对比才能定性: 境外通 = IP 被封(换 IP 有效);境外也不通 = 源站故障(换 IP 没用,去修服务器)。

05

结论如何变成动作

判定含义该做什么
OK各节点均可达无需处置
DNS_POISONED仅解析被污染,链路还通 客户端指定真实 IP 可绕过;但浏览器用户覆盖不到,仍需准备备用域名
HTTP_HOST_BLOCKED明文 Host 被阻断 强制全站 HTTPS 可续命,通常是域名级封锁的前兆
SNI_BLOCKED域名已进黑名单 从入口池摘除,启用备用域名。换 IP、换 CDN、DNS 智能解析全部无效
IP_BLOCKED_OR_DOWNIP 层不通 看境外节点结果:被封则换 IP 段;源站故障则去修服务器
最终产出是入口域名池:被判 blocked 的域名自动剔除, 落地页拿到的永远是当前可用的候选。但最终用哪个由客户端并发实测决定—— 中枢只提供候选,不做决策。因为中枢自己的域名也会被墙。
06

这套方法的边界

说清楚它不能做什么,比夸大它能做什么更有用:

局限原因缓解
无法区分 IP 被封 / 源站故障境内视角下两者表现相同 部署境外对照节点
概率性阻断可能漏报GFW 并非每次都拦 --rounds 多次采样,任一次 RST 即判阻断
节点所在机房不代表全省同省不同城市策略可能不同 关键省份多点部署
透明 DNS 劫持环境下黑洞探测失效本地设备抢答所有 DNS 自动检测并降级到 TCP:53 / DoH
无法预测何时被墙这是监控,不是预警 保持备用域名储备,缩短探测周期