"域名刚改了解析,为什么手机能打开电脑打不开?""CNAME 配置了几个小时不生效,CDN 厂商说没问题,注册商也说没问题"——这类问题几乎每个运维和站长都遇到过。本文给出一套系统的 DNS 排查方法,配合命令行工具把问题锁定在 5 分钟内。

一、先搞懂 DNS 解析的完整链路

用户访问 example.com 时,解析请求经过:浏览器缓存 → 操作系统缓存 → 本地递归 DNS(运营商或 114/223.5.5.5)→ 根域名服务器 → .com 顶级域服务器 → 权威 DNS(你注册商的解析服务器)。任何一层的缓存未过期,你看到的都是旧记录。

关键结论:改解析后"部分人生效部分人不生效"不是故障,是各层缓存 TTL 不同的正常现象。生产环境改解析前,建议提前 24 小时把 TTL 从默认 600 秒调到 60 秒。

二、排查三板斧:dig 命令实战

1. 查权威 DNS 的记录(最准)

# 直接问权威服务器,绕过所有缓存
dig @ns1.alidns.com www.example.com A +noall +answer

# 输出示例
www.example.com.  600  IN  A  1.2.3.4

如果权威服务器返回的是新 IP,说明配置已生效,问题在缓存层;如果返回旧 IP 或空,说明注册商后台配置未保存成功或域名 DNS 服务器指向了别处。

2. 查递归 DNS 的记录(定位缓存问题)

# 分别问三家公共 DNS,对比差异
dig @223.5.5.5 www.example.com +short
dig @119.29.29.29 www.example.com +short
dig @8.8.8.8 www.example.com +short

三家返回不一致属于正常的缓存时间差;如果全部是旧值超过 TTL 时间仍未刷新,可向公共 DNS 提交刷新,或等待缓存自然过期。

3. 追踪完整解析链路

dig www.example.com +trace +nodnssec

+trace 会从根服务器逐级打印解析过程,能直观看到是哪一层返回了异常(例如 CNAME 链条断掉、NS 记录指向了已过期的解析服务)。

三、高频报错与对症解法

现象根因解法
CNAME 与 A 记录冲突报错同一主机名 CNAME 不能与其他记录共存删除冲突记录;根域需要 CDN 时用厂商提供的 A 记录方案或 ANAME
改了解析一直不生效本地缓存 / TTL 过长ipconfig /flushdns;手机切飞行模式重连;等待 TTL 过期
微信内打开异常,浏览器正常微信内置缓存 / 域名被微信拦截检查微信安全中心拦截状态;等待 10-30 分钟内置缓存刷新
部分地区打不开运营商 DNS 污染或劫持换用公共 DNS 验证;启用 DNSSEC;排查域名是否被运营商劫持插广告
邮件收不到MX 记录被误删或优先级错误dig MX 检查;确认 MX 值与邮件服务商文档一致
HTTPS 证书不匹配证书绑定的域名与访问域名不一致 / CNAME 链导致验证失败核对证书 SAN 列表;CDN 场景按厂商指引完成 DNS 验证后再签发

四、CDN 接入时的三个经典坑

  • 裸域 CNAME 限制:根域(example.com)在标准 DNS 里不能配 CNAME。解决:把根域 301 到 www,或使用云厂商支持的根域 CNAME(如阿里云"域名 云解析"的 AAAA/A 智能方案)。
  • TTL 太长导致回源切换慢:接入 CDN 前把 TTL 调低到 60-120 秒,出现故障时回切源站才能分钟级完成。
  • 验证文件被 CDN 缓存:给 Let's Encrypt 的验证路径、微信支付校验文件设置不缓存规则,否则证书续期和支付配置会莫名失败。

五、日常监控建议

  • 用拨测平台(阿里云拨测、UptimeRobot 等)对核心域名做多地区 HTTP 监控,间隔 5 分钟。
  • 对 MX 记录、NS 记录配置变更告警(DNSPod 等支持记录变更通知)。
  • 每年演练一次"解析快速回滚":保留上一版解析记录的导出文件,出问题时 10 分钟内可全量恢复。

DNS 问题九成以上可以通过"权威服务器 → 递归缓存 → 客户端"三层定位法收敛。把 dig 用熟,比反复在控制台里点来点去高效得多。