DNS 记录查询

域名公开的每一条记录,以及它们对邮件和证书意味着什么。

试试:

各类记录,以及它们实际是干什么的

类型指向什么时候会用到
A一个 IPv4 地址总是。让一个域名能打开的,就是它。
AAAA一个 IPv6 地址越来越常用。移动网络经常是纯 IPv6 的。
CNAME另一个名字www 指向顶点,或者把一个子域名指向某个 SaaS 服务商。
MX一台邮件服务器,带一个优先级邮件收不到的时候。优先级数字小的胜出。
NS该区域的权威名字服务器你换了服务商,想知道现在是谁在给你答案。
TXT自由格式的文本SPF、DKIM、DMARC,以及你曾经粘贴过的每一个域名验证令牌。
SOA区域元数据与各项计时器调试名字服务器之间的同步。
CAA获准的证书颁发机构限制谁可以为你签发证书。

「传播」这个词用错了

关于 DNS 最有用的一件事,因为它把一段无法预测的等待,变成了一个由你掌控的数字。

什么都不会传播。没有推送,没有分发,也没有一波更新在互联网上滚过去。你一按保存,你的名字服务器就已经有了新值。真正耗时间的是:全世界每一台解析器都持有旧答案的一份缓存副本,而每一台都会一直留着它,直到当初给它的 TTL 到期。

所以这段延迟并不神秘——它恰好就是每台解析器上次询问时所公布的那个 TTL。如果你的记录 TTL 是 3600 秒,那么有些解析器五分钟后就会再问一次,有些则要等一小时,这就是为什么一次变更看上去是不均匀地传到人们那里的。

由此就得出了任何计划内变更的操作流程:

  1. 提前一天,把 TTL 降到 300 秒。等旧的那个 TTL 过期,好让所有人都取到这个短的。
  2. 做变更。现在它只需要五分钟,而不是一天。
  3. 等它稳定下来之后,把 TTL 调回去。

之所以要调回去,是因为低 TTL 意味着更多查询、缓存未命中时更高的时延,以及在你的名字服务器变得不可达时更难熬的一次故障——没有人手上有一份还能用的缓存答案可以兜底。

邮件相关的记录,大部分问题都出在这儿

有三条 TXT 记录决定了你的邮件会不会被相信。它们经常被配错,而失败是无声的——邮件被投进垃圾箱而不是被退回,所以没有人会告诉你。

SPF

列出哪些服务器可以代表你的域名发信。按出错频率排序,常见的错误是:

  • 两条 SPF 记录。 RFC 7208 要求接收方把这当作永久性错误,于是整个检查直接失败。把它们合并成一条。
  • 超过十次 DNS 查询。 每一个 include: 都算一次,而且 include 会嵌套。一个邮件服务商加一个营销平台再加一个工单系统,很快就到了,而一旦超过,检查就失败。
  • 以 `~all` 或 `?all` 结尾。 两者的意思都是「大概不是我们,不过随你便」。只有 -all 才是在请求接收方拒收。

DKIM 与 DMARC

DKIM 用一把密钥给每封信签名,而这把密钥的公开那一半住在某个选择器名字下的 TXT 记录里,比如 selector1._domainkey.example.com——你必须知道那个选择器才能查到它,这也是为什么它不在上面的默认查询里。DMARC 住在 _dmarc.example.com,它告诉接收方:当 SPF 和 DKIM 意见不一致时该怎么办,以及把报告寄到哪里。

在上面的工具里查一下 _dmarc.yourdomain.com。如果什么都没返回,那么接收方就没有得到任何指示,对于任何冒充你的邮件,它们只能自行判断。

顶点上的 CNAME 规则

同一个名字上,CNAME 不能与任何其他记录共存。而域名的顶点必须有 SOA 和 NS 记录,所以顶点不能有 CNAME——这就是为什么把 example.com 指向一个 SaaS 服务商很别扭,而 www.example.com 却轻而易举。

变通办法因服务商而异:ALIAS、ANAME 或者 CNAME 扁平化,它们都在服务器端解析目标,然后用一条 A 记录来应答。它们管用,但它们不是标准,而且值得在你为此耗掉一个下午之前就先知道。

相关

等记录都指向你想要的地方之后,去检查一下证书——主机实际出示的那张——以及它返回了哪些响应头。想知道某条记录指向的地址归哪个网络所有,ASN 查询会回答这个问题。

DNS 相关问题

我改了一条记录,可它还显示旧值。为什么?

缓存,而且是好几层。每条记录都有一个 TTL,说明解析器可以保留它多久;在它过期之前,无论权威服务器现在怎么说,你看到的都还是旧答案。在这之上,你的操作系统和浏览器也各有缓存。这里的查询走的是解析器而不是直接问权威名字服务器,所以它同样会看到缓存值。想知道实际发布的是什么,就直接向该域名自己的名字服务器发问:dig @ns1.example.com example.com A。

DNS 传播要多久?

根本没有「传播」这回事——这个说法本身就是混淆的源头。没有任何东西被推送到任何地方。解析器只是持有自己缓存的那一份,直到 TTL 过期后再问一次;所以你体验到的延迟,恰好就是它们上次询问时所公布的那个 TTL。计划变更的前一天把 TTL 调低,切换就是几分钟而不是几小时的事;忘了调,一个 24 小时的 TTL 就意味着有整整一天,部分访客看到的还是旧值。

CAA 记录是什么?我需要吗?

它列出哪些证书颁发机构获准为你的域名签发证书,而 CA 在签发前必须检查它。没有它,全世界任何一家公共 CA 都可以为你的域名签发——于是攻击者只要攻破一百家 CA 中任意一家的验证流程,就能拿到一张有效证书。有了它,攻击面就收缩为你点名的那几家。它只有一行,值得加上。

我的 SPF 记录看着没问题,为什么还是不通过?

三个常见原因。同一个域名上有两条 SPF 记录,在 RFC 7208 下是永久性错误,会让整个检查失败——发布且只发布一条。DNS 查询次数超过十次也会失败(每个 include: 都算一次,而且 include 会嵌套);一旦你同时有邮件服务商、营销工具和工单系统,这个上限比听上去容易撞到得多。还有,以 ~all 或 ?all 结尾只是给接收方一个建议而不是指令,所以来自其他主机的邮件往往照样被投递。

A 记录和 CNAME 有什么区别?

A 记录把一个名字直接指向一个 IPv4 地址。CNAME 把一个名字指向另一个名字,那个名字接着还要再解析一次。让人栽跟头的规则是:同一个名字上,CNAME 不能与任何其他记录共存——这意味着域名的顶点(apex)因为必须有 SOA 和 NS 记录,就不能有 CNAME。服务商用 ALIAS 或 ANAME 记录来绕开这一点,它们在顶点上表现得像 CNAME,但在服务器端完成解析。

这里用的是哪个解析器?

我们服务器自己的解析器,这是有意为之。去查一个固定的公共解析器(比如 8.8.8.8),报告的会是 Google 看到的结果,而不是一个普通客户端看到的结果,而这两者的差异比你希望的要频繁——按地理位置分流的应答、分视图 DNS,以及解析器层面的过滤,都会造成这个落差。

DNS is also the part of your own browsing that is most often unencrypted. Which resolver answers your queries determines who can see every domain you visit, whatever else is encrypted. Test which resolver you are really using

最后审校于 。发现有内容过时了? 告诉我们.