提供主机名到 IP 地址的转换
- 端口 53
- 默认使用 UDP,可以显式指定 TCP
分层 DNS 服务器
能够防止单点故障,提升通信容量,提升可维护性
DNS 查询
DNS 查找通常会经过下面四步:
- 询问 Resolver
- 询问根服务器
- 询问顶级域名服务器
- 询问次级域名服务器
以用户访问 www.example.com
为例:
- 客户端向递归服务器发起请求:
“
www.example.com
的 IP 是什么?” - 递归服务器查询根服务器:
根服务器返回
.com
的 TLD 服务器地址。 - 递归服务器查询 TLD 服务器:
TLD 服务器返回
example.com
的权威服务器地址。 - 递归服务器查询权威服务器:
权威服务器返回
www.example.com
的 IP 地址。 - 递归服务器缓存结果,并将 IP 返回客户端。
或者使用迭代查询的方法:
解析记录
- A
- 将域名直接转换为 ipv4
- AAAA
- 将域名转换为 ipv6
- CNAME
- 将别名转换为其他别名
- MX (Mail Exchange Record)
- 指定接收该域名邮件的 邮件服务器地址
plaintext example.com MX 10 mail.example.com
- NS (Name Server)
- 指定管理该域名的 权威 DNS 服务器
- TXT
- 存储文本信息
- 常用于验证域名所有权、配置 SPF/DKIM/DMARC(反垃圾邮件)
- PTR (Pointer Record)
- 反向解析,将 IP 地址映射回域名(用于邮箱服务器验证)
报文格式
1. 头部(Header)
固定 12 字节,包含控制信息和各部分的记录数:
- 标识符(Transaction ID)(16 位):唯一标识查询与响应的匹配。
- 标志(Flags)(16 位):包含多个控制字段:
- QR(1 位):
0
表示查询,1
表示响应。 - Opcode(4 位):操作类型(如标准查询、反向查询)。
- AA(1 位):权威回答(仅响应中有效)。
- TC(1 位):截断标志(响应过长时置 1,需改用 TCP)。
- RD(1 位):客户端请求递归查询。
- RA(1 位):服务器支持递归查询。
- RCode(4 位):响应码(如
0
无错误,3
域名不存在)。
- QR(1 位):
- 问题数(QDCOUNT)(16 位):问题部分的记录数(通常为 1)。
- 回答数(ANCOUNT)(16 位):回答部分的资源记录数。
- 授权数(NSCOUNT)(16 位):授权部分的记录数。
- 额外信息数(ARCOUNT)(16 位):额外信息部分的记录数。
2. 问题部分(Question)
查询域名及相关信息,每个问题记录的格式:
- 查询域名(QNAME):域名按标签分割(如
www.example.com
转换为3www7example3com0
),每个标签以长度前缀开头,末尾用0
终止。 - 查询类型(QTYPE)(16 位):记录类型(如
A
=1,AAAA
=28,MX
=15)。 - 查询类(QCLASS)(16 位):通常为
IN
(Internet,值为 1)。
3. 回答(Answer)、授权(Authority)、额外信息(Additional)
这三个部分包含资源记录(Resource Record, RR),格式相同:
- 域名(NAME)(可变长):与查询域名相同,可能使用压缩格式(用偏移指针指向之前出现的位置,如
0xC00C
表示从报文第 12 字节开始)。 - 类型(TYPE)(16 位):记录类型(同 QTYPE)。
- 类(CLASS)(16 位):通常为
IN
。 - 生存时间(TTL)(32 位):缓存有效期(秒)。
- 数据长度(RDLENGTH)(16 位):数据部分的字节数。
- 数据(RDATA)(可变长):根据类型不同而不同:
- A 记录:IPv4 地址(4 字节)。
- AAAA 记录:IPv6 地址(16 字节)。
- CNAME 记录:别名域名(压缩格式)。
- MX 记录:邮件服务器优先级 + 域名。
- NS 记录:权威 DNS 服务器域名。
DNS-over-HTTPS(DoH)
- 协议:通过 HTTPS 封装 DNS 查询,使用 TCP 443 端口(与 HTTPS 网站共用端口)。
- 特点:
- 流量伪装成普通 HTTPS 流量,绕过防火墙或 ISP 的 DNS 审查。
- 依赖 HTTP/2 或 HTTP/3 协议,支持多路复用和高效传输。
- 示例:
请求:GET /dns-query?dns=... HTTP/2
主机:dns.google
DNS-over-TLS(DoT)
- 协议:通过 TLS 加密的 TCP 连接,使用 TCP 853 端口。
- 特点:
- 专用端口易被识别和封锁(如某些国家/网络限制)。
- 加密性等同于 DoH,但流量特征更明显。