我正在尝试编写一个通用接口,可用于在 DNS 服务(例如 AWS Route 53)中设置资源记录。事情似乎一直在工作,直到我注意到 Route 53 将我的第一个 MX 值替换为优先级为 10 的优先级为 20 的第二个 MX 值。
然后我在一个AWS 论坛帖子中读到 AWS 将只支持一个实际的 MX 记录,并且必须将多个值组合成一个值,并用换行符分隔。这让我有点困惑,因为我认为其他 DNS 服务允许对单个 MX 条目使用不同的 TTL 值——那么如果 MX 值实际上存储为一条记录,它们怎么能做到这一点呢?
是所有 DNS 服务器都将 MX 记录存储为单个资源记录,还是将这种业务组合成一个特定于 Route 53 的资源记录?我在其他文件中找不到任何关于它的信息。是否有涵盖此内容的 RFC?
更新:事实证明这是我的错误。我忘记了 Route 53 将单个名称的多个值分组并输入到资源记录集中。显然,这种将值组合成多行的业务仅适用于 Web UI。必须通过 API 将相同名称和类型的所有值组合到同一个“资源记录集”中,并使用一个UPSERT
来同时设置它们。所以 Route 53 显然仍然单独存储值,只是 Java SDK 2 API 要求将值分组到与资源记录类型和名称的“键”相关联的“集合”中。
除了少数情况,如
CNAME
类型,资源记录可以为同一个所有者多次出现,这就是为什么它被称为“资源记录集”(没有内在的顺序)。因此,您完全可以拥有多个具有相同或不同权重的 MX 记录。这是来自通用 DNS 规范的内容,但 DNS 提供商可以自由地做自己的限制。但是每条记录都是独立的,你不能把两条
MX
记录合二为一,这是没有意义的。至于
(这适用于任何类型的记录,而不仅仅是 MX),这在 DNS 开始时大部分是正确的,但现在不再正确,特别是因为 DNSSEC。
给定资源记录集中的所有记录必须具有相同的 TTL。
RFC 8499(又名 BCP 19)“DNS 术语”解释它:
RFC 2181 是“对 DNS 规范的澄清”:
DNSSEC 中的 RRSIG 记录(RFC 4034 的§3.1)涵盖了整个 RRset,并且其中包含原始 TTL,因此 RRset 的所有记录必须共享相同的 TTL。
您的问题已在RFC 1035标准跟踪文档第 3.3.9 节和RFC 974中得到完整解答。
很短,我复制到这里:
因此,单个 MX 记录只能包含单个邮件交换的完全限定域名,该域名必须解析为一个或多个 A 或 AAAA 记录。无法在单个 MX 记录中指定多个邮件交换器名称。
DNS 规范仅管理如何在查询时将此信息呈现给调用者。没有人说 DNS 服务器应该如何在他们的软件中存储这些数据。只要服务器的行为符合标准,任何事情都可以。所以不知道所有这些记录是如何存储的,但这根本不重要。
如果您有一个引用名称解析为多个地址记录的 MX 记录,您将在这些地址之间获得简单的负载平衡。这是因为发送主机上的 DNS 解析器将随机选择一个地址并返回到调用者进程,在此阶段作为 SMTP 客户端工作,它搜索并连接到远程邮件交换器。
您可以拥有多个具有相同或不同首选项值的 MX 记录。如果首选项值相同,则如何选择要连接的特定主机由发送服务器自行决定。例如,默认情况下 Postfix 将对连接进行负载平衡,而其他的可能会有不同的行为。