DNS 是什么:域名是怎么变成 IP 的
2026-04-12
DNS(Domain Name System)是互联网的“电话簿”,负责把 www.example.com 这样好记的域名翻译成 IP 地址。
为什么需要 DNS
网络里的设备之间是靠 IP 地址通信的,比如 203.0.113.10 这样的 IPv4 地址,或者更长的 IPv6 地址。人记数字很困难,而且服务器换了机器 IP 就会变。DNS 在中间加了一层:你只记住域名,域名背后指向哪个 IP 可以随时调整。这也是为什么我们迁移服务器时,只需要改解析,而不需要通知每个访问者。
域名的层级结构
域名从右往左读。以 www.example.com 为例,最右边隐含一个根(一个点),然后是顶级域 com,再是二级域 example,最左边的 www 是主机名,也常被叫作子域名。每一级都由对应的服务器负责,这种分层让 DNS 可以在全世界分布式地运行,而不是依赖一台中心服务器。
一次解析大致经过
- 浏览器先查自己的缓存和系统缓存。
- 没有就问本地配置的递归解析器(运营商或 223.5.5.5、119.29.29.29 等公共 DNS)。
- 递归解析器依次向根服务器、顶级域(如 .top)服务器、权威服务器查询,拿到结果后缓存并返回。
这里有两个角色值得区分。递归解析器替你跑腿,负责一路问下去并缓存答案;权威服务器则是某个域名的“官方答案”,你在域名服务商后台里填写的记录,最终就存放在权威服务器上。很多解析问题,本质上是搞不清自己在改的到底是哪一层。
常见记录类型
| 类型 | 作用 |
|---|---|
| A | 域名指向 IPv4 地址 |
| AAAA | 域名指向 IPv6 地址 |
| CNAME | 别名,指向另一个域名 |
| MX | 邮件服务器 |
| TXT | 文本,常用于域名验证、SPF 等 |
| NS | 指定该域名由哪些 DNS 服务器负责 |
一份示例解析配置
假设你的服务器地址是文档示例地址 203.0.113.10,想让根域名和 www 都能访问,可以在域名服务商的控制台里这样添加:
类型 主机记录 记录值 A @ 203.0.113.10 A www 203.0.113.10 AAAA @ 2001:db8::10 TXT @ "v=spf1 -all"
其中 @ 表示域名本身。2001:db8:: 是 IPv6 文档专用前缀,同样只是示例。最后一条 TXT 是一个很严格的 SPF 示例,表示这个域名不发邮件,真实使用时请按你的邮件服务商文档填写。
CNAME 的几个限制
CNAME 是别名,常用来把 www 指向另一个域名。需要记住两点:第一,同一个主机名下如果已经有 CNAME,就不能再同时有其他类型的记录;第二,根域名(也叫顶点域名)按规范不能直接设置 CNAME,因为它还要存放 NS、SOA 等记录。有些服务商提供“CNAME 展平”或“ALIAS”之类的变通功能,但那是服务商自己的实现,使用前请看清各家文档。
TTL 与生效时间
TTL 是记录可以被缓存的秒数。修改解析后,各地缓存过期的时间不同,所以“全球生效”可能要等几分钟到几小时。要换服务器前,可以先把 TTL 调小。
我的做法是:计划迁移前一两天,先把 TTL 改成较小的值(比如 300 秒),等旧的缓存都过期后再切换 IP,切换稳定了再把 TTL 调回来。这样即使新服务器有问题,也能很快切回去。
常用排查命令
nslookup www.example.com dig www.example.com A +short
在 Debian 或 Ubuntu 上,dig 属于 dnsutils 或 bind9-dnsutils 软件包,可以这样安装:
sudo apt install -y dnsutils
几个我常用的写法:
dig www.example.com A dig www.example.com AAAA +short dig NS example.com +short dig www.example.com @223.5.5.5 +short dig +trace www.example.com
第四条指定了向某个公共 DNS 查询,可以用来对比不同解析器的结果。最后的 +trace 会从根开始一步步展示查询过程,非常适合用来理解上面讲的层级结构。还可以用 dig www.example.com 输出里的 ANSWER SECTION 查看当前剩余的 TTL,数字会随缓存递减。
常见问题与排查
- 改了解析但访问的还是旧地址:先用 dig 指定不同 DNS 查询,看权威结果是否已更新;本机可能有缓存,可以重启浏览器或清理系统 DNS 缓存。
- 浏览器能访问但命令行查不到(或反过来):浏览器和系统可能使用了不同的 DNS,包括浏览器内置的安全 DNS 设置,检查一下配置。
- hosts 文件干扰:本机
/etc/hosts里的条目优先于 DNS,调试时顺便检查一下。 - NS 没改对:如果换了 DNS 托管服务商,必须在域名注册商处把 NS 改成新服务商给的地址,否则在新服务商那里加的记录不会生效。
- 证书申请失败:多半是域名没有解析到服务器,参考 HTTPS 与证书。
DNS 与服务器部署的关系
买好服务器之后,指向它的第一步就是添加 A 记录,初始化方法见 VPS 入门。如果你用 Caddy 自动申请证书,解析必须先生效,详情见 Caddy。另外要提醒:域名解析到中国大陆的服务器并提供网站服务,需要先通过接入服务商办理 ICP 备案。
安全方面的几点提醒
域名账号和 DNS 托管账号一定要启用强密码和二步验证,因为一旦被人改了解析,访问者就会被导向别处。不要在公开场合展示自己的真实解析记录和后台截图。另外,不再使用的子域名记录要及时删除,避免子域名指向已经释放的资源而被他人利用。
常见的解析使用场景
最常见的场景是网站上线:添加 A 记录指向服务器,等待生效后访问。第二种是邮箱:需要配置 MX 记录指向邮件服务商,同时通常还要添加 SPF、DKIM 等 TXT 记录,用来证明邮件确实由你授权的服务器发出,具体内容以邮件服务商文档为准。第三种是所有权验证:很多服务会让你添加一条指定的 TXT 记录,以证明你控制这个域名,验证完成后可以删除。
公共 DNS 和 DNS 污染的说法
前面提到的 223.5.5.5、119.29.29.29 都是可以手动设置的公共 DNS。选择公共 DNS 主要考虑稳定性和延迟,各人网络环境不同,哪个更快只能自己测试。在 Debian 或 Ubuntu 上,如果系统使用 systemd-resolved,可以用 resolvectl status 查看当前使用的 DNS 服务器;如果直接使用 /etc/resolv.conf,则查看里面的 nameserver 行。需要注意,在使用 NetworkManager 或 DHCP 的机器上,手动改动 resolv.conf 可能会被覆盖,要改对地方。
泛解析
在主机记录里填写 * 就是泛解析,表示所有不存在明确记录的子域名都解析到同一个地址。它方便,但也会让拼错的域名同样能访问到你的服务器,使用前想清楚是否真的需要,并且要记住,显式添加的记录优先于泛解析。
修改解析的推荐步骤
- 用 dig 记下现有记录和 TTL,作为回滚依据。
- 提前调低 TTL,等待旧 TTL 时间过去。
- 新服务器先用 hosts 文件或 curl 的
--resolve参数测试,确认服务正常。 - 修改解析,用 dig 指定多个公共 DNS 验证。
- 观察一段时间,没有问题后再把 TTL 调回常规值,并下线旧服务器。
第三步的例子如下,它不改任何解析,就能验证新服务器是否正确响应:
curl -I --resolve www.example.com:443:203.0.113.10 https://www.example.com/
总结
DNS 的核心就是把域名按层级逐级解析成 IP,缓存让它很快,也让修改的生效有延迟。记住常见记录类型,学会用 dig 查询和 +trace 追踪,改解析前先降低 TTL,遇到问题时分清是权威端还是缓存端,大部分 DNS 问题都能自己定位。