DNS 协议详解:域名系统的幕后工作
网络安全系列 · 网络协议篇
每当你在浏览器输入 www.example.com,背后发生了一系列精密的协作。你的设备并不直接认识这个域名,它需要借助 DNS(Domain Name System,域名系统) 将人类可读的域名转换为机器能理解的 IP 地址。这个过程看似简单,却是整个互联网运转的基石。
一、为什么需要 DNS?
1.1 域名 vs IP 地址
互联网上的每台设备都通过 IP 地址 进行通信。IPv4 地址如 142.250.185.68,IPv6 地址如 2404:6800:4003:c02::64。这些数字串对计算机来说很友好,但对人类来说难以记忆。
域名(Domain Name) 就是为了解决这个问题而生的。它使用层次化的字符串来表示网络资源,例如:
www.example.com
├── www (子域名/主机名)
├── example (二级域名)
└── com (顶级域名/TLD)1.2 DNS 的本质
DNS 是一个分布式的、层次化的数据库系统,它的核心功能就是域名解析——将域名映射到对应的 IP 地址。
可以把 DNS 想象成互联网的电话簿:
- 你知道联系人的名字(域名)
- DNS 帮你查到对应的电话号码(IP 地址)
二、DNS 的层次结构
DNS 采用树状层次结构,从根域开始向下延伸:
. (根域)
│
┌───────┬───────┼───────┬───────┐
│ │ │ │ │
.com .org .net .cn .edu
│
example.com
│
www.example.com2.1 各级域名说明
| 层级 | 示例 | 说明 |
|---|---|---|
| 根域 | . | 最顶层,通常省略不写 |
| 顶级域 (TLD) | .com, .org, .cn | 由 ICANN 管理 |
| 二级域 | example.com | 用户/组织注册的域名 |
| 子域 | www.example.com | 由域名所有者自行划分 |
2.2 常见顶级域名
| 类型 | 示例 | 用途 |
|---|---|---|
| 通用 TLD | .com, .net, .org | 商业、网络、组织 |
| 国家代码 | .cn, .jp, .uk | 国家/地区 |
| 新通用 TLD | .app, .dev, .blog | 特定用途 |
三、DNS 解析流程
当你在浏览器访问 www.example.com 时,发生了什么?
3.1 完整的解析过程
┌─────────────┐ ┌──────────────┐ ┌─────────────┐ ┌──────────────┐
│ 用户设备 │────▶│ 本地 DNS │────▶│ 根域名服务器 │────▶│ TLD 服务器 │
│ (浏览器) │ │ (递归解析器) │ │ │ │ (.com) │
└─────────────┘ └──────────────┘ └─────────────┘ └──────────────┘
▲ │
│ ▼
│ ┌──────────────┐
└────────────────────────────────────────────────────│ 权威域名服务器 │
│ example.com │
└──────────────┘3.2 详细步骤
Step 1: 检查浏览器缓存
- 浏览器会缓存最近访问过的域名解析结果
- 如果命中,直接返回 IP,流程结束
Step 2: 检查操作系统缓存
- 浏览器未命中,查询操作系统的 DNS 缓存
- Windows:
ipconfig /displaydns - Linux: 通过
systemd-resolved或nscd缓存
Step 3: 查询本地 DNS 服务器
- 操作系统缓存未命中,向配置的 DNS 服务器发起查询
- 通常是你的路由器或 ISP 提供的 DNS(如
8.8.8.8,114.114.114.114) - 这个 DNS 服务器称为递归解析器(Recursive Resolver)
Step 4: 根域名服务器查询
- 本地 DNS 也没有缓存,向根域名服务器查询
- 全球只有 13 组根域名服务器(字母 A-M),如
a.root-servers.net - 根服务器不知道具体 IP,但知道
.com的 TLD 服务器地址
Step 5: TLD 服务器查询
- 根服务器返回
.comTLD 服务器的地址 - 本地 DNS 向 TLD 服务器查询
example.com - TLD 服务器返回
example.com的权威域名服务器地址
Step 6: 权威域名服务器查询
- 本地 DNS 向
example.com的权威服务器查询www.example.com - 权威服务器返回最终的 IP 地址
Step 7: 返回结果并缓存
- 本地 DNS 将结果返回给用户设备
- 同时在各级缓存中保存结果,设置 TTL(生存时间)
3.3 解析类型
| 类型 | 说明 |
|---|---|
| 递归查询 | 客户端只发一次请求,DNS 服务器负责全程查询 |
| 迭代查询 | DNS 服务器返回下一级服务器地址,客户端继续查询 |
实际场景中,用户设备发起递归查询,本地 DNS 服务器使用迭代查询向上级查询。
四、DNS 记录类型
DNS 数据库中存储了多种类型的资源记录(Resource Record, RR):
4.1 常见记录类型
| 记录类型 | 用途 | 示例 |
|---|---|---|
| A | IPv4 地址记录 | www.example.com. A 192.0.2.1 |
| AAAA | IPv6 地址记录 | www.example.com. AAAA 2001:db8::1 |
| CNAME | 别名记录 | blog.example.com. CNAME www.example.com. |
| MX | 邮件交换记录 | example.com. MX 10 mail.example.com. |
| NS | 域名服务器记录 | example.com. NS ns1.example.com. |
| TXT | 文本记录 | 用于 SPF、DKIM 验证 |
| SOA | 起始授权记录 | 包含区域的管理信息 |
| PTR | 反向解析记录 | IP 反查域名 |
| SRV | 服务定位记录 | 定义特定服务的服务器 |
4.2 记录详解
A 记录(Address Record)
最基础的记录,将域名指向 IPv4 地址:
www.example.com. 3600 IN A 192.0.2.13600:TTL,缓存时间(秒)IN:Internet 类A:记录类型
为一个域名创建别名:
blog.example.com. 3600 IN CNAME www.example.com.⚠️ 注意:CNAME 记录不能与其他记录共存于同一域名。
MX 记录(Mail Exchange)
指定邮件服务器:
example.com. 3600 IN MX 10 mail.example.com.
example.com. 3600 IN MX 20 mail2.example.com.- 数字越小优先级越高
10的优先级高于20
五、DNS 协议细节
5.1 传输协议
DNS 主要使用两种传输协议:
| 协议 | 端口 | 特点 |
|---|---|---|
| UDP | 53 | 默认方式,速度快,适合小数据包 |
| TCP | 53 | 区域传输或大响应时使用 |
普通查询使用 UDP,因为请求和响应都很小(通常小于 512 字节)。当响应超过 512 字节时,会切换到 TCP。
5.2 DNS 报文格式
DNS 报文分为查询(Query)和响应(Response)两种,格式相同:
+---------------------+
| Header | 12 字节
+---------------------+
| Question | 查询问题
+---------------------+
| Answer | 回答记录
+---------------------+
| Authority | 权威记录
+---------------------+
| Additional | 附加记录
+---------------------+Header 字段:
| 字段 | 长度 | 说明 |
|---|---|---|
| Transaction ID | 16 bit | 匹配请求和响应 |
| Flags | 16 bit | 标志位(QR/Opcode/AA/TC/RD/RA等) |
| QDCOUNT | 16 bit | 问题数 |
| ANCOUNT | 16 bit | 回答记录数 |
| NSCOUNT | 16 bit | 权威记录数 |
| ARCOUNT | 16 bit | 附加记录数 |
Flags 标志位:
| 位 | 名称 | 含义 |
|---|---|---|
| 0 | QR | 0=查询, 1=响应 |
| 1-4 | Opcode | 操作码(0=标准查询) |
| 5 | AA | 权威回答 |
| 6 | TC | 截断(响应超过512字节) |
| 7 | RD | 期望递归 |
| 8 | RA | 递归可用 |
5.3 使用 dig 命令查看 DNS 解析
# 基本查询
dig www.example.com
# 指定记录类型
dig example.com MX
dig example.com NS
# 跟踪完整解析过程
dig +trace www.example.com
# 指定 DNS 服务器
dig @8.8.8.8 www.example.com
# 查看响应详情
dig +all www.example.comdig 输出示例:
; <<>> DiG 9.16.1-Ubuntu <<>> www.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12345
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; QUESTION SECTION:
;www.example.com. IN A
;; ANSWER SECTION:
www.example.com. 3600 IN A 192.0.2.1
;; Query time: 23 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Wed Jun 24 08:00:00 CST 2026六、DNS 安全威胁
DNS 是互联网的基础设施,自然也成为了攻击者的目标。
6.1 DNS 劫持(DNS Hijacking)
攻击者篡改 DNS 解析结果,将用户导向恶意网站。
常见方式:
- 本地劫持:修改 hosts 文件或本地 DNS 配置
- 路由器劫持:攻击路由器,篡改 DNS 服务器地址
- ISP 劫持:某些 ISP 会劫持不存在的域名到广告页面
- DNS 服务器劫持:入侵 DNS 服务器修改记录
防护措施:
- 使用可信的 DNS 服务器(如
8.8.8.8,1.1.1.1) - 启用 DNSSEC
- 定期检查 hosts 文件
6.2 DNS 缓存投毒(DNS Cache Poisoning)
攻击者向 DNS 缓存服务器注入虚假的 DNS 记录。
原理:
- 利用 DNS 响应的不可信性
- 伪造响应包,抢在真实响应前到达
- 一旦缓存被污染,所有查询该域名的用户都会受到影响
Kaminsky 攻击(2008):
- 利用 DNS 的 Transaction ID 只有 16 位(65536 种可能)
- 通过快速猜测 ID,在窗口期内伪造响应
- 现代 DNS 已采用随机化源端口来缓解
6.3 DNS 隧道(DNS Tunneling)
利用 DNS 查询和响应传输数据,绕过防火墙。
原理:
- 将数据编码到子域名中:
data-encoded.example.com - DNS 服务器提取数据并响应
- 可以传输任意数据,包括文件、命令等
检测方法:
- 监控异常大量的 DNS 查询
- 分析子域名长度和模式
- 检查指向同一域名的异常流量
6.4 DNS 放大攻击(DNS Amplification)
利用 DNS 响应比请求大的特点,进行 DDoS 攻击。
原理:
- 发送小的 DNS 查询(约 60 字节)
- 服务器返回大的响应(可达 4000+ 字节)
- 伪造源 IP,将流量放大后导向受害者
防护:
- 限制 DNS 响应大小
- 实施源 IP 验证(BCP38)
- 禁用递归查询对公网开放
七、DNS 安全扩展(DNSSEC)
7.1 为什么需要 DNSSEC?
传统 DNS 缺乏认证机制:
- 客户端无法验证响应的真实性
- 响应可能在传输中被篡改
- 无法防止缓存投毒
DNSSEC(DNS Security Extensions) 通过数字签名解决这些问题。
7.2 DNSSEC 工作原理
DNSSEC 使用公钥加密对 DNS 记录进行签名:
┌─────────────────────────────────────────┐
│ Zone: example.com │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ ZSK (私钥) │───▶│ 签名记录 │ │
│ └─────────────┘ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ ZSK (公钥) │◀── 包含在 DNSKEY 记录中 │
│ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ KSK (私钥) │───▶│ 签名 ZSK │ │
│ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────┘关键概念:
| 术语 | 说明 |
|---|---|
| ZSK | Zone Signing Key,用于签名区域记录 |
| KSK | Key Signing Key,用于签名 ZSK |
| DNSKEY | 存储公钥的记录 |
| RRSIG | 资源记录的数字签名 |
| DS | Delegation Signer,父区域对子区域 KSK 的哈希 |
| NSEC/NSEC3 | 用于证明域名不存在(防止否定回答伪造) |
7.3 信任链
DNSSEC 建立了从根域到目标域的信任链:
根域 (.) KSK
│
├── 签名 .com 区域的 DS 记录
│
▼
.com 区域的 KSK
│
├── 签名 example.com 的 DS 记录
│
▼
example.com 的 KSK
│
├── 签名 ZSK
│
▼
example.com 的 ZSK
│
├── 签名所有记录7.4 DNSSEC 的局限
- 不加密数据:只提供认证,不保护隐私
- 增加响应大小:签名记录使 DNS 响应变大
- 部署复杂:需要密钥管理和定期轮换
- DANE:结合 DNSSEC 和 TLS,用于证书验证
八、DoH 与 DoT:加密的 DNS
DNSSEC 解决了认证问题,但没有解决隐私问题——DNS 查询仍然是明文传输的。
8.1 DNS over TLS (DoT)
使用 TLS 加密 DNS 查询:
客户端 ──TLS──▶ DNS 服务器:853- 端口:853
- 全程加密,防止中间人窃听
- 但独立的端口容易被识别和阻断
8.2 DNS over HTTPS (DoH)
通过 HTTPS 传输 DNS 查询:
客户端 ──HTTPS──▶ DoH 服务器:443- 端口:443(与普通 HTTPS 相同)
- 流量与正常网站流量混合,难以区分
- 更好的隐私保护,但也引发了一些争议
8.3 对比
| 特性 | DoT | DoH |
|---|---|---|
| 端口 | 853 | 443 |
| 传输层 | TLS | HTTPS |
| 隐蔽性 | 低 | 高 |
| 部署难度 | 简单 | 较复杂 |
| 应用场景 | 系统级 | 浏览器级 |
8.4 配置 DoH
Firefox:
设置 → 网络设置 → 启用基于 HTTPS 的 DNS
选择提供商:Cloudflare, NextDNS 等Chrome:
设置 → 隐私和安全 → 安全 → 使用安全 DNS九、实际应用场景
9.1 负载均衡
通过 DNS 实现简单的负载均衡:
www.example.com. 300 IN A 192.0.2.1
www.example.com. 300 IN A 192.0.2.2
www.example.com. 300 IN A 192.0.2.3客户端会随机使用其中一个 IP,实现流量分发。
9.2 CDN 加速
CDN 利用 DNS 将用户导向最近的边缘节点:
用户在北京 ──▶ DNS 返回北京节点 IP
用户在上海 ──▶ DNS 返回上海节点 IP通过智能 DNS 解析,根据用户地理位置返回最优 IP。
9.3 故障转移
通过动态修改 DNS 记录实现故障转移:
正常: www.example.com ──▶ 192.0.2.1 (主)
故障: www.example.com ──▶ 192.0.2.2 (备)9.4 内网 DNS
企业内网通常部署私有 DNS:
- 解析内部域名(如
intranet.company.com) - 屏蔽恶意域名
- 分流内外网流量
十、总结
DNS 是互联网的"电话簿",虽然用户几乎感知不到它的存在,但每一次网页访问、每一封邮件发送都离不开它。
核心要点:
- 分布式设计:DNS 采用层次化的分布式架构,保证了扩展性和可靠性
- 缓存机制:多级缓存加速解析,但也带来了 TTL 和一致性问题
- 安全挑战:DNS 劫持、缓存投毒、隧道等攻击威胁持续存在
- 安全增强:DNSSEC 提供认证,DoH/DoT 提供加密,共同提升 DNS 安全性
- 深入了解 DNSSEC 的部署和配置
- 学习使用 BIND、CoreDNS 等 DNS 服务器软件
- 探索基于 DNS 的安全检测和威胁情报
📚 系列文章索引网络安全系列正在持续更新中,涵盖 Web 安全、认证授权、前端安全、密码学、渗透测试等多个方向。欢迎持续关注!
本文发表于 2026-06-24,如有错误欢迎指正。