【问题标题】:CNAME for Azure application causes email problems with MX and A records ignoredAzure 应用程序的 CNAME 导致电子邮件问题,MX 和 A 记录被忽略
【发布时间】:2013-04-08 18:28:05
【问题描述】:

我们有一个在 Microsoft Azure 上运行的应用程序,并设置了一个 CNAME 记录来覆盖该域,因此我们可以拥有 http://example.com 的好 URL(注意我在整个过程中将我们的真实域替换为 example.com)。

CNAME
mydomain.com -> mydomainapp.cloudapp.net

我们正确设置了 MX 和 A 记录,因此 MX 包含 mailserver.example.com 和将邮件服务器指向正确 IP 地址的 A 记录。

MX
mailserver.example.com

A
mailserver -> 198.168.111.111 (note this IP is fictitious)

一切正常,对于大多数电子邮件,但对于某些邮件服务器(尚不确定是什么技术),他们现在使用 CNAME 而不是 MX 和 A 记录。

因此,发送至 jerry@example.com 的电子邮件实际上会发送至 jerry@exampleapp.cloudapp.net,其中 example.cloudapp.net 是我们使用 CNAME 映射的 Azure 域。

EMAIL TO: jerry@example.com
BECOMES: jerry@exampleapp.cloudapp.net

我能找到的唯一建议只是说没有域级别的 CNAME 或根本不使用 CNAME,但当然 Azure IP 地址可以更改,因此我们必须使用 CNAME。我们可以为所有内容添加前缀 www.example.com,但肯定有更好的解决方案。

非常感谢任何想法。

【问题讨论】:

  • 已经对此进行了各种研究,但没有取得太大进展。我看到的一种建议解决方法是在 Azure 应用程序的端口 25 上设置一个电子邮件侦听器,然后重新发送电子邮件(参见 blog.smarx.com/posts/… ),这是一个示例。想到大锤和螺母。

标签: email azure dns cname mx-record


【解决方案1】:

不可能在域级别使用 CNAME 记录,因为 CNAME 是所有 RR 类型的别名,因此它总是会导致 MX、SOA、NS 等查找的重定向也是。

以下 RFC1912 第 2.4 节的摘录非常清楚地说明了这一点:

CNAME 记录不允许与任何其他数据共存。在
换句话说,如果 suzy.podunk.xx 是 sue.podunk.xx 的别名,您
也不能有 suzy.podunk.edu 的 MX 记录,或 A 记录,或
甚至是 TXT 记录。尤其不要尝试将 CNAME 和 NS 结合使用
像这样的记录!:

       podunk.xx.      IN      NS      ns1
                       IN      NS      ns2
                       IN      CNAME   mary
       mary            IN      A       1.2.3.4

经验不足的管理员经常尝试这样做 让您的域名也成为主机的明显方法。然而, 像 BIND 这样的 DNS 服务器会看到 CNAME 并拒绝添加任何 该名称的其他资源。由于不允许其他记录 为了与 CNAME 共存,NS 条目将被忽略。因此所有 podunk.xx 域中的主机也会被忽略!

因此,您不得mydomain.com 使用 CNAME 记录!

因此,您必须为 mydomain.com 设置 A 记录(在 MX:s 和其他需要的记录中),因为这是 DNS 方面唯一可行的解​​决方案。

【讨论】:

  • 是的,我了解 RFC,但有趣的是,即使存在域级别的 CNAME,绝大多数邮件服务器也会首先读取 MX 记录。只有少数人遵循正确的 RFC 建议。这使得它更加混乱,因为它似乎在大多数情况下都有效,但对少数人却失败了。但是,您是对的,根据发布的解决方案,唯一的答案是 A 记录。如果 Microsoft 在为 Azure 托管应用程序设置 DNS 的说明中包含这一点以及 CNAME 的缺点,将会很有帮助。
  • 这可能取决于 DNS-server 的软件。如果存在 CNAME 记录,兼容的 DNS 服务器可能会拒绝将该区域加载到内存中,或者忽略额外的条目。
  • 电子邮件不一定需要 MX 记录,因为如果邮件服务器找不到 MX 记录,它们将使用 A 记录。或者当查找 MX 记录并且缓存递归名称服务器找到 CNAME 时,递归名称服务器将解析 CNAME 并使用别名重试 MX 查找。令人困惑的是,是的,因为您可以尝试以损坏的方式配置您的 DNS,而世界实际看到的可能完全不同。总是很好检查,例如dig 查看返回的 DNS 记录是否符合您的预期。
【解决方案2】:

是的,有一个更好的解决方案 - 为您的应用使用二级域。让它成为portal.mydomain.com 并使用CNAMEportal.mydomain.com 映射到mydomainapp.cloudapp.net 并为mydomain.com 设置MX 记录,并且所有地址都采用user@mydomain.com 的形式。这样一来,您仍然很清楚您拥有 mydomain.com,并且您所有的电子邮件看起来仍然很严肃 - user@mydomain.com,而不是 john1094@gmail.com

从技术上讲,上述设置确实意味着您没有域级别 CNAME

【讨论】:

  • 谢谢,但真的希望主应用程序位于mydomain.com。我知道我们可以删除域级别的 CNAME,只允许 www.mydomain.com 或任何其他子域,但企业希望在没有前缀的情况下运行,这是一个合理的要求。
  • @Jezbers:是的,这是一个明确的目标,但我还没有找到任何解决方案来实现它。
  • 感谢您指出这一点。由于所有其他解决方案都非常复杂,并且至少会让我忙几个小时,所以我会这样做。
【解决方案3】:

好的,经过大量研究,似乎最好的(至少在我看来)解决方案是使用 A 记录而不是 CNAME 作为域级别记录。

您可能会尖叫“什么!但是 IP 地址是动态分配的!”。是的,但前提是您拆除部署并更换它。只要您发布到登台并使用“交换生产和登台”选项,Windows Azure 就会保留您的 VIP 地址。这样做会保留您的 VIP 地址,以便您可以在 DNS 中使用 A 记录而不是 CNAME。

有关背景信息,请参阅http://www.windowsazure.com/en-us/develop/net/common-tasks/custom-dns/

注意 MS 官方线路是推荐 CNAME 而不是 A 记录,因为可能会交换 IP 地址,但我猜他们并没有考虑人们想在 Azure 平台上运行 http://mydomain.com

我还找到了其他可能的解决方案,包括在您的应用程序中构建一个 SMTP 侦听器,该侦听器读取端口 25 上的邮件并将其转发回。技术上不错,但我想到了大锤和坚果,而且还有一件事会出错,当然还有一大堆资源需要支付。

【讨论】:

    【解决方案4】:

    我们使用A 记录作为我们的根域,这工作正常,正如@Jezbers 在他的回答中提到的那样。 A 记录不会破坏电子邮件。但是,CNAME 记录会影响其他记录(它允许您拥有“重定向域”功能,因此 foo@mydomain.com 也适用于 foo@mynewdomain.com)。

    如果您正在寻找比 SMTP 侦听器解决方法更好的“解决方法”解决方案,那么您可以考虑以下方法:

    www 子域中托管您的网站,并将CNAME 放在那里。让其他东西托管到 www 的 301 重定向,并使用 A 记录将您的根域指向此重定向站点。

    并不完美,但很可能比 SMTP 选项更好。

    【讨论】:

      猜你喜欢
      • 2014-05-07
      • 2015-05-16
      • 2014-11-26
      • 2018-06-02
      • 2013-05-27
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多