CalcGuide · 技术博客主页 / 一页纸学习计划
🔥极高

DNS 与命名:从根服务器到本地解析

分类:计算机基础 · 路径:docs/topics/dns-and-naming/README.md

#dns#naming#doh#dot#authoritative#recursive

理解 DNS 层级、递归/迭代解析、TTL 与缓存、DNSSEC、DoH/DoT,能用 dig/nslookup/dnspy 排查

父主题

计算机网络:从物理层到 HTTP/3 的全栈协议与排查

子主题(0)

DNS 与命名:从根服务器到本地解析

0. 元信息

1. 学习路线

DNS 角色与层级(根 / TLD / 权威 / 递归)
  → 报文格式:Header / Question / Answer / Authority / Additional
  → 资源记录类型:A / AAAA / CNAME / MX / NS / TXT / SOA / PTR / SRV / OPT
  → 解析流程:递归 vs 迭代;glue record;粘合记录
  → 缓存与 TTL:Negative TTL、TTL 失效、CDN 调度
  → 权威与区域传送:AXFR / IXFR;主从同步
  → DNSSEC:DS / DNSKEY / RRSIG / NSEC;信任链
  → 加密 DNS:DoT(853/TCP)/ DoH(443/TCP+HTTPS)/ DoQ(853/UDP)
  → 排障与生态:BIND / Unbound / CoreDNS / dnsmasq / systemd-resolved

每一步都要 dig +trace 一次真实的域名。DNS 不抓包只背字段,永远记不住——看到 wire format 字节流才算入门。

2. 阶段周数分配

阶段3 周方案4 周方案备注
1. 层级与角色0.5 周0.75 周看根、TLD、权威三层;理解 NS 与 glue
2. 报文与 RR0.5 周0.75 周tcpdump -X udp port 53 对照 RFC 1035
3. 递归与迭代0.5 周0.5 周dig +trace + dig +norecurse 区分
4. 缓存与 TTL0.5 周0.5 周改 TTL 观察命中;CNAME 链追踪
5. 区域传送0.5 周0.5 周dig AXFR 拉一次主区域(白名单域)
6. DNSSEC0.5 周0.75 周验证链、DS 记录、“ 工具
7. 加密 DNS0.25 周0.25 周DoT 与 DoH 抓包对比明文 DNS
8. 排障与生态0.25 周0.5 周BIND/Unbound/CoreDNS 配置与日志

3. 九阶段表

阶段核心知识实践产出可观察学会标准
1. 层级根(13 组 a-m.root-servers.net)、TLD(gTLD/ccTLD)、权威 NS、递归 resolver一张「example.com」的解析路径图能说出 .com 的 13 组根中任意一组的 IP
2. 报文Header 12 字节、Question/Answer/Authority/Additional 四段、资源记录 5 元组一份 hexdump 标注每段能从十六进制找到 QR / Opcode / AA / TC / RD / RA
3. 解析流程递归(client → resolver → 权威迭代)、迭代(resolver 自上而下查)、glue recorddig +trace 全过程记录能解释为什么 NS 记录要附 A 记录(glue)
4. 缓存TTL、Negative TTL、CNAME 链、CDN 调度(基于 DNS 地理位置)不同 TTL 值的两次 dig 对比能解释「DNS 改了不生效」
5. 区域传送AXFR / IXFR、SOA、主从同步、TSIGdig @ns1.example.com AXFR example.com能从 SOA 看到主从、serial、refresh
6. DNSSECDNSKEY / RRSIG / DS / NSEC / NSEC3;信任锚;验证链delv +rtrace example.comdig +dnssec能解释 KSK/ZSK 分层与轮换
7. 加密 DNSDoT(RFC 7858)走 853/TCP、DoH(RFC 8484)走 443/TCP+HTTPS、DoQ(RFC 9250)走 853/UDPkdig @1.1.1.1 +tlscurl --doh-url能说出 DoH 与 DoT 各自的隐私边界
8. 排障dig 选项、systemd-resolvednsswitch.conf、hosts 文件优先级一次完整故障定位报告30 分钟内定位未知解析问题
9. 综合私有 zone + 签名 + DoH forwarder 串联自建签名 zone 配 DoH 转发能解释每段链路的认证状态

4. 第一周任务

任务当天交付
Day 1dig . NS 看 13 组根;dig com NS.com 顶级;dig example.com NS 看权威三段 dig 输出 + IP 列表
Day 2dig +trace example.com 看完整路径;记录每一跳的 server、A、TTL+trace 全过程
Day 3tcpdump -ni any -X udp port 53 抓一次 dig,对照 RFC 1035 §4 标注 Header 12 字节hexdump 标注
Day 4dig -x 8.8.8.8 看反向解析;dig AAAA example.com 看 IPv6;dig CNAME www.example.com三次反向/类型查询
Day 5dig @1.1.1.1 dnssec example.com 看 RRSIG;delv +rtrace +v4 example.com 看验证链DNSSEC 验证输出
Day 6kdig @1.1.1.1 +tls example.com 抓 DoT;curl --doh-url https://1.1.1.1/dns-query https://example.com 抓 DoHDoT/DoH 抓包对比
Day 7项目:抓一次完整解析链:本机 → 1.1.1.1(DoT)→ 根 → .com → 权威,全程 tcpdump -w 保存pcap + 标注

Day 7 拆解

步骤 A —— 最小可用(60 分钟)

  1. tcpdump -ni any -w /tmp/dns.pcap port 53 or port 853 抓 60 秒;
  2. dig +trace example.com
  3. tcpdump -r /tmp/dns.pcap -vv 列出请求与应答;
  4. 标注 Header 12 字节中的 QR / RD / RA / ID。

步骤 B —— 补齐边界(30 分钟)

进阶:稳定通过后,加 dnsperf 或自定义脚本对同一域名打 100 次请求,看缓存命中。

5. 阶段通用验收

  1. 不看 RFC 也能画出 DNS Header 12 字节字段分布;
  2. 用自己的话解释「为什么 NS 记录要附 A 记录(glue)」;
  3. 画一张图:client → recursive → root → TLD → authoritative 每跳查询的内容;
  4. 测试异常:NXDOMAIN(不存在域名)、SERVFAIL(权威宕机)、REFUSED(策略拒绝);
  5. 准备 3 组自定义数据:CNAME 链、MX 优先级、DNSSEC 失败;
  6. 记录每次抓包的 BPF 过滤器和命令;
  7. 能修改 /etc/hosts/etc/resolv.conf 影响解析路径,而不是只能照抄。

6. 最终验收

7. 综合项目

首选:DNSSEC 验证失败定位(必做:在两台 Linux 上用 unboundbind 配一个故意签名错误的子域,用 “ + tcpdump 定位链断裂点)。

备选

综合项目必做要求:

  1. 场景描述:网络拓扑、预期行为、实际行为;
  2. 工具选择理由:为什么用 unbound 而不是 bind?为什么用 tcpdump 而不是 wireshark GUI?
  3. 核心分析:每一跳的现象、判断依据、根因定位;
  4. 复现脚本:可重复运行的 unbound.conf / coredns Corefile / dig 命令;
  5. 边界测试:换 RR 类型(A / AAAA / MX / TXT)、换方向(正向 / 反向)、换 DO 模式(明文 / DoT / DoH);
  6. 运行说明:环境依赖(bind-utils / unbound / ldns / dnsutils)、复现步骤;
  7. README:项目介绍、目录结构、复盘;
  8. 复盘记录:用时、难点、收获、下一步。

本主题贡献

本主题沉淀 DNS 层级、DNS 递归 / 迭代解析、TTL 缓存、DNSSEC 信任链与 DoH / DoT 加密扩展的工程化,所有结论用 dig +trace + tcpdump + “ + kdig +tls 三角验证。

职责(3 项)

  1. 画 DNS Header 12 字节字段(ID/QR/Opcode/AA/TC/RD/RA/RCODE + QDCOUNT/ANCOUNT/NSCOUNT/ARCOUNT),能解释 NS 记录的 glue A 记录为什么必须有、TLD 委派胶水如何解决「找 NS 又要找 NS 的 NS」死循环;
  2. 区分 DNS 递归(client → resolver 代查 + 缓存)与迭代(resolver 自上而下查),用 dig +trace 看每一跳的 server 与 RR,能解释 TTL 不生效与 systemd-resolved 缓存的边界,以及 dig +nocache 强制绕过;
  3. 验 DNSSEC 信任链(DS 在父域签、DNSKEY/RRSIG 在子域签),用 delv +rtrace +v4 验证失败定位,能解释 DoH/DoT 与 DNSSEC 的关系(前者加密、后者防篡改,两者正交)。

交付物(4 项)

  1. dig +trace example.com 完整路径记录,每跳 server/A/TTL/flags 标注,对照 RFC 1035 §4.1.1;
  2. 明文 DNS(UDP 53)+ DoT(TCP 853)+ DoH(TCP 443 + HTTPS)三协议抓包对比(tcpdump -ni any -X 'port 53 or tcp port 853 or tcp port 443');
  3. DNSSEC 验证失败定位报告(自签一个故意时间窗口错的 zone,用 “ 看 SERVFAIL 根因);
  4. Unbound / CoreDNS 配置 + DoH forwarder 串联的私有 zone(自签 + 签名 + 验证),含每段链路的认证状态说明。

指标(3 项)

  1. DNS 解析 P95 ≤ 50 ms(本地 resolver + 缓存命中);
  2. DNS 缓存命中率 ≥ 80%(同一域名短时间内多次查询命中缓存);
  3. DNSSEC 验证失败率 ≤ 0.1%(除故意实验外的 SERVFAIL 比例)。

8. 推荐开源资料(按角色分工)

角色资料链接用法
RFC 原文RFC 1034 / 1035(DNS)https://www.rfc-editor.org/rfc/rfc1034概念与报文
RFC 原文RFC 4033 / 4034 / 4035(DNSSEC)https://www.rfc-editor.org/rfc/rfc4033DNSSEC 三件套
RFC 原文RFC 7858(DoT)https://www.rfc-editor.org/rfc/rfc7858TLS 上的 DNS
RFC 原文RFC 8484(DoH)https://www.rfc-editor.org/rfc/rfc8484HTTPS 上的 DNS
RFC 原文RFC 9250(DoQ)https://www.rfc-editor.org/rfc/rfc9250QUIC 上的 DNS
工具手册ISC BIND 文档https://www.isc.org/bind/bind 配置文件
工具手册NLnet Labs Unboundhttps://nlnetlabs.nl/projects/unbound/about/验证递归 + DNSSEC
工具手册ldns / drillhttps://nlnetlabs.nl/projects/ldns/about/DNSSEC 验证工具
工具手册CoreDNShttps://coredns.io/manual/toc/云原生权威 / 转发
中文讲解阿里云 DNS 文档https://help.aliyun.com/document_detail/58130.html云 DNS 入门
实验环境DNS-OARChttps://www.dns-oarc.net/根与公共 resolver 测速
抓包练习Wireshark 官方样例 pcaphttps://wiki.wireshark.org/SampleCapturesDNS / DoT 真实报文

许可证提示:Wireshark 样例 pcap 是公开教学资源;BIND 是 MPL-2.0;Unbound 是 BSD-3-Clause;CoreDNS 是 Apache-2.0。复制或参考配置前先确认许可证。

源码阅读时机:Unbound 源码放到「阶段 8(排障)」之后再读;RFC 原文从 Day 1 就开始对照,但不要一次通读所有 RFC——按当前阶段挑相关章节。

9. 学习资料汇聚(v0.3 自包含)

本节内容基于公开 RFC、ISC/NLnet Labs 文档与个人整理,标注「由本计划生成」处为计划自写。本节是子主题自包含的最后一节,不再依赖 notes/ 子目录。

9.1 背景与动机

9.2 概念地图

flowchart LR
  Client[应用 / OS resolver] --> Stub[stub resolver]
  Stub -->|UDP 53 / TCP 53 / DoT / DoH| Rec[recursive resolver]
  Rec --> Root[根服务器]
  Rec --> TLD[TLD 权威]
  Rec --> Auth[权威 NS]
  Root --> TLD
  TLD --> Auth
  Auth --> Glue[glue A/AAAA]
  Auth --> SOA[SOA 主从]
  Auth --> AXFR[AXFR/IXFR]
  Rec --> Cache[(缓存 + TTL)]
  Auth --> DNSSEC[RRSIG/DS/DNSKEY]
  Rec --> Verify{验证链}
  Stub --> Hosts[/etc/hosts/]
  Stub --> NSS[nsswitch.conf]

关系说明:

9.3 基础知识讲解

经典论文 / 经典书籍 / 优秀博客 / 核心人物 / 开发方法 五大类,每类 ≥3 条。

经典论文 / RFC(必读)

资料角色评分链接
RFC 1034 — Domain Names (Concepts)DNS 概念与分层5https://www.rfc-editor.org/rfc/rfc1034
RFC 1035 — Domain Names (Implementation)报文与 RR5https://www.rfc-editor.org/rfc/rfc1035
RFC 4033 / 4034 / 4035 — DNSSEC签名链三件套5https://www.rfc-editor.org/rfc/rfc4033
RFC 6891 — EDNS(0)OPT 伪 RR、扩展机制4https://www.rfc-editor.org/rfc/rfc6891
RFC 7858 — DoTTLS 上的 DNS4https://www.rfc-editor.org/rfc/rfc7858
RFC 8484 — DoHHTTPS 上的 DNS4https://www.rfc-editor.org/rfc/rfc8484
RFC 9250 — DoQQUIC 上的 DNS4https://www.rfc-editor.org/rfc/rfc9250
RFC 5936 — AXFR区域传送3https://www.rfc-editor.org/rfc/rfc5936

经典书籍(系统化)

资料角色评分链接
《DNS and BIND》(Cricket Liu / Paul Albitz)DNS 圣经5https://www.oreilly.com/library/view/dns-and-bind/0596001584/
《Computer Networking: A Top-Down Approach》(Kurose & Ross)应用层章节4https://gaia.cs.umass.edu/kurose_ross/
《TCP/IP 详解 卷 1》(Richard Stevens)DNS 报文详解5https://www.amazon.com/TCP-Illustrated-Volume-Protocols/dp/0321336313
《Linux 高性能服务器编程》(游双)resolver 实现4https://book.douban.com/subject/24722642/

优秀博客(按问题查)

资料角色评分链接
Cloudflare Learning — DNS概念图解4https://www.cloudflare.com/learning/dns/what-is-dns/
Julia Evans「DNS!」zine命令可视化5https://jvns.ca/dns-zine.pdf
APNIC Blog — DNS 系列运营商视角4https://blog.apnic.net/
ISC Knowledge BaseBIND 实战4https://kb.isc.org/docs
阿里云 DNS 文档国内云 DNS 实践4https://www.alibabacloud.com/help/en/dns
1.1.1.1 文档公共 resolver 行为4https://developers.cloudflare.com/1.1.1.1/

核心人物(知道谁定的规范)

人物贡献关键出处
Paul MockapetrisDNS 发明者RFC 882 / 883(1983)
Jon PostelRFC 编辑、协议体系奠基RFC 920 等 DNS 早期
Dan Kaminsky2008 缓存投毒漏洞披露推动了 DNSSEC 强制验证
Cricket LiuBIND 维护者与《DNS and BIND》作者O’Reilly 经典
W. Richard Stevens《TCP/IP 详解》《UNIX 网络编程》工程师人手一本
Olaf KolkmanDNSSEC 部署推动者NLnet Labs / IETF DNSOP

开发方法(动手习惯)

方法适用关键点
dig +trace 全过程学习路径看到每一跳的 server 与 RR
tcpdump 对照报文学习 wire formathexdump 比图快 10 倍
RR 字段级标注抓包复盘dig +multi 看人类可读格式
TTL 对比排障同一域名两次 dig,看 ANSWER TTL 是否变
+dnssec / “DNSSEC 验证显式开 validating stub
DoH/DoT 抓包加密 DNS 验证看 SNI 与 TLS 握手确认上游
AXFR 拉 zone学习 RR 全集注意绝大多数域禁止 AXFR

缺失部分:bind 配置文件的 view / rndc 命令细节、unboundlocal-zone 语义。本计划不重写工具手册;查 man named.conf / man unbound.conf 即可。

9.4 经典问题与经典案例

#问题为什么会重要最简答案
1DNS 改了不生效TTL 没过期或 recursive 缓存看权威 TTL;强制 dig +nocache
2NXDOMAIN vs NODATA一个是「不存在」,一个是「存在但无此 RR」NXDOMAIN 在 Header;NODATA 在 Answer
3CNAME 与其他 RR 冲突RFC 1034 规定 CNAME 不能与任何 RR 共存MX 必须在 A 记录所在名,CNAME 不能同名
4Glue record 缺失TLD NS 记录指向未在 TLD zone 的名字注册商在 NS 旁附加 A/AAAA(glue)
5缓存投毒攻击者伪造权威应答抢先到DNSSEC 验证来源 + 端口随机化
6DNSSEC 验证失败NSEC3 缺失或时间窗口错看 RRSIG 起始/结束时间、DS 链
7AXFR 被滥用拉走整个 zone 做侦察用 TSIG + ACL 限制传送
8DoH 与 split-horizon企业内网域名走 DoH 解析不到内网保留 stub resolver,明文走内网
9UDP 53 被丢防火墙常误杀 DNS改 TCP 53 或直接 DoH/DoT
10NS 记录递归环父与子互相指向resolver 检测到环返回 SERVFAIL
11EDNS(0) 不支持老旧解析器丢大响应强制 TCP 或禁用 EDNS
12子域委托胶水缺失ns1.example.com 找不到注册商添加 glue A 记录

9.5 学习难点

概念难点

难点为什么会卡突破路径
递归 vs 迭代两个词听起来一样用「代查 + 缓存 = 递归」「自上而下 = 迭代」记
CNAME 链追踪多层 CNAME 容易乱dig +trace 看 CNAME 链展开
Glue record为什么 NS 旁边要 A 记录画「找 NS 又要找 NS 的 NS」死循环
DNSSEC 信任链DS / DNSKEY / RRSIG 关系用「DS 在父域签、DNSKEY 自己签 RRSIG」记
TTL 与负缓存Negative TTL 是另一个字段看 SOA 的 minimum 字段

思维难点

难点为什么会卡突破路径
Header 字段12 字节 6 个 flag 记不住抓一个包对照 RFC 1035 §4.1.1 标一遍
RR 5 元组Name / Type / Class / TTL / RDLENGTH / RDATA写一个 Python dnspython 解析函数
权威 vs 递归谁负责什么画「client → recursive → authoritative」三角
DNSSEC vs DoH都「加密」其实不一样DNSSEC 防篡改、DoH/DoT 防偷听

工程难点

难点为什么会卡突破路径
dig 输出太长ANSWER/AUTHORITY/ADDITIONAL 三段+noall +answer / +authority 切片
tcpdump BPF 写错端口过滤不到udp port 53 or tcp port 53 or tcp port 853 or tcp port 443
DoT/DoH 抓不到用了 UDP 53 BPFtcp port 853;DoH 走 443 看 HTTP/2 stream
systemd-resolved 缓存dig 看到 stale 答案resolvectl flush-caches
nsswitch.conf 顺序hosts 先于 DNShosts: files dns 顺序
DNSSEC 时间窗RRSIG 过期delv +rtrace +v4 看时间戳

9.6 技术标准与接口

9.6.1 Entity

名称版本发布组织状态许可证 / 可访问性
DNS (RFC 1034 / 1035)1987IETF / IESG现行标准(已多次更新)免费公开
DNSSEC (RFC 4033-4035)2005IETF / IESG现行标准免费公开
EDNS(0) (RFC 6891)2013IETF / IESG现行标准免费公开
DoT (RFC 7858)2016IETF / IESG现行标准免费公开
DoH (RFC 8484)2018IETF / IESG现行标准免费公开
DoQ (RFC 9250)2022IETF / IESG现行标准免费公开
ISC BIND持续更新ISC事实标准MPL-2.0
Unbound持续更新NLnet Labs事实标准BSD-3-Clause
CoreDNS持续更新CNCF云原生事实标准Apache-2.0
ldns / drill持续更新NLnet LabsDNSSEC 工具BSD-3-Clause

9.6.2 Scope

不适用:权威服务发现(SRV 仅是 DNS 一部分;服务网格另说)、应用层路由(用 HTTP Host / SNI)。与传输层关系:DNS 默认 UDP 53,超 512 字节(EDNS 协商)切 TCP 53,DoT/DoH 强 TCP。

9.6.3 Structure

DNS Header(12 字节,必会字段):

偏移字段长度说明
0-1ID2 字节请求/应答匹配
2QR1 bit0=query, 1=response
2Opcode4 bit0=QUERY, 5=UPDATE
2AA1 bitAuthoritative Answer
2TC1 bitTrunCation
2RD1 bitRecursion Desired
2RA1 bitRecursion Available
2Z3 bit保留
3RCODE4 bit0=NOERROR, 3=NXDOMAIN, 5=REFUSED
4-5QDCOUNT2 字节Question 数
6-7ANCOUNT2 字节Answer 数
8-9NSCOUNT2 字节Authority 数
10-11ARCOUNT2 字节Additional 数

资源记录 5 元组:

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                       NAME                      |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|          TYPE         |         CLASS          |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|          TTL (4 octets)                         |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|          RDLENGTH (2 octets)                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|          RDATA (variable)                       |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

常用 RR 类型:

Type名称用途
1AIPv4 地址
28AAAAIPv6 地址
5CNAME别名
15MX邮件交换
2NS权威名字服务器
16TXT文本记录(SPF / DKIM / 验证)
6SOA区域起始授权(主从、serial、refresh)
12PTR反向解析
33SRV服务定位
41OPTEDNS(0) 伪 RR
252AXFR区域传送
251IXFR增量区域传送
46RRSIGDNSSEC 签名
43DSDNSSEC 委托签名者
48DNSKEYDNSSEC 公钥

9.6.4 Ecosystem

9.6.5 Depth Tiers

层级名称必须看到什么
L0知道存在知道 DNS 是「名字→IP」映射;知道有根服务器
L1看得懂示例看到 dig 输出能猜出哪个字段
L2能正确调用能写 dig +trace / dig @server / dig -x 排查
L3能解释与排错能解释 TTL 不生效、CNAME 冲突、DNSSEC 失败
L4能设计与扩展能设计签名 zone + DoH forwarder + split-horizon

本计划目标:阶段 9 综合排障时达到 L3

9.6.6 Source

10. 常见误区

11. 所有知识点分类(统一规则)

按本仓库统一分类规则(与父主题一致):

  1. 编程语言
  2. 数据结构与算法
  3. 计算机基础:网络协议、操作系统、组成原理
  4. 工程技术
  5. Web 与后端
  6. 前端与客户端
  7. 数据与人工智能
  8. 项目与职业能力

本计划归属:计算机基础 主 + 安全与可靠性 辅。


附录:常用命令片段

# 完整解析路径(递归 + 迭代全显示)
dig +trace example.com

# 指定 resolver + 类型
dig @1.1.1.1 AAAA example.com

# 反向解析
dig -x 8.8.8.8

# 显式 DNSSEC 验证 + 显示签名
dig @1.1.1.1 +dnssec example.com

# 完整 DNSSEC 信任链验证
delv +rtrace +v4 example.com

# 区域传送(多数域禁止,仅作测试)
dig @ns1.example.com AXFR example.com

# DoT 抓包(ldns 工具集)
kdig @1.1.1.1 +tls example.com

# DoH 查询
curl --doh-url https://1.1.1.1/dns-query https://example.com

# 抓明文 + 加密 DNS
tcpdump -ni any -w /tmp/dns.pcap 'port 53 or tcp port 853 or tcp port 443'

直接依赖(2)

查看知识图谱 · 热度 🔥极高