DNS¶
动机:名称与位置解耦¶
人更容易记住 www.example.com,网络层却需要 IP 地址。若把所有映射放在一台服务器中,它会成为容量、延迟和故障瓶颈。DNS 采用层次化、分布式数据库,让不同组织管理自己的命名空间,同时允许查询结果缓存。
域名从右向左形成层次:根、顶级域、组织域和主机名。www.example.com. 末尾的点表示绝对域名,只是日常书写常省略。
最小完整解析过程¶
假设浏览器首次查询 www.example.com,本机和递归解析器均无缓存:
- 浏览器询问操作系统的 stub resolver。
- stub 把问题交给配置好的递归解析器。
- 递归解析器询问根服务器,得到
.com顶级域服务器的转介。 - 询问
.com服务器,得到example.com权威服务器的转介。 - 询问权威服务器,得到
www.example.com的地址记录。 - 解析器按 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 的证书主机名验证仍可成为第二道防线。这体现了分层防御:名称解析与应用安全不应只依赖同一个信任点。
亲手观察¶
普通查询展示递归解析器返回的记录、TTL 和响应来源;+trace 更接近逐级查看委派路径。排障时应区分 NXDOMAIN、超时、返回了错误地址以及地址正确但连接失败。
自测
为什么把 DNS TTL 设为 0 也不能保证每次用户访问都立刻查询权威服务器?
中间实现可能设置最小缓存策略,应用还可能维持连接或自行缓存;即便重新查询,递归解析器到权威链路中的委派记录也仍可缓存。DNS 只是连接建立前的一个环节。