一、DNS 是什么
DNS(Domain Name System,域名系统)是互联网的"电话簿"。它将人类可读的域名(如 www.example.com)
翻译成机器可识别的 IP 地址(如 93.184.216.34)。
DNS 工作在 OSI 模型的应用层,默认使用 UDP 53 端口(当响应数据超过 512 字节或进行区域传送时使用 TCP 53)。
IP 地址是 32 位(IPv4)或 128 位(IPv6)的数字,人类很难记忆。域名使用有意义的英文单词组成,方便记忆。DNS 就是在中间做翻译:你输入域名,DNS 告诉你对应的 IP。
二、DNS 层次结构
DNS 采用树状层次结构,从根域名开始逐级向下:
域名层级说明
| 层级 | 示例 | 说明 |
|---|---|---|
| 根域名 | . | 树的顶端,全球 13 组根域名服务器(A-M),通常省略不写 |
| 顶级域名 TLD | .com .cn | 分为 gTLD(通用:.com .org .net)和 ccTLD(国家:.cn .us .jp) |
| 二级域名 | example.com | 由组织注册的域名,是用户可注册的最小单位 |
| 子域名 | www.example.com | 二级域名下的子域,可自由创建 |
三、DNS 解析流程
当你在浏览器输入 www.example.com 时,DNS 解析的完整流程如下:
递归查询 vs 迭代查询
递归查询:客户端 → 本地 DNS 服务器。客户端问"帮我查到结果",本地 DNS 负责查到最终答案再返回。
迭代查询:本地 DNS 服务器 → 根/TLD/权威 DNS。每一步被问的服务器只返回"下一步去问谁",不负责查到最终结果。
四、DNS 报文结构
DNS 报文使用 UDP 传输,格式分为头部和正文两部分。头部固定 12 字节,包含查询和响应的元信息:
五、常见 DNS 记录类型
| 类型 | 全称 | 说明 | 示例 |
|---|---|---|---|
| A | Address | 域名 → IPv4 地址 | example.com → 93.184.216.34 |
| AAAA | IPv6 Address | 域名 → IPv6 地址 | example.com → 2606:2800:220:1:: |
| CNAME | Canonical Name | 域名别名,指向另一个域名 | www.example.com → example.com |
| MX | Mail Exchange | 邮件服务器地址(含优先级) | example.com → mail.example.com (优先级 10) |
| NS | Name Server | 域名的权威 DNS 服务器 | example.com → ns1.example.com |
| TXT | Text | 文本记录(SPF、域名验证等) | v=spf1 include:_spf.google.com ~all |
| SOA | Start of Authority | 区域授权信息(主DNS、管理员邮箱、序列号等) | 每个区域必须有一条 SOA 记录 |
| SRV | Service | 服务记录(指定服务的端口和主机) | _sip._tcp.example.com → 5060 |
| PTR | Pointer | IP → 域名(反向解析) | 34.216.184.93.in-addr.arpa → www.example.com |
六、DNS 查询实操
# 使用 dig 查询 A 记录
dig www.example.com A
# 使用 dig 查询指定类型的记录
dig example.com MX
dig example.com NS
dig example.com TXT
# 使用 dig 追踪完整解析路径
dig +trace www.example.com
# 使用 dig 指定 DNS 服务器查询
dig @8.8.8.8 www.example.com
# 使用 nslookup(Windows/macOS 自带)
nslookup www.example.com
nslookup -type=MX example.com
# 查看 DNS 缓存(Linux)
# systemd-resolve --status # systemd-resolved
# 或查看 /etc/resolv.conf 确认配置的 DNS 服务器
cat /etc/resolv.conf
# 实际查询输出示例
$ dig www.example.com
;; QUESTION SECTION:
;www.example.com. IN A
;; ANSWER SECTION:
www.example.com. 3600 IN A 93.184.216.34
;; Query time: 23 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; TTL: 3600 (1小时后缓存过期)
每一层 DNS 缓存(浏览器、操作系统、本地 DNS 服务器)都会根据记录的 TTL(Time To Live)值决定缓存保留时间。TTL 过期前不会重新查询。这就是为什么修改 DNS 记录后,全球生效需要等待 TTL 过期 — 修改 DNS 前建议先降低 TTL。
七、DNS 安全扩展
传统 DNS 使用明文传输,存在被劫持和篡改的风险。常见的 DNS 安全方案:
| 方案 | 解决的问题 | 说明 |
|---|---|---|
| DNSSEC | DNS 篡改 | 对 DNS 记录进行数字签名,验证响应的真实性和完整性 |
| DoH | DNS 窃听 | DNS over HTTPS,将 DNS 查询封装在 HTTPS 中加密传输 |
| DoT | DNS 窃听 | DNS over TLS,使用 TLS 加密 DNS 查询,端口 853 |
| DoQ | DNS 窃听 + 延迟 | DNS over QUIC,基于 QUIC 协议,更低的连接延迟 |
DNS 是互联网最基础的服务之一,理解 DNS 解析流程对于排查"域名打不开""CDN 调度异常""邮件发送失败"等问题至关重要。核心知识点:层次结构(根→TLD→权威)、两种查询模式(递归 vs 迭代)、缓存机制(多级缓存 + TTL)、常见记录类型(A/CNAME/MX/NS/TXT)。日常工作中 dig 和 nslookup 是最常用的 DNS 排查工具。