跳转至

DNS

动机:名称与位置解耦

人更容易记住 www.example.com,网络层却需要 IP 地址。若把所有映射放在一台服务器中,它会成为容量、延迟和故障瓶颈。DNS 采用层次化、分布式数据库,让不同组织管理自己的命名空间,同时允许查询结果缓存。

域名从右向左形成层次:根、顶级域、组织域和主机名。www.example.com. 末尾的点表示绝对域名,只是日常书写常省略。

最小完整解析过程

假设浏览器首次查询 www.example.com,本机和递归解析器均无缓存:

  1. 浏览器询问操作系统的 stub resolver。
  2. stub 把问题交给配置好的递归解析器。
  3. 递归解析器询问根服务器,得到 .com 顶级域服务器的转介。
  4. 询问 .com 服务器,得到 example.com 权威服务器的转介。
  5. 询问权威服务器,得到 www.example.com 的地址记录。
  6. 解析器按 TTL 缓存结果并返回客户端。

根服务器通常不直接回答最终地址,它告诉解析器“下一步问谁”。递归解析器替客户端完成整条迭代查询链,这是递归服务与迭代查询的区别。

常见资源记录

类型 作用 示例意义
A 名称映射到 IPv4 地址 Web 服务器 IPv4
AAAA 名称映射到 IPv6 地址 Web 服务器 IPv6
CNAME 一个名称作为另一个名称的别名 把业务域名指向 CDN 域名
MX 指定邮件接收服务器及优先级 邮件投递入口
NS 指定区域的权威名称服务器 委派管理权
TXT 保存文本策略或验证信息 SPF、域名所有权验证
PTR 地址到名称的反向映射 运维检查与邮件信誉

DNS 返回的是带 TTL 的记录集合,不一定是唯一地址。权威服务可按地理位置、负载和健康状态给出不同答案;客户端也可能同时获得 IPv4 与 IPv6 地址并择优连接。

缓存的收益与代价

缓存降低查询延迟和权威服务器负载。TTL 越长,命中率通常越高,但地址变更传播越慢;TTL 越短,切换更灵活,却增加查询量。不存在对所有记录都最优的 TTL。

“刚修改 DNS 为什么还没生效”通常不是神秘故障,而是旧记录仍在各层缓存中。还可能存在浏览器缓存、操作系统缓存、递归解析器缓存和应用自身缓存。DNS 也会缓存“不存在”答案,称为负缓存。

传输方式与报文大小

传统 DNS 通常在 53 端口使用 UDP,以一次请求和一次响应完成查询,开销小;响应过大、需要可靠传输或区域传送时可使用 TCP。现代扩展允许更大的 UDP 响应,但分片和丢包仍可能促使实现回退 TCP。

加密 DNS 常见两种承载:DNS over TLS 和 DNS over HTTPS。它们保护客户端到解析器这一段的查询内容,不能自动保证解析器可信,也不能代替域名权威数据的真实性验证。

安全边界

攻击者若伪造 DNS 响应,可能把用户导向错误 IP。随机查询标识、源端口随机化和严格匹配问题可提高伪造难度。DNSSEC 为记录提供可验证的签名链,解决数据来源认证与完整性,但不负责隐藏查询内容;加密 DNS 保护传输隐私,却不等价于 DNSSEC。

即使 DNS 回答了错误地址,HTTPS 的证书主机名验证仍可成为第二道防线。这体现了分层防御:名称解析与应用安全不应只依赖同一个信任点。

亲手观察

dig www.example.com A
dig www.example.com AAAA
dig +trace www.example.com
dig example.com MX

普通查询展示递归解析器返回的记录、TTL 和响应来源;+trace 更接近逐级查看委派路径。排障时应区分 NXDOMAIN、超时、返回了错误地址以及地址正确但连接失败。

自测

为什么把 DNS TTL 设为 0 也不能保证每次用户访问都立刻查询权威服务器?

中间实现可能设置最小缓存策略,应用还可能维持连接或自行缓存;即便重新查询,递归解析器到权威链路中的委派记录也仍可缓存。DNS 只是连接建立前的一个环节。