Papa Labs

Windows 的 negative DNS cache:为什么服务恢复了客户端还是解析失败

一次内部 DNS 短暂故障之后,服务端已经恢复,但一批 Windows 客户端还是持续报名称解析失败,又持续了好几分钟。记录一下排查过程。

现象

  • DNS server 恢复正常,nslookup internal-app.corp.local 直接指定 server 查询是通的
  • 但应用层(浏览器、ping)依然报 could not resolve
  • 只影响故障期间尝试过解析的客户端,新开机的机器完全正常。

根因

Windows 的 DNS Client 服务不只缓存成功的解析结果,失败的结果(NXDOMAIN / timeout)也会被缓存,这叫 negative caching。默认行为下,这些失败记录会在 cache 里留存一段时间,期间系统根本不会再发起真正的 DNS 查询。

用下面的命令可以看到 cache 里的负面记录:

Get-DnsClientCache | Where-Object Status -ne 0

nslookup 之所以是通的,因为它绕过 DNS Client cache 直接查 server —— 这也是为什么「nslookup 正常但应用解析失败」几乎总是指向本机 cache 或 hosts 文件。

DNS negative cache 流程图:应用被本机缓存的 NXDOMAIN 挡住,nslookup 绕过缓存直接查询成功

应用和 nslookup 走的是两条完全不同的路径

解决

单台机器立刻恢复:

Clear-DnsClientCache

批量处理可以推一条远程命令,或者干脆等 TTL 过期。长期方案是把 negative cache 的保留时间调短(注册表 MaxNegativeCacheTtl),在 DNS 基础设施本身不稳定的环境里值得考虑。

教训

nslookup 通 ≠ 系统解析通。nslookup 走自己的 resolver,永远记得用 Resolve-DnsName(走系统栈)来复现应用看到的行为。

← 全部文章