DNS 做的事:把名字换成地址
DNS 是一套分布式的名字 → 记录查询系统。它之所以能扛住全球流量,靠的是分层授权与多级缓存:越靠近用户的缓存命中,解析越快,也越难立刻生效变更。
常见记录类型
| 类型 | 作用 | 注意 |
|---|---|---|
| A | 域名 → IPv4 | 最基础的地址记录 |
| AAAA | 域名 → IPv6 | 双栈环境要同时配置 |
| CNAME | 域名 → 另一个域名(别名) | 根域通常不允许 CNAME |
| MX | 邮件交换服务器 | 带优先级,值应为域名 |
| TXT | 任意文本(验证、SPF 等) | 长度有限,可能需分段 |
| NS | 委派给哪组权威服务器 | 改 NS 生效最慢 |
| SOA | 区域起始记录(含 TTL 策略) | 排障时看 serial 是否递增 |
一次查询走过的缓存
- 浏览器自身缓存(时间通常很短);
- 操作系统缓存与 hosts 文件;
- 本地递归解析器(运营商或公共 DNS);
- 未命中则逐级查询:根 → 顶级域 → 权威服务器。
由于缓存分布在他人的机器上,TTL 就是你能控制的生效速度上限。
TTL 怎么设
- 稳定不变的记录(如 MX、长久指向的 A):TTL 可设数小时,减少查询量;
- 计划变更的记录:变更前先把 TTL 降到 300 秒左右,改完生效后再调回;
- 做故障切换:TTL 越短切换越快,但查询量与成本上升,且部分网络会强制拉长缓存。
三个高频坑
- 根域用 CNAME:多数注册商不允许,需要改用 ALIAS/ANAME 或直接 A 记录;
- 改了记录没生效:本地仍有旧缓存,换个网络或用公共 DNS 对比验证,不要反复改动记录;
- 只配 A 不配 AAAA:双栈用户会走不可预期的路径,要么同时配置,要么明确不使用 IPv6。
排查命令
dig example.com A +short # 查 A 记录
dig example.com AAAA +short # 查 IPv6
dig example.com NS +short # 查权威服务器
dig @8.8.8.8 example.com A # 指定解析器对比
dig example.com A +trace # 跟踪完整解析链
实战场景:三个解析疑难
- “灰度切流量时部分用户仍打旧 IP”:受 TTL 与各层缓存影响,改记录前先把 TTL 调低并预留生效窗口。
- “邮件发不出去,A 记录却正常”:邮件看 MX 与 SPF/DKIM 的 TXT 记录,与 A 记录无关,别改错记录。
- “国内可解析、海外失败”:可能是分线路解析或某些解析器未同步,用多地 dig 对比权威与递归结果。
常见问题
为什么改了解析,别人能访问我却不行?各自的缓存与解析器不同,本地刷新 DNS 缓存或换网络即可对比。DNS 会影响首屏速度吗?会,但通常只有首次访问明显;可用 dns-prefetch 提前解析。公共 DNS 一定更快吗?不一定,取决于你的网络到它的链路,实测再决定。
解析失败的排查顺序
- 分层验证:先用权威服务器直接查询,确认记录本身存在且正确;再用公共解析服务查询,确认递归链路正常;最后在本地查询,确认本地解析器与缓存没有旧值。分层验证能立刻指出问题出在自己的记录、上游解析还是本地环境。
- 缓存与生效时间:修改记录后应关注生效时间设置。设置过长的值会让变更难以快速生效,设置过短则增加查询压力,应根据变更频率取折中。
- 区分解析与连通:解析成功只代表拿到了地址,不代表端口可达。排查时应该分别验证解析结果与网络连通,避免把两类问题混在一起。
- 多地址与轮询:一个域名对应多个地址时,客户端选择哪一个并不完全可控,故障时应考虑部分客户端仍在使用失效地址的情况。
- 注意内部域名:内部域名依赖内部解析器,混合环境下容易出现“办公网能访问、云上不能访问”,应确认解析配置在所有环境中都已下发。
把解析、连通与端口三层分开验证,是网络排查中最值得养成的习惯之一,能显著缩短定位时间。