假设我们拥有 mywebservice.com 区域。
我希望我的每个客户都有自己的子域,例如 customer.mywebservice.com。
customer.mywebservice.com 需要是给定服务器异地的 CNAME。由于该站点管理自己的设备并且可以随时更改地址,因此 CNAME 是必需的。
人们还需要能够向 [email protected] 发送电子邮件,这需要一个简单的 MX 记录。
但是,这就是我想要一些指导的地方:
根据RFC 1034:
If a CNAME RR is present at a node, no other data should be
present; this ensures that the data for a canonical name and its aliases
cannot be different.
我还验证了我的 DNS 服务器将拒绝为使用它们的主机提供除 CNAME 之外的任何内容。
所以,看来我可能有一个失败的情况。如果我想使用 MX 记录,我需要使用 A 而不是 CNAME。
谁能想到任何解决方法?谢谢!
不幸的是,您遇到的是 DNS 规范的限制。在大多数 DNS 服务器实现中,拥有与定义为 CNAME 记录相同的主机名的 MX 记录将失败。一些较旧的 DNS 服务器将允许这样做,但它们大多已被淘汰,以支持更新、更安全的实施。
您需要直接使用带有客户站点 IP 地址的“A”记录而不是使用别名记录,而不是使用 CNAME 记录。
经过大量的工作和研究,我找到了一个可以接受的解决方案。首先,重要的是我们都遵循 RFC。我修补了我的 DNS 服务器以违反 RFC,我发现其他几个主要的 DNS 服务器不会遵守更改。
适当的举措是将 MX 放在 CNAME 指向的主机上。因此,如果 customer.mywebservice.com 是 A 记录 loadbalancer.mywebservice.com 的 CNAME,则还可以为 loadbalancer.mywebservice.com 构建一个 MX 记录。我已经验证这适用于所有主要的解析器。
如果对 customer.mywebservice.com 进行 MX 查询,解析器库将遵循 CNAME 并为最终 A 记录获取正确的 MX。欢呼!
您要求客户必须能够更改地址,您是否考虑过允许客户动态更新自己的记录?使用动态 dns,您可以使用 A 记录,客户可以根据需要更改记录。这需要一些工作,但您可以将每个单独的子域作为一个单独的区域,这样您就可以确保客户只能触摸他们自己的区域。
我还没有尝试过,但gnudip似乎是一个开源工具,用于促进动态更新,而无需处理身份验证和在 DNS 服务器上设置大量区域。
如果所有这些记录的 MX 记录都相同,那么您可以尝试使用 DNAME 将 XYZ.mywebservice.com 重定向到 hosting.mywebservice.com。在 hosting.mywebservice.com 下添加您的相关 MX 和 A 记录。
我必须说我从未在生产中使用过 DNAME 记录,但您可以在RFC2672中阅读更多关于它们的信息。
customer.mywebservice.com CNAME 的 RHS 是否有 MX 条目?
如果是这样,那么邮件服务器将使用该 MX 来查找要使用的邮件服务器。希望你能控制它。
Michael Gorsuch 的回答在很大程度上是正确的,CNAME -> A+MX 链确实有效……主要是。但是,它确实会在某些 MTA 中引发一些不良行为。我发现以相当大的规模运行此解决方案:
目前尚不清楚这些问题有多普遍(google/hotmail/yahoo/etc 似乎都正确处理了这个问题),但它们确实让我们寻找更好的解决方案。
一个可能且有效的解决方案是为您的所有客户创建一个基本主机名,并将其设置为异地网络服务器和您的记录
A
,然后将所有客户的域 CNAME 到该单个主机名。这样,当异地的 IP 地址发生变化时,您只需更改一条记录。AAAA
MX
这是唯一有效且可能的方式,因为 CNAME 是一组完整记录的别名,而不仅仅是
A
.MX 和 CNAME 是完全独立的记录 - 第一个确定给定域的邮件服务器,第二个给出域的地址。这应该有效: