dns

DNS 工具

一份可直接干活的 DNS 参考:记录类型、TTL 与切换时机、委派关系、邮件相关的 TXT 记录,以及一个名字解析不出来时该拿哪个查询工具。

1 工具

§01 领域指南

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区的各项计时器、序列号否定缓存 TTLMINIMUM 决定 NXDOMAIN 的存活时长
PTR地址对应的名字反向 DNS、发信信誉in-addr.arpa(IPv4)/ ip6.arpa(IPv6);归 IP 持有方管
CAA被许可的 CA签发控制在签发时校验,不在 TLS 握手时校验
DS / DNSKEYDNSSEC 信任锚已签名委派轮换密钥后 DS 过期 = 彻底解析失败

TTL、切换与回滚窗口

按“可能需要多快挪动”来选 TTL:几分钟内可能要改指向的记录用 60,迁移期间用 300900,稳态用 3600,从来不动的 NSMX86400。短 TTL 并不免费—— 它会成倍放大查询量,也会缩小权威服务器不可达时保护你的那层缓冲。

回滚和切换一样重要:已缓存的 TTL 是恢复速度的下限,所以 300 秒的 TTL 意味着你发布 修正之后,最后一批解析器还会有五分钟继续指着一个死掉的端点。一个月来两次这种事就是 约 10 分钟的停机,SLA 正常运行时间计算器 能告诉你这是否装得 下——99.99% 在 30 天的月份里只允许 4.3 分钟。更多预算换算见 SRE 工具箱 页面。

SPF、DKIM、DMARC 各自证明什么

机制发布形式通过意味着不能证明
SPF域名上的 TXTv=spf1 …发起连接的 IP 有资格为信封 MAIL FROM 域发信对可见的 From: 一无所知;转发即失效
DKIMselector._domainkey.domain 上的 TXTv=DKIM1; p=…被签名的头和正文自 d= 签署以来未被改动不能证明 d= 就是你的域;未签名的头可以被追加
DMARC_dmarc.domain 上的 TXTv=DMARC1; p=…SPF 或 DKIM 通过并且该域与 From: 对齐不代表强制执行——p=none 只是索要报告

三者当中,只有顶点上的 SPF 记录能用 DNS 查询工具 读到:它的 TXT 标签页会显示你发布的 v=spf1 字符串,但该工具只接受主机名标签,所以 _dmarc.example.comselector._domainkey.example.com 这类带下划线的名字会以 Invalid domain format 被拒。这些要用 dig TXT _dmarc.example.com 或者从服务商的 区编辑器里读。至于接收方最终判定了什么,那是另一个问题, 邮件头分析器 能从一封已投递邮件的 Authentication-ResultsReceived-SPFDKIM-Signature 和 ARC 头里给出答案。在添加 ip4: 机制之前,用 IP 地址查询工具 确认你的流量真正从哪个地址出去,而不要相信配置 文件。如果某条 DKIM 记录是从分片字符串重新拼起来的,把 p= 的值粘进 Base64 编码 / 解码:它会拒绝多余字符和错误的填充,从而抓出一个被 弄坏的密钥。关于认证头的更多内容见 邮件工具集

什么场景用哪个工具

给定一个域名,DNS 查询工具 一次查询就解析出 AAAAACNAMEMXTXTNS,输出 TYPE / NAME / VALUE / TTL 并带上 MX 优先级; 类型标签页是在客户端过滤已取回的行,所以在 MXTXT 之间来回切换不会产生额外 查询。CNAME 没有自己的标签页,所以那些行——正是告诉你某个名字是别名而不是地址 的那些行——出现在 ALL 视图里。状态栏要照字面读:SERVER 永远是 api.sitekits.dev,LATENCY 是浏览器到 API 的往返,既不是真正作答的那个递归解析器, 也不是 DNS 查询耗时。解析在服务端经由 Cloudflare DoH 完成,这正是它能给你一个在你 自己缓存之外的观测点的原因;要确定具体是哪个解析器回答的,就用 dig @8.8.8.8 example.com 直接问它。如果手上是 URL 而不是域名, URL 解析和分析工具 会在本地把 hostnamehost(后者含端口) 里剥出来,且不发起任何请求。

当记录都对、但服务的内容不对时,问题就不在 DNS 了: HTTP 头信息检查工具 在服务端发起请求,返回状态、重定向链和 每一个响应头——足以把“还是旧 IP”和“IP 对了但 CDN 缓存是旧的”分开。它从不获取 正文,并拒绝私有地址。

DNS 只承载 ASCII 标签,所以 IDN / Punycode 转换工具 会显示 实际被查询的 xn-- 形式,顺便也能揭穿同形字仿冒域名。看起来不一样的 AAAA 值 往往其实一样:IPv6 地址压缩工具 能把两种写法都归一化,也能 展开 ip6.arpa 名字所需的分组。迁移前给区做个快照,前后拿 文本差异检查器 比一遍。

会烧掉几个小时的坑

区顶点上的 CNAME

example.com 必须持有 SOANS,而 CNAME 不能与同名下的其它记录共存—— 所以顶点 CNAME 无论控制台是否让你保存,都是非法的。ALIAS/ANAME 和展平是 服务商的功能,不是协议的能力。

放了两条 SPF 记录而不是一条

同名下出现第二条 v=spf1 TXT 记录会导致 permerror。把所有机制合并进一条记录, 同时数清查询次数:include:amxptrexistsredirect= 各消耗一次, 一次求值总共只允许 10 次 DNS 查询(RFC 7208 §4.6.4)——层层嵌套的厂商链条会悄无 声息地把这个上限撑爆。

相对名与漏掉的结尾点

在区文件语法里,目标末尾没有点就是相对名,于是 www.example.com 会变成 www.example.com.example.com.——把一个完全限定的目标粘进一个已经自动追加区名的 界面里,得到的正是这个结果。

指向已被回收服务的悬空记录

一条仍然指着已下线的存储桶、应用平台或 CDN 主机名的 CNAME,可能被下一个注册该 名字的人占据,从而把你的一个子域交到攻击者手上——参见 安全工具箱

FAQ
为什么我改了 DNS 记录要等好几个小时才生效?
因为决定这段等待的 TTL 是已经被缓存下来的那个,不是你刚刚发布的那个。如果旧记录的 TTL 是 86400,而某个解析器在你改动前一分钟缓存了它,那这个解析器还会继续提供旧值将近 24 小时。计划内的变更请提前至少一个完整的旧 TTL 周期把 TTL 降到 300,然后再切记录。
我都换了 NS 好几天了,为什么查询还在打到旧的 DNS 服务商?
因为委派关系本身也被缓存了,而这份缓存不是你能让它过期的。注册商在 TLD 侧发布的那组 NS 记录,TTL 通常是一到两天,所以在变更前不久拿到旧委派的解析器,会一直查询旧的 NS 直到那份副本失效。事先降低区内各条记录的 TTL——那部分才在你手上——并在切换之后至少 48 小时里让旧区继续在线且内容完全一致。
根域上可以挂 CNAME 吗?
标准 DNS 里不行。CNAME 不能与同名下的其它记录共存,而区顶点必须承载 SOA 和 NS 记录,所以顶点 CNAME 是非法的。各家服务商用非标准的 ALIAS/ANAME 记录或者 CNAME 展平来绕开这个限制,它们在查询时解析目标,并用 A/AAAA 数据作答。
记录我刚刚才建好——为什么还是返回 NXDOMAIN?
因为否定应答同样会被缓存。一个被告知“此名不存在”的解析器,会按该区 SOA 记录推导出的时长保留这个判定,常见是 300 到 3600 秒,而你之后发布的任何东西都无法清掉一份已经握在手里的否定应答——所以当你打算一个个逐步创建名字时,请事先把 SOA 的 minimum 调低。想区分“陈旧的未命中”和“真的写错了”,就去问一个从未见过先前那次查询的解析器,用 dig @8.8.8.8,或者换一个网络。
为什么两个 DNS 检测站对同一条记录给出不同结果?
因为它们各自问的是不同的递归解析器,而每份缓存副本按自己的时钟到期,所以变更过程中出现分歧是正常的,直到最长的那份缓存 TTL 失效为止。持续不一致就是另一回事了:可能是 GeoDNS 或 EDNS Client Subnet 按查询位置作答,可能是企业网内的分离视图 DNS 返回内网地址,也可能是其中一个解析器还握着旧的 NS 委派。