一些关于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.8114.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地址在全球多地广播。这是 CDN8.8.8.8 高可用的核心技术。
Split Horizon (分智能解析) 内外网解析分离。内网访问解析到内网IP,外网访问解析到公网IP。
CAA 记录 指定哪些CA机构可以为你的域名颁发证书,防止恶意申请SSL证书。
Public Suffix List 浏览器用来判断什么是“根域名”(如 .com.github.io 的区别),影响Cookie安全。

六、 常见故障场景速查(记忆锚点)

为了帮你记住上面这些,可以对应以下场景:

  1. “网站打不开,但IP能访问” → 查 A记录Local DNSHosts
  2. “换了解析半天没生效” → 查 TTLISP缓存Serial Number 是否递增。
  3. “邮件发不出去” → 查 MX记录PTR反向解析(SPF/DKIM通常也属于DNS范畴)。
  4. “CDN回源错误” → 查 CNAME 是否指向正确,是否存在循环CNAME。
  5. “部分地区访问异常” → 查 GSLB/智能解析 策略,是否有地区屏蔽。

总结:必背的“最小知识集”

  1. UDP 53 端口。
  2. A 记录是 IPv4,AAAA 是 IPv6。
  3. CNAME 是别名,不能和 A 记录共存于根域名。
  4. MX 记录决定邮件去哪。
  5. TTL 决定缓存多久。
  6. 解析顺序:缓存 > Hosts > DNS。
  7. dig 是最好用的诊断工具。
  8. SOA 里的 Serial 号不涨,从服务器不更新。
  9. PTR 是用来做 IP 反解的。
  10. 修改前 一定要降低 TTL
发表评论
博客分类