改 DNS 为什么不生效
换了记录或换了 DNS 服务器后仍解析到旧地址,原因是缓存分布在多个层次:本机解析服务、应用或浏览器、本地 DNS 服务器、中间递归服务器。排查要按层次自内向外验证,先清本机缓存并重查,再逐层向公共 DNS 与权威服务器对照,才能判断问题卡在哪一层。
基本信息
| 典型场景 | 解析记录变更后仍返回旧结果,或切换 DNS 后行为不符合预期 |
|---|---|
| 排查组合 | 清本机缓存 + 按层次对照查询 + 直接询问权威服务器 |
| 关键概念 | 记录的有效期决定中间缓存能保留多久 |
| 适用范围 | Linux 服务器;应用层与浏览器缓存需单独处理 |
典型使用场景
- 切换负载均衡后端或迁移站点后,部分机器仍访问旧地址
- 更换 DNS 服务器后某台机器解析异常
- 验证新记录是否已经全网可见
- 排查「本机能解析、容器里不能解析」的层间差异
- 确认上游解析服务是否返回了非预期记录
清本机与验证
清本机与验证
resolvectl flush-caches # 系统解析服务缓存
resolvectl query app.example.com # 清后立即重查
systemctl is-active systemd-resolved # 确认解析服务在运行
getent hosts app.example.com # 系统真实解析(含本地静态条目)
sudo systemctl restart nscd 2>/dev/null # 老系统用独立缓存服务时重启它逐层对照
逐层对照
dig +short app.example.com # 本机默认 DNS 的结果
dig +short @1.1.1.1 app.example.com # 公共 DNS 的结果
dig +short @ns1.example.com app.example.com # 权威服务器:最终真相
dig app.example.com | grep -E 'ANSWER|Query time' # 看应答段与耗时
for i in 1 2 3; do dig +short @ns1.example.com app.example.com; sleep 5; done # 多查几次确认稳定缓存层次对照
| 层次 | 位置 | 清理或验证方式 |
|---|---|---|
| 应用缓存 | 进程内部与连接池 | 重启或让应用重新解析 |
| 浏览器缓存 | 终端侧 | 清理浏览器缓存或换终端验证 |
| 本机解析缓存 | 系统解析服务或独立缓存服务 | 清缓存命令或重启对应服务 |
| 本地 DNS 服务器 | 机房或内网递归 | 联系管理员刷新或调整有效期 |
| 权威服务器 | 域名托管侧 | 直接查询它确认最终记录 |
记录的有效期未到之前,中间递归服务器保留旧值属于正常行为,验证新记录是否生效应当直接询问权威服务器。
排查顺序
- 先确认现象范围:单机还是全网、全部域名还是个别域名
- 清本机缓存后重查,排除本机层面的干扰
- 对比公共 DNS 与权威服务器的结果,判断是上游还是本地问题
- 老系统注意独立的缓存服务,容器里则要单独看它的解析配置
- 结论写清是哪一层缓存导致的,便于后续调整有效期策略
清缓存只影响执行命令的那台机器,全网生效取决于记录的有效期与权威记录本身,这一点在跨部门沟通时最容易产生误解。