我正在尝试编写一个通用接口,可用于在 DNS 服务(如 AWS Route 53)中设置资源记录。一切似乎都很顺利,直到我注意到 Route 53 将我的第一个优先级为 10 的 MX 值替换为第二个优先级为 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 要求将值组合到与资源记录类型和名称的“键”关联的“集合”中。
答案1
您的问题已在RFC 1035标准跟踪文件第 3.3.9 节,以及RFC 974。
它很短,我将其复制到这里:
3.3.9. MX RDATA 格式
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | PREFERENCE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / EXCHANGE / / / +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
在哪里:
PREFERENCE 一个 16 位整数,指定在同一所有者中给予此 RR 的优先权。值越低,优先权越大。
EXCHANGE A 指定愿意充当所有者名称的邮件交换器的主机。
MX 记录会导致 EXCHANGE 指定的主机进行 A 类附加部分处理。MX RR 的使用在 [RFC-974] 中有详细说明。
因此,单个 MX 记录只能包含单个邮件交换完全限定域名,该域名必须解析为一个或多个 A 或 AAAA 记录。无法在单个 MX 记录中指定多个邮件交换器名称。
DNS 规范仅规定了在查询时如何向调用者呈现这些信息。没有人规定 DNS 服务器应如何在其软件中存储这些数据。只要服务器的行为符合标准,任何事情都可以。因此,尚不清楚所有这些记录是如何存储的,但这根本不重要。
如果您有一条 MX 记录,其引用的名称解析为多个地址记录,那么您将在这些地址之间实现简单的负载平衡。这是因为发送主机上的 DNS 解析器将随机选择一个地址并返回到调用者进程,在此阶段,调用者进程充当 SMTP 客户端,搜索并连接到远程邮件交换器。
您可以拥有多个 MX 记录,这些记录的首选项值可以相同,也可以不同。如果首选项值相同,则如何选择要连接的特定主机由发送服务器自行决定。例如,Postfix 默认会平衡连接负载,而其他服务器可能会采取不同的行为。
答案2
除了少数情况(例如类型)外CNAME
,资源记录可以为同一所有者出现多次,这就是为什么它被称为“资源记录集”(没有固有顺序)。
因此,您完全可以拥有多个 MX 记录,权重可以相同或不同。这是来自通用 DNS 规范,但 DNS 提供商可以自由地执行自己的约束。但是,每条记录都是独立的,您不能将 2 条MX
记录合并为一条,这没有意义。
至于
其他 DNS 服务允许单个 MX 条目使用不同的 TTL 值
(这适用于任何类型的记录,而不仅仅是 MX),这在 DNS 开始时基本正确,但现在已不再正确,特别是因为 DNSSEC。
给定资源记录集中的所有记录必须具有相同的 TTL。
RFC 8499(又名 BCP 19)“DNS 术语”解释如下:
RRset:一组“具有相同标签、类别和类型,但具有不同数据”的资源记录(根据 [RFC2181] 第 5 节)。在某些文档中也写作“RRSet”。需要澄清的是,此定义中的“相同标签”是指“相同的所有者名称”。此外,[RFC2181] 规定“RRSet 中所有 RR 的 TTL 必须相同”。
5.2. RRSet 中 RR 的 TTL
资源记录也有生存时间 (TTL)。RRSet 中的 RR 可能具有不同的 TTL。目前尚未发现有其他更好的方法可以实现这一点。但是,这可能会导致缓存服务器发出部分回复(未标记为“截断”),其中 RRSet 中部分(但不是全部)RR 的 TTL 已过期。
因此,RRSet 中使用不同的 TTL 已
被弃用,RRSet 中所有 RR 的 TTL 必须相同。
DNSSEC 中的 RRSIG 记录(RFC 4034 的§3.1)涵盖整个 RRset,并且其中包含原始 TTL,因此 RRset 的所有记录必须共享相同的 TTL。