域名 DNS 解析故障排查:网站无法访问的常见原因与解决方法

"网站打不开"是站长最常遇到的求助。虽然报错五花八门——浏览器提示"找不到服务器"、请求间歇性超时、有的地区能打开有的打不开——但十有八九问题出在 DNS 解析环节。DNS 就像互联网的电话簿,负责把 example.com 这样的域名翻译成服务器的 IP 地址。这一步出了问题,后面的 HTTP、HTTPS、邮件服务全都无从谈起。

参考:Cloudflare 关于 DNS 的官方科普 https://www.cloudflare.com/learning/dns/what-is-dns/

DNS 解析是怎么工作的

一次完整的解析通常要经过本地缓存、递归解析器、根服务器、TLD 服务器和权威服务器几个环节:

  1. 浏览器先查本地 DNS 缓存(浏览器、操作系统、路由器各级缓存);
  2. 缓存未命中,请求交给递归解析器(通常是 ISP 或 8.8.8.8 这类公共 DNS);
  3. 递归解析器依次询问根服务器、.com 的 TLD 服务器,最终找到域名的权威 NS 服务器;
  4. 权威服务器返回 A/AAAA/CNAME 记录,解析器缓存结果并按 TTL 失效。

任何一个环节延迟、超时或返回错误数据,都会表现为"网站打不开"。理解了这条链路,排查时就能顺着它逐级验证。

常见 DNS 故障类型

故障类型 现象 常见原因
域名未解析 浏览器提示找不到服务器、DNS_PROBE_FINISHED_NXDOMAIN 记录未添加、拼写错误、未生效
解析到错误 IP 打开的是别的网站或报证书错误 A 记录填错、CDN 切换残留旧 IP
解析缓慢 首屏加载很慢、浏览器长时间转圈 递归解析器慢、权威服务器响应慢
部分区域无法访问 移动能开、宽带打不开,或国内外不一致 传播未完成、地区解析策略
间歇性失败 有时能开有时不能 TTL 太短导致缓存频繁刷新、上游抖动

排查工具

下面这些命令按"由近及远"的顺序使用,可以快速定位问题出在哪一环。

# 1. 基础查询:看记录是否存在、值是否正确
nslookup example.com
nslookup -type=MX example.com        # 查邮件记录
nslookup -type=NS example.com        # 查权威服务器

# 2. 跳过本地缓存,直接用公共 DNS 查询,排除本机/ISP 缓存干扰
dig example.com @8.8.8.8
dig +short example.com A

# 3. 查 WHOIS,确认域名状态和 NS 是否被注册局正确接管
whois example.com

# 4. 检查网络连通性(确认不是服务器宕机)
ping -c 4 example.com
curl -sv https://example.com
  • dig 返回里,status: NOERROR 表示解析成功,NXDOMAIN 表示域名不存在,SERVFAIL 表示权威服务器异常。
  • 在线工具如 whatsmydns.net 可从全球多个节点同时查询,适合判断是否只是"部分地区还没传播完"。

一次典型的排查过程

假设用户反馈 example.com 打不开,可以按下面的流程走一遍:

  1. 先用 nslookup example.com 看本机解析结果——如果显示 NXDOMAIN,先检查记录是否真的添加了、是否漏了主机名(很多新手把 example.comwww.example.com 当成一回事,只配了 A 记录却没配 www)。
  2. 本机查不到,但 dig example.com @8.8.8.8 能查到——问题在本地缓存或 ISP 的递归解析器,清缓存、换 DNS 即可。
  3. 两个都能查到,但网站还是打不开——用 curl -svping 排除服务器和网络层问题。
  4. 网站能开但邮件收不到——查 MX 记录是否配置,SPF/DKIM/DMARC 是否完整。

常见问题与解决方法

问题 解决方法
记录改了但没生效 新记录通常 5 分钟到 1 小时生效,改 NS 才需要 24-48 小时;可用 dig @新NS 提前验证
NS 记录指向错误 登录注册商,把 NS 指向 DNS 托管服务商指定的两组服务器
TTL 设置过长 计划迁移前 48 小时把 TTL 调低到 300 秒,切换完成后再调回
DNSSEC 配置错误 检查 DS 记录是否与公钥签名匹配,错误配置会导致整域 SERVFAIL
CDN 切换后仍有旧 IP 先确认 CNAME/A 记录已更新,再用 dig +short 对比新旧地址

预防措施

DNS 故障很难做到零发生,但可以通过下面几点大幅降低概率:

  1. 使用稳定的托管 DNS 服务商(Cloudflare、阿里云 DNS、DNSPod 等),避免把 NS 放在单点。
  2. 保留两组以上的 NS 记录,分散在不同网络。
  3. 日常记录 TTL 保持在 600-3600 秒,不要随意调低。
  4. 开启监控(UptimeRobot、自建定时 dig),解析异常第一时间告警。
  5. 启用 DNSSEC 防止 DNS 劫持,但务必先在测试环境验证 DS 记录,否则可能导致整域不可解析。

16IDC 观察

域名解析看起来是"小事",却是网站可用性的地基。建议把解析记录纳入版本管理:每次变更记录前先记录旧值,变更后用 dig 双端验证,重要域名尽量配置 DNSSEC 和解析监控。这样即使出现故障,也能在十分钟内定位到具体环节,而不是半夜对着控制台干着急。