DNS 工具
一份可直接干活的 DNS 参考:记录类型、TTL 与切换时机、委派关系、邮件相关的 TXT 记录,以及一个名字解析不出来时该拿哪个查询工具。
1 工具
DNS 是缓存的层级结构,不是数据库
你所谓“改一条 DNS 记录”,改的只是一组权威名称服务器上的一份区文件——而几乎没人
真的去读那份区。你的用户拿到的答案来自递归解析器(运营商的、8.8.8.8、企业内部
解析器、浏览器自带的 DoH 端点),每一个都握着一份按自己时间表到期的副本。世上只有
一个权威答案和 N 份缓存出来的近似值——再加上你自己的笔记本,它的操作系统缓存和
/etc/hosts 会盖掉其它一切。
解析从根开始:一个冷启动的解析器向根服务器询问 www.example.com,被指向 .com
的名称服务器,再被指向注册商为 example.com 发布的 NS 记录。这条委派链上的每一
环本身都是一条带有自己 TTL 的缓存记录,而 TLD 侧那组 NS 通常会被缓存 1–2 天——
这就是为什么更换 DNS 服务商的行为跟改一条 A 记录完全不是一回事。
所以“传播”这个说法是误称:没有任何东西被推送出去,只是旧答案在陆续到期——包括
否定答案。NXDOMAIN 会按该区 SOA 推导出的时长被缓存(常见 300–3600 秒),所以
一个名字在你刚建好之后,还可能有几分钟看起来不存在。
实际会碰到的记录类型
| 类型 | 存放什么 | 典型用途 | 注意 |
|---|---|---|---|
A | 一个 IPv4 地址 | 名字 → 主机 | 多条 A 是轮询,不是故障切换 |
AAAA | 一个 IPv6 地址 | 双栈 | 坏掉的 AAAA 会拖垮优先 IPv6 的客户端 |
CNAME | 另一个名字 | CDN、SaaS 接入点 | 顶点非法;排斥同名的其它记录 |
MX | 邮件主机 + 优先级 | 收件 | 数字小的优先;填主机名,绝不能填 IP |
TXT | 自由格式字符串 | SPF、DKIM、DMARC、归属验证 | 单串上限 255 字符;长密钥要分片 |
NS | 被委派的名称服务器 | 区委派 | 算数的是父级那一侧的那组值 |
SOA | 区的各项计时器、序列号 | 否定缓存 TTL | MINIMUM 决定 NXDOMAIN 的存活时长 |
PTR | 地址对应的名字 | 反向 DNS、发信信誉 | in-addr.arpa(IPv4)/ ip6.arpa(IPv6);归 IP 持有方管 |
CAA | 被许可的 CA | 签发控制 | 在签发时校验,不在 TLS 握手时校验 |
DS / DNSKEY | DNSSEC 信任锚 | 已签名委派 | 轮换密钥后 DS 过期 = 彻底解析失败 |
TTL、切换与回滚窗口
按“可能需要多快挪动”来选 TTL:几分钟内可能要改指向的记录用 60,迁移期间用
300–900,稳态用 3600,从来不动的 NS 和 MX 用 86400。短 TTL 并不免费——
它会成倍放大查询量,也会缩小权威服务器不可达时保护你的那层缓冲。
回滚和切换一样重要:已缓存的 TTL 是恢复速度的下限,所以 300 秒的 TTL 意味着你发布 修正之后,最后一批解析器还会有五分钟继续指着一个死掉的端点。一个月来两次这种事就是 约 10 分钟的停机,SLA 正常运行时间计算器 能告诉你这是否装得 下——99.99% 在 30 天的月份里只允许 4.3 分钟。更多预算换算见 SRE 工具箱 页面。
SPF、DKIM、DMARC 各自证明什么
| 机制 | 发布形式 | 通过意味着 | 不能证明 |
|---|---|---|---|
| SPF | 域名上的 TXT,v=spf1 … | 发起连接的 IP 有资格为信封 MAIL FROM 域发信 | 对可见的 From: 一无所知;转发即失效 |
| DKIM | selector._domainkey.domain 上的 TXT,v=DKIM1; p=… | 被签名的头和正文自 d= 签署以来未被改动 | 不能证明 d= 就是你的域;未签名的头可以被追加 |
| DMARC | _dmarc.domain 上的 TXT,v=DMARC1; p=… | SPF 或 DKIM 通过并且该域与 From: 对齐 | 不代表强制执行——p=none 只是索要报告 |
三者当中,只有顶点上的 SPF 记录能用 DNS 查询工具 读到:它的
TXT 标签页会显示你发布的 v=spf1 字符串,但该工具只接受主机名标签,所以
_dmarc.example.com、selector._domainkey.example.com 这类带下划线的名字会以
Invalid domain format 被拒。这些要用 dig TXT _dmarc.example.com 或者从服务商的
区编辑器里读。至于接收方最终判定了什么,那是另一个问题,
邮件头分析器 能从一封已投递邮件的 Authentication-Results、
Received-SPF、DKIM-Signature 和 ARC 头里给出答案。在添加 ip4: 机制之前,用
IP 地址查询工具 确认你的流量真正从哪个地址出去,而不要相信配置
文件。如果某条 DKIM 记录是从分片字符串重新拼起来的,把 p= 的值粘进
Base64 编码 / 解码:它会拒绝多余字符和错误的填充,从而抓出一个被
弄坏的密钥。关于认证头的更多内容见 邮件工具集。
什么场景用哪个工具
给定一个域名,DNS 查询工具 一次查询就解析出 A、AAAA、
CNAME、MX、TXT 和 NS,输出 TYPE / NAME / VALUE / TTL 并带上 MX 优先级;
类型标签页是在客户端过滤已取回的行,所以在 MX 和 TXT 之间来回切换不会产生额外
查询。CNAME 没有自己的标签页,所以那些行——正是告诉你某个名字是别名而不是地址
的那些行——出现在 ALL 视图里。状态栏要照字面读:SERVER 永远是
api.sitekits.dev,LATENCY 是浏览器到 API 的往返,既不是真正作答的那个递归解析器,
也不是 DNS 查询耗时。解析在服务端经由 Cloudflare DoH 完成,这正是它能给你一个在你
自己缓存之外的观测点的原因;要确定具体是哪个解析器回答的,就用
dig @8.8.8.8 example.com 直接问它。如果手上是 URL 而不是域名,
URL 解析和分析工具 会在本地把 hostname 从 host(后者含端口)
里剥出来,且不发起任何请求。
当记录都对、但服务的内容不对时,问题就不在 DNS 了: HTTP 头信息检查工具 在服务端发起请求,返回状态、重定向链和 每一个响应头——足以把“还是旧 IP”和“IP 对了但 CDN 缓存是旧的”分开。它从不获取 正文,并拒绝私有地址。
DNS 只承载 ASCII 标签,所以 IDN / Punycode 转换工具 会显示
实际被查询的 xn-- 形式,顺便也能揭穿同形字仿冒域名。看起来不一样的 AAAA 值
往往其实一样:IPv6 地址压缩工具 能把两种写法都归一化,也能
展开 ip6.arpa 名字所需的分组。迁移前给区做个快照,前后拿
文本差异检查器 比一遍。
会烧掉几个小时的坑
区顶点上的 CNAME
example.com 必须持有 SOA 和 NS,而 CNAME 不能与同名下的其它记录共存——
所以顶点 CNAME 无论控制台是否让你保存,都是非法的。ALIAS/ANAME 和展平是
服务商的功能,不是协议的能力。
放了两条 SPF 记录而不是一条
同名下出现第二条 v=spf1 TXT 记录会导致 permerror。把所有机制合并进一条记录,
同时数清查询次数:include:、a、mx、ptr、exists 和 redirect= 各消耗一次,
一次求值总共只允许 10 次 DNS 查询(RFC 7208 §4.6.4)——层层嵌套的厂商链条会悄无
声息地把这个上限撑爆。
相对名与漏掉的结尾点
在区文件语法里,目标末尾没有点就是相对名,于是 www.example.com 会变成
www.example.com.example.com.——把一个完全限定的目标粘进一个已经自动追加区名的
界面里,得到的正是这个结果。
指向已被回收服务的悬空记录
一条仍然指着已下线的存储桶、应用平台或 CDN 主机名的 CNAME,可能被下一个注册该
名字的人占据,从而把你的一个子域交到攻击者手上——参见
安全工具箱。