你 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-caches或sudo 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-Security 带 includeSubDomains,浏览器即使 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 提供商。