11TCP/IP详解(卷1:协议)

DNS

域名系统

域名DNS查询DNS记录

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第11章:DNS(Domain Name System)

域名系统

一、导读

1.1 本章学习目标

第11章深入讲解DNS(域名系统)——互联网的核心基础设施之一。DNS负责将人类可读的域名(如 www.example.com)转换为机器可读的IP地址。几乎所有网络应用都依赖DNS:浏览网页、发送邮件、远程登录,甚至手机App的数据请求,都需要先通过DNS解析域名。

本章的核心学习目标包括:

  • 理解DNS的层次化命名空间:根域、顶级域、二级域、子域的树状结构
  • 掌握DNS查询的完整过程:递归查询与迭代查询的区别和协作
  • 深入理解DNS记录类型:A、AAAA、CNAME、MX、NS、PTR、TXT等
  • 掌握DNS报文格式:查询和响应的结构、标志位的含义
  • 理解DNS缓存机制:本地缓存、递归服务器缓存、TTL的作用
  • 了解DNS安全威胁:DNS欺骗、DNS劫持、DNSSEC的作用

1.2 为什么本章如此重要

DNS是互联网最重要的基础设施之一。没有DNS,你需要记住每个网站的IP地址才能访问。DNS的性能直接影响用户体验——DNS解析延迟是网页加载时间的重要组成部分。DNS的安全性直接关系到整个互联网的信任链。

理解DNS对于以下方面至关重要:

  • Web开发:理解域名解析、CDN、负载均衡
  • 网络管理:配置DNS服务器、排查解析问题
  • 网络安全:理解DNS欺骗、DNS隧道等攻击手段
  • 系统管理:配置 /etc/resolv.conf、理解名称解析顺序

1.3 核心问题引导

在阅读本章时,请带着以下问题思考:

DNS为什么使用UDP而不是TCP?什么情况下DNS会使用TCP?

递归查询和迭代查询有什么区别?为什么根域名服务器只接受迭代查询?

如果DNS缓存中的记录是过期的(TTL已过),会发生什么?

CNAME记录和A记录有什么区别?为什么CNAME不能与其他记录共存?

DNS的反向查询是如何工作的?为什么需要反向查询?

DNS欺骗是如何实现的?DNSSEC如何解决这个问题?


二、核心概念详解

2.1 DNS的层次化命名空间

DNS使用树状的层次化命名空间:

. (根域)
          /|\
         / | \
       com org net ...     ← 顶级域(TLD)
       /|\
      / | \
  example google github    ← 二级域
     /|\
    / | \
  www mail ftp             ← 子域/主机名

完整域名(FQDN)从叶子到根:www.example.com.

最后的点表示根域,通常省略。

2.1.1 域名层级

层级示例管理机构
根域.ICANN
顶级域.com, .org, .cn注册局
二级域example.com注册商/域名持有者
子域www.example.com域名持有者

2.1.2 域名解析器

当应用程序需要解析域名时,它向本地DNS服务器(也称为递归DNS服务器)发送递归查询。本地DNS服务器负责完成整个解析过程,最终将结果返回给应用程序。

本地DNS服务器可以是:

  • ISP提供的DNS服务器
  • 公共DNS(如8.8.8.8、114.114.114.114)
  • 自建DNS服务器(如dnsmasq、BIND)

2.2 DNS查询过程

2.2.1 递归查询与迭代查询

递归查询:客户端向本地DNS服务器发送递归查询,本地DNS服务器必须返回最终结果(IP地址或错误)。

迭代查询:本地DNS服务器向根服务器发送迭代查询,根服务器返回"你应该去问谁"的引用(referral),本地DNS服务器继续向下一级查询,直到获得最终结果。

客户端 → 本地DNS(递归查询)
本地DNS → 根服务器(迭代查询)→ 返回.com服务器地址
本地DNS → .com服务器(迭代查询)→ 返回example.com服务器地址
本地DNS → example.com服务器(迭代查询)→ 返回www.example.com的IP
本地DNS → 客户端(返回最终结果)

2.2.2 完整解析流程

解析 www.example.com 的完整过程:

1. 客户端检查本地缓存(/etc/hosts、浏览器缓存、操作系统缓存)
2. 缓存未命中,向本地DNS服务器发送递归查询
3. 本地DNS服务器检查本地缓存
4. 缓存未命中,向根服务器查询 www.example.com
5. 根服务器返回 .com 顶级域服务器的地址(referral)
6. 本地DNS向 .com 服务器查询 www.example.com
7. .com 服务器返回 example.com 权威服务器的地址(referral)
8. 本地DNS向 example.com 权威服务器查询 www.example.com
9. 权威服务器返回 www.example.com 的A记录(IP地址)
10. 本地DNS缓存结果,返回给客户端

2.3 DNS记录类型

记录类型用途示例
AIPv4地址www.example.com → 93.184.216.34
AAAAIPv6地址www.example.com → 2606:2800:220:1:248:1893:25c8:1946
CNAME别名blog.example.com → www.example.com
MX邮件服务器example.com → mail.example.com (优先级10)
NS名称服务器example.com → ns1.example.com
PTR反向解析34.216.184.93.in-addr.arpa → www.example.com
TXT文本信息example.com → "v=spf1 include:_spf.google.com ~all"
SRV服务定位_sip._tcp.example.com → sip.example.com:5060

2.3.1 A记录和AAAA记录

A记录将域名映射到IPv4地址,AAAA记录映射到IPv6地址。一个域名可以有多个A/AAAA记录,实现简单的负载均衡。

2.3.2 CNAME记录

CNAME将一个域名指向另一个域名(别名)。解析时会先解析目标域名,再获取IP地址。

blog.example.com  CNAME  www.example.com
www.example.com   A      93.184.216.34

注意:CNAME记录不能与其他记录共存于同一域名。如果一个域名有CNAME记录,就不能有MX、TXT等记录。

2.3.3 MX记录

MX记录指定邮件服务器和优先级:

example.com  MX  10  mail1.example.com
example.com  MX  20  mail2.example.com

数字越小优先级越高。发送方先尝试优先级最高的邮件服务器。

2.4 DNS报文格式

DNS报文使用UDP传输(端口53),报文格式如下:

0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Transaction ID                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Q| Opcode  |A|T| R|Z|A|C|     |          Question Count       |
|R|         |A|C| A| |A|D|     |                               |
| |         | | |  | |D| |     |                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Answer Count                                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Authority Count                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Additional Count                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Question Section                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Answer Section                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Authority Section                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                  Additional Section                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

关键字段:

  • Transaction ID:事务ID,用于匹配查询和响应
  • QR:0=查询,1=响应
  • Opcode:0=标准查询,1=反向查询,2=服务器状态请求
  • RD(Recursion Desired):1=请求递归
  • RA(Recursion Available):1=服务器支持递归
  • RCODE:响应码(0=无错误,3=名称不存在)

2.5 DNS缓存

DNS缓存是DNS系统高效运行的关键。各级缓存:

缓存位置TTL控制说明
浏览器缓存响应头通常几十秒到几分钟
操作系统缓存DNS TTL/etc/hosts优先
本地DNS服务器DNS TTL缓存权威服务器的响应
递归DNSDNS TTLISP的DNS服务器缓存

2.5.1 TTL的作用

TTL(Time To Live)指定缓存记录的有效时间(秒)。TTL过期后,缓存必须重新查询。

example.com  A  93.184.216.34  TTL=3600

表示该A记录可以缓存3600秒(1小时)。

TTL的设置需要权衡:

  • 短TTL:记录更新快生效,但查询量大
  • 长TTL:减少查询量,但更新生效慢

2.6 反向DNS查询

反向查询从IP地址查找域名,使用PTR记录。

2.6.1 反向查询域

IPv4的反向查询使用 in-addr.arpa 域,IP地址反转:

IP: 93.184.216.34
反向查询域名: 34.216.184.93.in-addr.arpa
PTR记录: 34.216.184.93.in-addr.arpa → www.example.com

2.6.2 反向查询的用途

  • 邮件服务器验证(反垃圾邮件)
  • 日志分析(将IP转换为域名)
  • 安全审计
bash
# 反向DNS查询
dig -x 8.8.8.8
# 8.8.8.8.in-addr.arpa. PTR dns.google.

host 8.8.8.8
# 8.8.8.8.in-addr.arpa domain name pointer dns.google.

2.7 DNS安全

2.7.1 DNS欺骗(DNS Spoofing)

攻击者伪造DNS响应,将域名解析到恶意IP地址:

客户端 → 本地DNS:查询 www.bank.com
攻击者 → 客户端:伪造响应 www.bank.com → 1.2.3.4(攻击者的服务器)

用户访问假网站,输入账号密码,被攻击者窃取。

2.7.2 DNSSEC

DNSSEC(DNS Security Extensions)通过数字签名验证DNS响应的真实性:

  • 权威服务器对DNS记录进行签名
  • 递归服务器验证签名
  • 建立从根域到叶子域的信任链

2.7.3 DNS over HTTPS/TLS

DoH(DNS over HTTPS)和DoT(DNS over TLS)加密DNS查询,防止中间人窃听和篡改。


三、实战案例

3.1 案例一:使用dig查询DNS

bash
# 查询A记录
dig www.example.com A
# ;; QUESTION SECTION:
# ;www.example.com.              IN      A
# ;; ANSWER SECTION:
# www.example.com.       3600    IN      A       93.184.216.34

# 查询MX记录
dig example.com MX
# ;; ANSWER SECTION:
# example.com.           3600    IN      MX      10 mail.example.com.

# 查询所有记录
dig example.com ANY

# 指定DNS服务器
dig @8.8.8.8 www.example.com

# 反向查询
dig -x 8.8.8.8

# 跟踪迭代查询过程
dig +trace www.example.com

3.2 案例二:使用tcpdump观察DNS查询

bash
sudo tcpdump -i eth0 -nn 'udp port 53'

输出示例:

12:34:56.789 IP 192.168.1.100.50000 > 8.8.8.8.53:
  12345 [1au] A? www.example.com. (34)

12:34:56.815 IP 8.8.8.8.53 > 192.168.1.100.50000:
  12345 1/0/0 A 93.184.216.34 (50)

3.3 案例三:配置本地DNS(dnsmasq)

bash
# 安装
sudo apt install dnsmasq

# 配置 /etc/dnsmasq.conf
# server=8.8.8.8
# server=8.8.4.4
# cache-size=1000
# address=/local.test/192.168.1.100

# 启动
sudo systemctl start dnsmasq

四、常见误区与难点

4.1 误区一:"DNS只使用UDP"

DNS主要使用UDP(端口53),但当响应数据大于512字节时(如DNSSEC签名、大量记录),会使用TCP。区域传输(zone transfer)也使用TCP。

4.2 误区二:"修改了DNS记录立即生效"

DNS记录有TTL,全球各级DNS服务器缓存过期前,仍然会返回旧的记录。修改DNS记录后,需要等待TTL过期才能全球生效。

4.3 难点:理解DNS的信任链和DNSSEC

DNSSEC通过数字签名建立从根域到叶子域的信任链。理解它需要理解公钥密码学和证书链的概念。


五、本章小结

第11章深入讲解了DNS:

DNS使用层次化命名空间:根域→顶级域→二级域→子域,FQDN唯一标识一个主机。

DNS查询结合递归查询(客户端到本地DNS)和迭代查询(DNS服务器之间),高效完成域名解析。

DNS记录类型丰富:A/AAAA(地址)、CNAME(别名)、MX(邮件)、NS(名称服务器)、PTR(反向)等。

DNS缓存通过TTL控制有效期,减少查询量,提高解析速度。

DNS安全面临欺骗、劫持等威胁,DNSSEC和DoH/DoT提供安全增强。


六、思考与练习

思考题

如果根域名服务器全部宕机,互联网会瘫痪吗?为什么?(提示:DNS缓存和根服务器提示)

为什么DNS的根服务器只有13个逻辑地址?为什么不用更多?(提示:UDP报文限制和anycast技术)

CNAME和ALIAS/ANAME记录有什么区别?为什么有些DNS服务商引入了ALIAS记录?

如果你负责一个大型网站的DNS架构,你会如何设计以实现高可用和低延迟?

练习题

使用dig查询各种DNS记录类型(A、AAAA、MX、NS、TXT),分析查询结果。

使用 dig +trace 跟踪完整的迭代查询过程,记录每一跳的referral信息。

使用tcpdump观察DNS查询和响应,分析报文格式中的关键字段。

11/13DNS
0%