DNS记录修改后仍解析旧IP或NXDOMAIN:TTL与缓存排查指南
先固定完整查询四元组:FQDN、记录类型、DNS class 和查询时间。直接向每一台当前权威 NS 查询并比较 answer、authority、TTL、SOA serial 与 authoritative 标志;若权威不一致,先修复区发布或 secondary 同步。权威一致后,分别查询受影响用户实际使用的递归解析器,记录返回值和剩余 TTL。若返回 NXDOMAIN,读取 SOA 字段判断负缓存;若超出原 TTL 仍返回旧值,检查 Serve Stale、旧委派、转发器与本地/应用缓存。修复后等待基于证据计算的缓存期限,并用多个独立路径验证,不能靠不断刷新本机缓存证明全球恢复。
直接答案
先固定完整查询四元组:FQDN、记录类型、DNS class 和查询时间。直接向每一台当前权威 NS 查询并比较 answer、authority、TTL、SOA serial 与 authoritative 标志;若权威不一致,先修复区发布或 secondary 同步。权威一致后,分别查询受影响用户实际使用的递归解析器,记录返回值和剩余 TTL。若返回 NXDOMAIN,读取 SOA 字段判断负缓存;若超出原 TTL 仍返回旧值,检查 Serve Stale、旧委派、转发器与本地/应用缓存。修复后等待基于证据计算的缓存期限,并用多个独立路径验证,不能靠不断刷新本机缓存证明全球恢复。
一、先固定名称和记录类型
www.example.com A、example.com A、www.example.com AAAA 和 example.com MX 是不同查询。用户说“域名没更新”时,先记录实际请求的主机名、类型以及是否经过 CNAME。
注意末尾点与搜索域。命令中未使用绝对名称时,系统 resolver 可能追加本地 search suffix,查询了另一个名称。
二、DNS不是单一缓存
链路通常包括浏览器/应用、操作系统 stub resolver、本地路由器、企业转发器、公共递归解析器、父区委派和权威服务器。每层都可能保留数据或选择不同上游。
画出受影响客户端的实际 DNS 路径。DoH/DoT 浏览器可能绕过系统 DNS,VPN 可能推送企业 resolver,容器又可能使用内部缓存。
三、先查询权威服务器
从父区或 NS 查询确定当前权威服务器列表,然后直接向每一台权威 NS 请求目标 RRset。检查 AA 标志、答案、TTL 和 SOA serial。不要先从公共解析器开始猜测。
若权威之间答案不同,递归解析器随机选择 NS 时会产生间歇新旧结果。应修复 zone transfer、发布流水线、隐藏主服务器或 anycast 节点同步。
四、确认编辑的是正在使用的Zone
常见错误是修改了旧 DNS 服务商、测试账号、错误 view 或另一个同名 zone。控制台保存成功只证明某个数据库更新,不证明互联网权威在使用它。
比较父区 NS 委派、权威响应中的 SOA MNAME/serial 和供应商配置。若 split-horizon 存在,还要分别从内外网络查询视图。
五、理解TTL的真正含义
TTL 表示 RR 可被缓存的最长时间。递归解析器在记录变更前取得旧值,可以继续使用其剩余 TTL;修改新记录的 TTL 不会追溯缩短已经缓存的旧答案。
计划迁移时应提前至少一个旧 TTL 周期降低 TTL,并确认权威已生效。迁移完成稳定后再恢复正常 TTL,避免长期低 TTL 增加权威查询压力。
六、查看剩余TTL而非配置TTL
递归答案中的 TTL 通常是倒计时剩余值。连续查询同一 resolver,若值递减,说明正常缓存;归零后跳回较大值,说明它重新获取了答案。
不同 resolver 在不同时间缓存,因此恢复时间不一致。用各自剩余 TTL 估算,而不是从控制台修改时间统一计算。
七、NXDOMAIN也会被缓存
RFC 2308 定义了否定缓存。若名称创建前被查询并返回 NXDOMAIN,递归解析器可以在负缓存期限内继续返回不存在,即使权威已经新增记录。
负缓存 TTL 与权威响应中的 SOA 信息相关。保存 NXDOMAIN 响应的 authority section,不要误以为“没有 Answer 所以没有 TTL”。
八、区分NXDOMAIN与NODATA
NXDOMAIN 表示查询名称不存在;NODATA 表示名称存在但请求的记录类型不存在。比如只有 AAAA 没有 A,不应与整个名称不存在混为一谈。
客户端和监控要分别记录 RCODE、Answer 与 SOA。错误分类会导致清理错误缓存键或修改无关记录。
九、检查CNAME链每一跳
目标可能先返回 CNAME,再查询其 target。链中任一 RRset 都有自己的 TTL,目标名称还可能曾被负缓存。只检查入口 A 记录会遗漏旧 CNAME 或目标缓存。
展开完整链并记录每跳的权威、TTL、RCODE 和最终地址。避免形成 CNAME 循环或超长链。
十、父区委派也有缓存
更换权威 NS 时,父区的 NS/DS 委派与子区 apex NS 必须协调。递归解析器可缓存旧委派,即使新服务商 zone 已正确。
直接查询父区权威,比较注册商配置、父区 NS 和子区 NS。若启用 DNSSEC,还要按安全迁移流程处理 DS,不能只改 NS。
十一、旧权威服务器仍在回答
迁移后不要立刻关闭旧权威。缓存旧委派的 resolver 仍可能访问它;若旧服务器保留旧 zone,就会继续返回旧地址。过早关闭则可能产生 SERVFAIL。
在至少覆盖委派 TTL 的过渡期内,让新旧权威返回一致数据,并监控旧服务器查询量降至安全水平后再下线。
十二、Serve Stale会延长旧答案可见时间
RFC 8767 描述递归服务器在无法刷新缓存时提供过期数据的机制,以提高可用性。若权威超时、网络故障或验证失败,resolver 可能在原 TTL 后仍返回旧答案,并带有很低或特定 TTL。
此时根因不是缓存不守 TTL,而是刷新权威失败。检查递归日志、权威可达性、DNSSEC 和响应延迟,不能只要求用户清缓存。
十三、检查递归解析器转发链
企业 resolver 可能把请求转发给另一台上游,清理本地缓存后仍从上游获得旧答案。家庭路由器、运营商 DNS 和安全网关也可能形成多级缓存。
记录每一层的上游和响应。避免在生产中无差别 flush 全部 DNS 缓存,它会制造查询洪峰并影响无关域名。
十四、DoH与浏览器缓存
浏览器启用 Secure DNS 时可能使用独立 DoH 服务,不经过操作系统配置。浏览器还会缓存主机解析、连接池、HTTP 重定向和 HSTS 行为。
用浏览器网络和策略页面确认实际 resolver。关闭 DoH 只适合作对照,最终应修复真实解析路径,而不是要求所有用户改浏览器。
十五、操作系统和本地守护进程
systemd-resolved、nscd、dnsmasq 或本地安全软件可能缓存答案。先查询其状态和上游,再按精确范围刷新。重启整台主机不是必要的第一步。
容器可能使用 Docker/Kubernetes 内部 DNS,并由 CoreDNS 等组件缓存。进入与应用相同网络命名空间测试,不能用宿主机结果替代。
十六、应用进程可能永久缓存
JVM、语言运行时、数据库连接池和反向代理可能在 DNS TTL 之外保留解析结果或长连接。DNS 已更新但现有 TCP 连接仍访问旧 IP,并不表示查询错误。
检查应用 DNS 缓存策略、连接复用和刷新机制。通过滚动重启或连接排空恢复,避免全量同时重启造成流量尖峰。
十七、Hosts文件与静态覆盖
本机 hosts、容器 hosts、企业终端策略和测试工具的 resolve 参数可以绕过 DNS。若只有少量机器持续旧 IP,优先检查这些静态覆盖。
记录变更来源并安全删除过期条目。不要编辑公共 hosts 作为长期 DNS 发布方案。
十八、负载均衡返回多地址
权威 RRset 可能同时包含旧新多个 A/AAAA,用于加权或轮询。不同查询顺序不等于缓存错误。比较集合而不是只比较第一行。
如果旧地址应下线,确认它已从所有权威视图和健康池移除,并等待对应 RRset TTL。客户端可能仍在使用此前建立的连接。
十九、IPv4与IPv6分别验证
只更新 A 记录但 AAAA 仍指向旧服务时,优先 IPv6 的客户端会继续访问旧端点。反过来也一样。浏览器 Happy Eyeballs 行为还会造成地区和网络差异。
分别查询 A、AAAA 并测试两条网络路径。不要通过删除可用 IPv6 来掩盖后端发布不一致。
二十、Anycast权威节点同步
同一 NS IP 可能通过 anycast 在不同地区由不同节点回答。单点查询正常不能证明所有 PoP 已加载新 zone。使用多地区探针并记录响应中的节点标识或 NSID(若提供)。
发现区域差异时由 DNS 服务商检查发布状态和节点健康,不要通过反复修改 serial 制造更多版本。
二十一、安全变更流程
迁移前降低 TTL;确认旧 TTL 周期已过;在新旧端点同时可用时发布新记录;验证所有权威一致;观察递归缓存切换;保持旧服务直到连接和缓存窗口结束;最后恢复 TTL 并下线旧端点。
紧急切换无法提前降低 TTL 时,要接受旧流量窗口,并保持旧端点转发或服务兼容。不能假设清理几个公共 DNS 即覆盖所有用户。
二十二、建立时间线与证据表
记录变更时间、旧 TTL、每台权威 serial、每个 resolver 的值与剩余 TTL、旧端点流量和应用连接数量。由此计算最晚合理恢复时间,并识别超出窗口的异常路径。
查询日志可能包含用户 IP 和内部域名,应按隐私要求脱敏和限制保存。
二十三、常见错误
常见误区包括:说所有 DNS 都固定传播 48 小时;修改新 TTL 后期待旧缓存立即缩短;只查一个公共 resolver;忽略 NXDOMAIN 负缓存;混淆 NODATA;只看入口名不展开 CNAME;更换 NS 后马上关闭旧权威;忽略 Serve Stale;浏览器 DoH 绕过系统 DNS;只更新 A 忘记 AAAA;把长连接误判为 DNS 缓存。
另一个危险操作是全局清空企业递归缓存。它会影响所有业务并制造权威查询峰值,应该先定位精确名称和缓存层。
二十四、修复后的验收清单
确认父区委派正确;所有权威 NS 的目标 RRset、SOA serial 和 DNSSEC 状态一致;CNAME 每跳正确;A/AAAA 同步;多个递归解析器在预期 TTL 后获得新答案;负缓存已自然到期或按变更流程处理;没有异常 Serve Stale;DoH、系统、容器和应用路径均验证;旧端点流量降至零;监控能区分权威、递归和应用故障。
最后从至少两个地区、两个独立递归服务和真实应用环境复测,保留时间与完整响应作为发布验收证据。
FAQ
1. DNS修改后一定要等48小时吗?
没有统一固定时间。主要取决于旧 RRset、委派或负缓存的 TTL,以及解析器何时取得缓存。应根据实际剩余 TTL 和权威状态计算。
2. 新记录TTL设为60秒为什么用户仍看到旧IP?
用户可能在修改前缓存了旧记录,其剩余时间由旧 TTL 决定。也可能查询旧权威、Serve Stale 或应用持有旧连接。
3. 新增域名为何仍返回NXDOMAIN?
名称创建前的 NXDOMAIN 可以被负缓存。读取否定响应中的 SOA 与剩余期限,并确认所有权威已发布新名称。
4. 清理本机DNS缓存为何浏览器还访问旧站?
浏览器可能使用 DoH、自己的缓存或已有连接,应用也可能有代理缓存。检查实际解析器与连接池,而不是只刷新操作系统。
5. 可以马上关掉旧DNS服务器和旧网站吗?
通常不应。缓存旧委派或旧地址的用户仍会访问它们。至少保持新旧数据和服务兼容到相关 TTL 与连接窗口结束。
总结
DNS 更新后的新旧结果不是神秘“传播”,而是权威发布、委派和多层缓存共同作用。可靠排查从每台权威 NS 开始,随后检查递归剩余 TTL、负缓存、Serve Stale、转发链、DoH、系统与应用缓存,并用旧 TTL 计算恢复窗口。通过提前降 TTL、新旧端点并存和多路径验收,可以避免用固定 48 小时解释真正的同步或配置故障。