改了 DNS 但站还打不开:4 个原因 + 对症修复

更新了 DNS 记录但站显示旧 IP 或加载失败。常见原因:改前 TTL 太高;OS / 路由器缓存旧 DNS;某些 resolver 还服务旧。先做:终端 `dig {域}` 绕过浏览器缓存。确认返回新值。

你 30 分钟前改了 DNS 记录。站打不开,或者打开看到的还是旧服务器内容。你刷新、等待、慌张、@DNS 提供商。绝大多数时候记录是对的——只是还没全球传播。或者你本地 OS 在缓存旧答案。DNS 传播按 TTL(Time To Live)走,TTL 是你改之前已经设好的:如果改之前 TTL 是 24 小时,某些 resolver 会保留旧 IP 最长 24 小时——你现在做什么都没用。

诊断关键:用 dig,不是浏览器,看 DNS 实际在说什么。

常见原因

按命中率从高到低。

1. 改前 TTL 太高(最常见)

DNS 记录有 TTL 决定 resolver 能缓存多久。改记录那一刻 TTL 是 3600(1 小时)或 86400(24 小时),就是某些 resolver 继续返回旧 IP 多久。

怎么判断

dig +nostats yourdomain.com

;; ANSWER SECTION: 行——名字后的数字是当前 TTL。查改之前的 TTL 看 DNS 提供商历史(如果有)。

2. 本地 OS / 浏览器缓存

DNS 全球传播完之后,你电脑还会缓存旧答案直到本地 TTL 过期。

怎么判断:终端 dig 返回新值,浏览器还显示旧。就是本地缓存。

清除

  • macOS:sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
  • Linux:sudo systemd-resolve --flush-cachessudo resolvectl flush-caches
  • Windows:ipconfig /flushdns
  • 浏览器:浏览器内部 DNS 缓存也要清(Chrome:chrome://net-internals/#dns → “Clear host cache”)

3. 改在了错的 DNS 提供商

你有两家提供商——registrar 默认 DNS 和单独的 DNS 提供商(Cloudflare、Route 53)。当前生效的由 registrar 指向的 nameserver 决定。你改在了不生效的那家。

怎么判断

dig NS yourdomain.com

看真实 nameserver。如果不是你改 DNS 的那家提供商的,你改错地方了。

4. 某些 resolver 不守 TTL,旧值留更久

公共 resolver(8.8.8.8、1.1.1.1)一般尊重 TTL。ISP resolver 和某些企业 DNS 服务器可能保留更久。除了等没别的办法。

怎么判断

# 测多个 resolver
dig @8.8.8.8 yourdomain.com
dig @1.1.1.1 yourdomain.com
dig @9.9.9.9 yourdomain.com

三个都返回新值但某些用户加载不了,就是他们的 DNS 还是旧的。

5. 前置 CDN / 代理返回缓存响应

DNS 指向 CDN 时,即使 DNS 正确,访客打到的是 CDN 缓存。CDN purge 跟 DNS 是两回事。

怎么判断curl -sI 走 CDN 和绕开 CDN 对比。CDN 服务旧、源站服务新,就清 CDN 缓存。

6. 浏览器 HSTS pinning

旧站设过 Strict-Transport-SecurityincludeSubDomains,浏览器即使 DNS 变了也会尝试 HTTPS 到旧 IP/证书。

怎么判断:浏览器显示 NET::ERR_CERT_AUTHORITY_INVALID 之类。在浏览器设置里清这个域名的 HSTS。

最短修复路径

第 1 步:用 dig 验证(不是浏览器)

dig yourdomain.com +short

应该返回新 IP / 目标。返回新值 = DNS 本身在正常传播,问题是本地缓存或下游。

第 2 步:多 resolver、多区域测

dnschecker.org 显示来自 30+ 国家的解析。大多数显示新值、少数显示旧 = 传播中。

第 3 步:确认改在了生效的 DNS 提供商

dig NS yourdomain.com

列出的 nameserver 是生效的。在它们那里改记录,不在别处。

第 4 步:清本地 DNS

确认全球传播后:

# macOS
sudo dscacheutil -flushcache && sudo killall -HUP mDNSResponder

# Linux (systemd-resolved)
sudo resolvectl flush-caches

# Windows
ipconfig /flushdns

浏览器 DNS 缓存也清(Chrome:chrome://net-internals/#dns)。

第 5 步:以后改前提前降 TTL

DNS 提供商里,计划改动至少 24 小时前把 TTL 设为 300(5 分钟)。这样改的那天,传播几分钟就完成。

第 6 步:ISP resolver 就只能等

dig @8.8.8.8 显示新值但 ISP DNS 显示旧——技术上没辙——等。ISP resolver 通常 1-24 小时内追上。

预防建议

  • 任何 DNS 改动前至少 24 小时把 TTL 降到 300。
  • 改记录前先验证当前生效的 nameserver。
  • dig 验证 DNS 状态,不是浏览器。
  • 改源 DNS 后清 CDN 缓存。
  • CANONICAL_DOMAIN.md 里写明你域名的 canonical DNS 提供商。

相关阅读

标签: #排查 #DNS #排查 #DNS 传播