当 DNS 返回 2001::1:一次"网页打不开"的三层排查实录
现象
某天凌晨,服务器上一段抓取脚本报错超时,目标是一个 *.workers.dev 域名。同一域名在手机流量下秒开,服务器上却怎么都打不通——TCP 连不上,TLS 握手都进不去。这台服务器常年挂代理出站,理论上不该有"打不开"的问题。
第一层:先确认是不是 DNS 的问题
拿到"打不开"三个字,先别动代理配置,用 dig 看解析结果:
$ dig AAAA xxx.workers.dev +short
2001::1
2001::1 是一个很典型的哨兵地址。它属于 IETF 保留的协议分配段,正常业务绝不会用它。国内部分网络环境下,被污染的域名会收到这类固定假记录——类似的还有 face:b00c::(Facebook 段)之类的哨兵。看到它,基本可以断定问题出在解析层,而不是路由层。
第二层:用真实地址验证链路
怀疑 DNS 之后,验证方法很简单:跳过解析,直接指定真实 IP 访问。
先用 DoH 拿干净记录:
$ curl -s 'https://1.1.1.1/dns-query?name=xxx.workers.dev&type=AAAA' -H 'accept: application/dns-json'
然后 curl --resolve 强行绑定:
$ curl -v --resolve xxx.workers.dev:443:<真实IPv6> https://xxx.workers.dev/
能通,说明链路和证书都正常,问题确实只在"本地解析"这一层。
第三层:修了 DNS 还是打不开?检查本机的安全层
这是这次排查里最坑的一步:把代理出站配好后(本机跑 mihomo,全局走代理),访问依然失败。抓包看,请求根本没出去——被本机一个带"私有地址校验"的组件拦了。
原因在于:2001::1 属于保留段,198.18.0.0/16 是 mihomo fake-ip 模式的默认网段,这两类地址在严格的"内网/保留地址检查"里都会被当成私有地址拒绝。也就是说,安全组件把哨兵地址和 fake-ip 段当成了内网地址,于是所有命中它们的请求都被静默拦截。
解决办法是把这些哨兵段显式加进信任/白名单(以我的场景为例,在安全组件的配置里加了 2001::1/128 和 198.18.0.0/16),让它不再按私有地址处理。
复盘清单
遇到"服务器打不开、手机正常",按这三层走一遍,基本不会迷路:
- 看解析:
dig AAAA出现2001::1、face:b00c::这类哨兵地址 → DNS 污染,别查路由。 - 验链路:DoH 拿真实 IP +
curl --resolve,通了就确认只剩解析问题。 - 查本机:代理修好还失败时,检查有没有本地安全层在做"私有地址校验"——
2001::1、198.18.0.0/16(fake-ip 段)都要放行。
最后一点体会:DNS 污染的表象是"网络不通",但根因常常叠了两层——上游污染是一层,本机防御策略误伤是另一层。只修第一层的人会觉得"问题反复",把两层都看见,才算真正闭环。
- 点赞
- 收藏
- 关注作者
评论(0)