一些关于DNS的知识
-
2026-06-03 21:56:00
-
丁国栋
-
原创
100
摘要:本文记录和整理一些关于DNS的知识,便于回顾和取用。
说在前面的话:如果不断的重复某项事情记忆就会变得牢固,当重复到了足够的次数,想忘掉也不是一件容易的事情了。反过来,如果一件事或者一个知识你没有重复足够多的次数或者无法推理、触发出来就大概不会记得它了。所以有些东西还是要写下来,整理出来,才能长久保存。有些知识点可能学到了但很长时间用不上,但一旦想找它想起来它那可真的不容易。
DNS 这里面的知识很多是有用的,但有些也是平常用不到,但关键时候还是能用到的。
DNS 专有名词与记录冲突规则
一、核心架构
| 名词 |
说明 |
| DNS (Domain Name System) |
域名系统,将域名解析为 IP 地址的分布式数据库 |
| Resolver |
解析器,发起 DNS 查询的客户端(通常是 ISP 的递归服务器或本地 stub resolver) |
| Root Server |
根域名服务器,全球 13 组(A–M),DNS 查询的起点 |
| TLD Server |
顶级域名服务器(如 .com、.org、.cn) |
| Authoritative Server |
权威服务器,持有某个域名的最终解析记录 |
二、域名结构
| 名词 |
说明 |
示例 |
| Root Domain |
根域,用 . 表示(通常省略) |
. |
| TLD (Top-Level Domain) |
顶级域名 |
.com、.net、.cn |
| SLD (Second-Level Domain) |
二级域名 |
example in example.com |
| Subdomain |
子域名 |
www in www.example.com |
| FQDN (Fully Qualified Domain Name) |
完全限定域名,以 . 结尾的完整域名 |
www.example.com. |
| Zone |
区域,一个域名空间的管理单元 |
— |
三、记录类型
| 类型 |
含义 |
| A |
IPv4 地址记录 |
| AAAA |
IPv6 地址记录 |
| CNAME |
别名记录,指向另一个域名 |
| MX |
邮件交换记录,指定邮件服务器 |
| TXT |
文本记录,常用于 SPF、DKIM、域名验证 |
| NS |
指定该域名的权威服务器 |
| SOA |
授权起始记录,定义 zone 的管理信息 |
| PTR |
反向解析记录(IP → 域名) |
| SRV |
服务定位记录,指定特定服务的地址和端口 |
| CAA |
证书颁发机构授权记录 |
| DNSKEY / DS |
DNSSEC 签名密钥相关记录 |
| RRSIG |
DNSSEC 数字签名记录 |
| NSEC / NSEC3 |
DNSSEC 否定存在证明 |
四、查询行为
| 名词 |
说明 |
| Recursive Query |
递归查询,DNS 服务器替你一路追查到最终结果 |
| Iterative Query |
迭代查询,DNS 服务器返回它能提供的最佳答案(推荐下一个服务器) |
| Forward Lookup |
正向解析(域名 → IP) |
| Reverse Lookup |
反向解析(IP → 域名) |
| DNS Caching |
DNS 缓存,中间节点缓存结果以减少延迟 |
| TTL (Time To Live) |
记录的缓存生存时间(秒) |
五、安全相关
| 名词 |
说明 |
| DNSSEC |
DNS 安全扩展,用数字签名防止 DNS 伪造/投毒 |
| DNS Spoofing / Cache Poisoning |
DNS 投毒,向缓存中注入虚假记录 |
| DNS over HTTPS (DoH) |
通过 HTTPS 加密 DNS 查询 |
| DNS over TLS (DoT) |
通过 TLS 加密 DNS 查询 |
| DNS over QUIC (DoQ) |
通过 QUIC 加密 DNS 查询 |
| RPZ (Response Policy Zone) |
响应策略区域,用于 DNS 防火墙/过滤 |
六、高级与生态
| 名词 |
说明 |
| Anycast DNS |
任播,同一 IP 在多个地理位置同时广播,用户自动路由到最近节点 |
| Split-Horizon DNS |
视图分离,内外网返回不同的解析结果 |
| Dynamic DNS (DDNS) |
动态 DNS,IP 变化时自动更新 A/AAAA 记录 |
| GeoDNS |
基于用户地理位置返回不同的 IP |
| CDN DNS / Traffic Management |
基于延迟、健康检查等策略进行智能调度 |
| EDNS |
扩展 DNS 协议,支持更大的 UDP 包(如 EDNS0) |
| Glue Record |
粘合记录,解决"权威服务器在自己的域名下"的鸡生蛋问题 |
| Zone Transfer (AXFR / IXFR) |
区域传输,主从 DNS 之间的同步机制 |
| ALIAS / ANAME |
非标准记录,用于 zone apex 模拟 CNAME 行为(云厂商实现) |
七、常见配置/管理
| 名词 |
说明 |
| Primary (Master) / Secondary (Slave) |
主/从 DNS 服务器 |
| Forwarder |
转发器,将查询转发给上游 DNS 服务器 |
| Stub Zone |
存根区域,只存 NS 记录,不存完整 zone 数据 |
| Wildcard Record |
泛解析,*.example.com 匹配所有未定义的子域名 |
| TTL Expiry / Negative Caching |
否定缓存,NXDOMAIN 的 TTL 由 SOA 的 minimum 字段控制 |
八、记录共存与冲突规则
8.1 CNAME 的排他性(铁律一)
CNAME 记录不能与其他任何记录共享同一个 owner name。 这是 DNS 协议层面的硬性约束(RFC 1034/2181)。
✅ 正确:
www.example.com. CNAME example.com.
❌ 错误(CNAME + 其他记录共存):
www.example.com. CNAME example.com.
www.example.com. A 1.2.3.4 ← 冲突!
www.example.com. MX 10 mail.example.com. ← 冲突!
www.example.com. TXT "v=spf1 ..." ← 冲突!
原因: CNAME 的语义是"这个域名就是另一个域名的别名",因此它的所有资源记录都应该从目标域名继承。如果 A 和 CNAME 并存,解析器无法确定返回哪个。
8.2 Zone Apex 不能有 CNAME(铁律二)
example.com 本身(根域名 / naked domain)不能设置 CNAME。因为根域名必须存在 SOA 和 NS 记录,而 CNAME 的排他性意味着它无法与这些记录共存。
云厂商提供了非标准的替代方案:Cloudflare 的 CNAME Flattening、AWS Route53 的 ALIAS、DNS Made Easy 的 ANAME。
8.3 常见记录冲突矩阵
| Owner Name 有 ↓ |
可否加 A |
可否加 CNAME |
可否加 MX |
可否加 TXT |
可否加 NS |
| 已有 A |
✅ 多条 A = 轮询 |
❌ 禁止 |
✅ |
✅ |
✅ |
| 已有 CNAME |
❌ 禁止 |
❌ 禁止(只能有一条 CNAME) |
❌ 禁止 |
❌ 禁止 |
❌ 禁止 |
| 已有 MX |
✅ |
❌ 禁止 |
✅ 多条按 priority |
✅ |
✅ |
| 已有 TXT |
✅ |
❌ 禁止 |
✅ |
✅ 多条 TXT 合法 |
✅ |
| 已有 NS |
✅(仅子域) |
❌ 禁止 |
✅ |
✅ |
✅ |
一句话:有 CNAME 就容不下任何别的东西;没有 CNAME,基本都能共存(zone apex 除外)。
8.4 各记录类型详解
A / AAAA — 允许多条,天然轮询
✅ 合法(DNS 轮询负载均衡):
www.example.com. A 1.2.3.4
www.example.com. A 5.6.7.8
www.example.com. A 9.10.11.12
CNAME — 独占,不能形成环
❌ CNAME 链太长:
a.example.com. CNAME b.example.com.
b.example.com. CNAME c.example.com.
c.example.com. CNAME d.example.com. ← 大多数解析器有深度限制(~8-16)
❌ CNAME 环:
a.example.com. CNAME b.example.com.
b.example.com. CNAME a.example.com. ← 死循环,解析器报 SERVFAIL
⚠️ CNAME 指向不存在的域名 → 解析结果 NXDOMAIN
MX — 不能指向 CNAME,必须指向 A/AAAA
✅ 正确:
example.com. MX 10 mail.example.com.
mail.example.com. A 1.2.3.4
❌ 错误(MX 目标不能是 CNAME,RFC 2181 §10.3):
example.com. MX 10 mail.example.com.
mail.example.com. CNAME other.example.com. ← 很多 MTA 拒绝或报警
TXT — 几乎无限制,但注意长度和 SPF 的特殊规则
✅ 合法:
example.com. TXT "v=spf1 include:_spf.google.com ~all"
example.com. TXT "google-site-verification=xxxxx"
⚠️ 单条 TXT 字符串超过 255 字节会被自动拆分
NS — 子域切 Zone 的冲突
⚠️ 典型错误:
example.com. NS ns1.provider.com.
www.example.com. NS ns1.other.com. ← www 成了新的 zone 切点
www.example.com. A 1.2.3.4 ← 这条 A 被"遮蔽"了!
如果 www.example.com 是新的 zone 切点,所有 www.example.com 的记录
都应该在切过去的权威服务器上定义。parent zone 里的 A 记录会被忽略。
九、实际踩坑场景
场景 1 — CDN 加速根域名
需求:example.com 也要走 CDN
问题:不能用 CNAME(zone apex 冲突)
方案:用 ALIAS/ANAME(Cloudflare/AWS Route53),或直接将 CDN 节点 IP 写成 A 记录
场景 2 — MX 指向了 CNAME
example.com. MX 10 mail.example.com.
mail.example.com. CNAME ghs.googlehosted.com.
虽然 Google Workspace 有时会引导用户这么做,但 RFC 2181 §10.3 明确禁止。
部分 MTA 会拒绝,部分会追赶 CNAME。行为不统一,不应这样做。
场景 3 — 多条 SPF TXT 导致 PERMERROR
❌ 错误:
example.com. TXT "v=spf1 include:_spf1.example.com ~all"
example.com. TXT "v=spf1 include:_spf2.example.com ~all"
RFC 7208:多条 SPF 记录会导致 PERMERROR,相当于没有 SPF。
✅ 正确做法是合并成一条:
example.com. TXT "v=spf1 include:_spf1.example.com include:_spf2.example.com ~all"
十、一句话速查表
| 规则 |
原因 |
| CNAME 独占同一域名 |
协议规定,别名不能同时"是自己也是别人" |
| Zone apex 不能 CNAME |
必须存在 SOA/NS,CNAME 容不下它们 |
| MX 目标必须是 A/AAAA,不能是 CNAME |
RFC 2181 §10.3,MTA 行为不一致 |
| 多条 SPF TXT → PERMERROR |
RFC 7208,SPF 只认一条记录 |
| 同域名多个 A/AAAA → DNS 轮询 |
合法且常用 |
| CNAME 链过深或成环 → SERVFAIL |
解析器有递归深度限制 |
| NS 切分子域会遮蔽父 zone 的记录 |
解析权被委托到子 zone |
一、 基础概念与架构(地基)
这部分决定了你对DNS的理解是停留在“改个IP”还是“懂原理”。
| 知识点 |
必会程度 |
说明 |
| DNS 本质 |
⭐⭐⭐⭐⭐ |
域名 -> IP 的分布式数据库,主要基于 UDP 53 端口(TCP 用于区域传输和大包)。 |
| 递归查询 vs 迭代查询 |
⭐⭐⭐⭐⭐ |
递归:客户端只问一次,等着拿结果(通常是Local DNS);迭代:服务器返回下一个该去哪问(Root -> TLD -> Authoritative)。 |
| DNS 层级结构 |
⭐⭐⭐⭐ |
根域 (.) -> 顶级域 (TLD, .com/.cn) -> 二级域 (google.com) -> 子域 (<www.google.com)。理解这是树状结构。> |
| Resolver (解析器) |
⭐⭐⭐⭐ |
你电脑上配置的 8.8.8.8 或 114.114.114.114,它的职责是帮你去递归查询。 |
二、 核心记录类型(Records)
这是最常用的部分,不仅要背名字,要知道具体场景。
| 记录类型 |
全称 |
必会场景 |
备注 |
| A |
Address |
IPv4地址映射 |
最最最常用的记录。 |
| AAAA |
IPv6 Address |
IPv6地址映射 |
随着IPv6普及,重要性上升。 |
| CNAME |
Canonical Name |
别名(CDN、SaaS服务) |
不能在根域名(@)设置;优先级高于A记录。 |
| MX |
Mail Exchange |
邮件服务器 |
必须有优先级(Preference),数字越小越优先。 |
| TXT |
Text |
SPF、域名验证、防钓鱼 |
现在常用于证明“这个域名是你的”。 |
| NS |
Name Server |
委派子域管理权 |
告诉别人这个子域由谁来管理。 |
| PTR |
Pointer |
IP反查域名 |
用于邮件服务器反垃圾,极难配置,属于冷知识区。 |
| SOA |
Start of Authority |
区域权威信息 |
包含主DNS服务器、管理员邮箱、序列号(Serial)。 |
| SRV |
Service |
服务定位(端口+主机) |
常用于VoIP、LDAP、GitLab等特定服务。 |
三、 解析流程与缓存(实战核心)
很多时候出问题不是因为配错了,而是因为缓存。
| 知识点 |
必会程度 |
说明 |
| 本地 Hosts 文件 |
⭐⭐⭐⭐⭐ |
解析顺序:本地缓存 -> Hosts -> DNS服务器。排错第一招:ping 不通先查 Hosts。 |
| TTL (Time To Live) |
⭐⭐⭐⭐⭐ |
缓存存活时间。改解析前务必调低TTL,生效后再调高。 |
| Negative TTL |
⭐⭐⭐ |
当查询结果为 NXDOMAIN(不存在)时,这个“不存在”的结果也会被缓存。 |
| DNS Propagation |
⭐⭐⭐⭐ |
全球生效延迟。不同地区、不同ISP的Local DNS刷新时间不同。 |
四、 运维与排错命令(肌肉记忆)
这些命令必须在脑子里形成反射。
| 命令 |
用途 |
关键参数/示例 |
| dig |
专业查询(首选) |
dig +trace example.com (追踪完整路径)
dig @8.8.8.8 example.com (指定DNS) |
| nslookup |
简单查询(Windows友好) |
nslookup -type=mx example.com |
| host |
简洁查询 |
host example.com |
| whois |
查注册信息 |
查域名所有者、到期时间。 |
| tcpdump |
抓包分析 |
tcpdump -i eth0 port 53 (看有没有发出请求)。 |
五、 高级与安全(关键时刻救命)
这些平时看不见,出事就是大事。
| 知识点 |
说明 |
| DNSSEC |
给DNS数据加签名,防止DNS劫持/污染。现在是很多合规要求的一部分。 |
| Anycast DNS |
同一个IP地址在全球多地广播。这是 CDN 和 8.8.8.8 高可用的核心技术。 |
| Split Horizon (分智能解析) |
内外网解析分离。内网访问解析到内网IP,外网访问解析到公网IP。 |
| CAA 记录 |
指定哪些CA机构可以为你的域名颁发证书,防止恶意申请SSL证书。 |
| Public Suffix List |
浏览器用来判断什么是“根域名”(如 .com 和 .github.io 的区别),影响Cookie安全。 |
六、 常见故障场景速查(记忆锚点)
为了帮你记住上面这些,可以对应以下场景:
- “网站打不开,但IP能访问” → 查 A记录、Local DNS、Hosts。
- “换了解析半天没生效” → 查 TTL、ISP缓存、Serial Number 是否递增。
- “邮件发不出去” → 查 MX记录、PTR反向解析(SPF/DKIM通常也属于DNS范畴)。
- “CDN回源错误” → 查 CNAME 是否指向正确,是否存在循环CNAME。
- “部分地区访问异常” → 查 GSLB/智能解析 策略,是否有地区屏蔽。
总结:必背的“最小知识集”
- UDP 53 端口。
- A 记录是 IPv4,AAAA 是 IPv6。
- CNAME 是别名,不能和 A 记录共存于根域名。
- MX 记录决定邮件去哪。
- TTL 决定缓存多久。
- 解析顺序:缓存 > Hosts > DNS。
dig 是最好用的诊断工具。
- SOA 里的 Serial 号不涨,从服务器不更新。
- PTR 是用来做 IP 反解的。
- 修改前 一定要降低 TTL。