为什么同一域名返回不同 IP
汇总同一域名在不同环境返回不同 IP 的全部来源:多地址/GeoDNS/ECS/Split DNS/CDN 调度/Anycast/缓存差异/过滤劫持污染,并给出「权威层 vs 递归/缓存/网络层」的归因框架。
#type / synthesis
#status / growing
#tech / network
#protocol / dns
[!info] related notes
- 所属 MOC: DNS 知识地图
- 调度类: GeoDNS / ECS / Split DNS / CDN 调度
- 路由类: Anycast vs GeoDNS
- 链路类: 缓存链 / 过滤劫持污染
- 排障: 系统化 DNS 诊断流程
为什么同一域名返回不同 IP
覆盖范围与排除项
本文汇总「同一个域名在不同机器/网络下解析到不同 IP」的所有常见来源,并给出一个归因框架,帮助判断差异发生在权威层还是递归/缓存/网络层。不展开每个机制的细节(见各原子笔记)。
为什么需要一起理解
看到「我这里 104.17.x.x、朋友那里 155.102.x.x」时,差异可能来自完全不同的环节。若不分清,就会误把「缓存旧了」当成「权威分流」,或反过来。逐源理解才能精准排障。
依赖与协作模型
按「差异发生在哪一层」归类:
1. 权威侧主动返回不同(正常调度)
- 多地址:权威返回多个 IP,客户端/负载均衡选择(见 dns-record-a-aaaa)
- GeoDNS:按查询来源(多为递归解析器 IP)返回就近答案(见 geodns)
- ECS:递归携带客户端子网,让权威更精准(见 edns-client-subnet-ecs)
- Split DNS:按来源返回不同语义答案(见 split-dns)
- CDN 调度:按地理/运营商/健康/负载选边缘(见 cdn-dns-scheduling)
2. 路由层选择(同一 IP)
- Anycast:同一 IP 由 BGP 分流到不同物理节点(见 anycast-vs-geodns)
3. 递归/缓存/网络层差异
- 缓存差异:两解析器处于不同缓存状态,短时间结果不同(见 dns-caching-hierarchy、dns-serve-stale)
- 过滤/劫持/污染:ISP、路由、企业、代理、恶意设备改写答案或透明重定向 53(见 dns-filtering-hijacking-pollution)
一条具体归因路径
判断「是权威分流还是本地链路问题」:
# 直接从权威查(绕过递归缓存)
dig @ns1.example-dns.com anyrouter.top A +norecurse
dig @ns2.example-dns.com anyrouter.top A +norecurse
# 完整委派链
dig +trace anyrouter.top A
- 权威直接回答就不同 → GeoDNS / 来源分流 / Anycast 实例差异 / 权威策略
- 权威相同、递归不同 → 递归缓存 / 过滤 / ECS / 劫持 / 旧 CNAME 缓存 / 转发链差异
决策规则与易混淆点
- 不要默认「一定是权威按 ASN 分流」——也可能是本地递归/DoH/缓存/劫持(见 dns-wrong-ip-tls-handshake-failure-debug)。
- 「Oracle2 拿到源站」不代表「权威识别了 Oracle2 的 IP」——可能识别的是 Oracle 云递归 DNS 或该区域 Anycast(见 geodns)。
- 同一公共 DNS 对不同客户端返回不同结果,常是 ECS 或 Split 的副作用,不是 bug。
- 排障顺序:先本地(系统/浏览器/代理)→ 再指定公共 DNS → 再直连权威,逐层隔离(见 dns-systematic-diagnosis)。