同最近遇到这个问题,排查了一下感觉可能是 Google 的权威 DNS 解析器的锅,似乎 Google 的 DNS 服务器对阿里云和中国移动的配置存在错误的“特殊关照”🤔
===
排查思路&流程:
1. 众所周知权威 DNS 解析器一般通过递归解析器的出口 IP / EDNS Client Subnet 判断访客地理位置,于是我们可以找一个 dnslog 服务来抓一下阿里云递归解析器的出口 IP 。用 itdog 的拨测工具查询一下随机分配的域名,可以抓到以下 IP:
2. 这个 dnslog 似乎不能翻页(),就拿图中测试发现有问题的山西太原移动为例
用它的 183.201.217.0/24 作为 Client Subnet ,用国内移动的网络对
ns1.google.com 直接发起查询:
dig @
ns1.google.com
connectivitycheck.gstatic.com A +subnet=183.201.217.0/24 +norec
ns1.google.com 返回了美国 Google 的 142 开头的 IP 。这样直接请求的过程完全没经过阿里的服务器处理,暂时可以排除 alidns 的嫌疑了。
3. 起一个 Cloudshell 从阿里云的服务器上请求一次,还是同样的结果。
但是把 EDNS 里的客户端子网换成一个“干净的 IP 段”就能得到正确响应,例如我们这里用
sx.10086.cn 的 IP 地址试一下,可以看到 Google 返回了国内的 CDN:
dig @
ns1.google.com
connectivitycheck.gstatic.com A +subnet=183.203.36.0/24 +norec
(其它国内 IP 也行,哪怕 1.14.5.14/32 也可以
( dig @
ns1.google.com
connectivitycheck.gstatic.com A +subnet=1.14.5.14/32 +norec
4. 更神奇的来了,在腾讯云上请求
ns1.google.com 时,即使 EDNS Client Subnet 里填写“不干净的 IP”也能得到正确结果(这里换成电信/联通应该也可以,实测联通没问题):
=====
总结:
- 对于此类有国内 CDN 加速的 Google 服务,Google 的权威 DNS 服务器在遇到“阿里 DNS 查询上游所用的部分中国移动出口 IP 地址”时,会错误地返回国际 CDN IP 。
- 在内地使用腾讯云/中国联通/中国电信的 IP 或网络对 Google 的 DNS 服务器发起查询似乎不受影响。
- 该问题理论上与劫持无关,因为使用海外测试服务器可以得到与境内阿里云/中国移动类似的结果。
======
解决方法:
如果要继续使用阿里 DNS ,可以对客户端进行配置,为 AliDNS 配置一个 EDNS Client Subnet (阿里的公共递归 DNS 会转发 Client Subnet )。
mihomo 的配置方法见如下文档:
https://wiki.metacubex.one/config/dns/#_1sing-box 的配置方法见如下文档:
https://sing-box.sagernet.org/migration/#__tabbed_1_13https://sing-box.sagernet.org/zh/configuration/dns/rule_action/#client_subnet(若要兼顾就近 CDN 调度与隐私,EDNS Client Subnet 的值一般可以随便填写一个同市/省会的 IP