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 文件。
应用和 nslookup 走的是两条完全不同的路径
解决
单台机器立刻恢复:
Clear-DnsClientCache
批量处理可以推一条远程命令,或者干脆等 TTL 过期。长期方案是把 negative cache 的保留时间调短(注册表 MaxNegativeCacheTtl),在 DNS 基础设施本身不稳定的环境里值得考虑。
教训
nslookup通 ≠ 系统解析通。nslookup走自己的 resolver,永远记得用Resolve-DnsName(走系统栈)来复现应用看到的行为。