域名 MX 记录与 CNAME 冲突

 CDN | 域名  oldking   2017-07-29   1,294 人阅读  13 条评论

在采用根域名作为网站的网址的时候会遇到一些小问题,如前面的文章所说,其中有一个域名的 MX 记录与 CNAME 冲突,是一个比较重要的原因,也是本站在人潮汹涌的去www化下,最后的倔强,放弃了裸域名作网址的关键,但其实现在越来越多的人已经不习惯了输入www。

一、什么时候会用到 MX 和 CNAME

  • MX:如果需要设置邮箱,让邮箱能收到邮件,就需要添加MX记录。
  • CNAME:如果需要将域名指向另一个域名,再由另一个域名提供ip地址,就需要添加CNAME记录。

如上,当我们需要用到域名邮箱的时候,如本站采用腾讯的企业邮箱,发送通知的邮箱地址为 info>oldking.net (把 > 换位 @),就需要我把网站 oldking.net 根域名的 MX 记录指向腾讯企业邮箱提供的地址。

域名 MX 记录与 CNAME 冲突

用到 CNAME 的地方很多,最多的是用在网站 CDN 加速上,大部分加速服务提供的都是 CNAME 模式。

域名 MX 记录与 CNAME 冲突

二、MX 与 CNMAE 冲突

当同时使用了 MX 和 CNAME 记录之后就会产生问题,一些严格的 NS 服务商会在你添加的时候直接不允许这样操作。如 CloudXNS 就严格按照标准,不允许同时添加 MX 和 CNAME。

域名 MX 记录与 CNAME 冲突

但是老鬼之前有个域名在 Dnspod 就是可以的,虽然会跳出提示,但是可以添加的。但是所产生的问题就是,经常收不到邮件,或者邮件不能立即到达,在老鬼的实验中有一些邮件延迟了好几个小时。这对使用企业邮箱的用户肯定造成了很大的困扰。知其然,知其所以然,原理是什么呢?

三、技术剖析以及原理

因为老鬼已经从 Dnspod 域名转出了,所以这里借用 CloudXNS 客服实验的图片。

根据 RCF 1034 标准,在 3.6.2 中指出,如果 CNAME 资源记录出现在一个域名节点,为了确保不会出现不同的解析结果,这个域名节点将不再接受其他记录值。我们来验证一下。

假设为DNS域chinatesters.cn注册了下面的两条记录(MX 与 CNAME 同时存在):

MX 10 mx.ym.163.com.

CNAME  fastweb.com.cn.

这时候我们用递归命令 dig 查询解析

域名 MX 记录与 CNAME 冲突

我们看到,不管是查询 MX 还是 CNAME 的解析,其结果都是 fastweb.com.cn. 这和我们设置并不一致,看来是这里出现的问题。但如果在递归服务器的 CNAME 记录 TTL 过期后再来做查询,只是把查询的顺序颠倒, (即先查询 MX 记录,再查询 CNAME 记录)则有可能得到期望的正确结果。

总结一下,递归 DNS 服务器在查询某个常规域名记录(非 CNAME 记录)时,如果在本地 cache 中已有该域名有对应的 CNAME 记录,则会开始用该别名记录来重启查询。上文中dig查询MX记录测试示例即对应于这种情况。

因此,即使某些域名解析系统网页上并未限制用户同时填写 CNAME 和 MX 的操作,但只要将CNAME和MX配置到一起,上述问题也一定是存在的,它会导致邮件服务偶尔出现异常。

实际上除了 CNAME 和 MX 不能共存外,已经注册了 CNAME 类型的域名记录是不能再注册除 DNSSEC 相关类型记录(RRSIG、NSEC 等)之外的任何其他类型记录(包括 MX、A、NS 等记录)。理由同上,这里就不一一做演示了。

四、解决办法,小结

当然,如果你不需要同时使用那些冲突的记录,以上问题将对你没有任何影响。

  1. 将 NS 替换成 CloudXNS 并且使用它们提供的 LINK 记录代替 CNMAE
  2. 使用二级邮箱,如可以添加 mail.oldking.net 这类的二级域名,并将这个二级域名 MX 指向邮箱服务器地址,这样得到的类似的邮箱地址为 info>mail.oldking.net
  3. 使用 Dnspod 的服务,按照 Dnspod 客服的说法,是勉强可以的,但是根据 CloudXNS 的说法,这样是不符合规定的,不过亲自测试可以收到,不过经常漏收,或者延迟几个小时收到邮件。
  4. 使用 Cloudflre 的服务,在 Cloudflare 解析的域名可以做到 CNMAE 和 MX 共存
  5. 不要同时使用 CNAME 和 MX 等,MX 与 A 记录是不冲突的

目前包括 CloudXNS 和 Dnspod 等服务商对于这个问题,都有自己的解决方案,不过都有各自的局限,比如只能所有解析都用他的,或者必须要使用他自身的 CDN 服务等,都是不完美的解决方案。基于此,本站放弃了直接使用裸域,而采用传统的 www 主站,根域名做 301 跳转到 www,虽然暂时没有上 CDN 不过为了不时之需,所以从开始就是不使用裸域了。

 

 

本文地址:https://www.oldking.net/121.html
版权声明:本文为原创文章,版权归 oldking 所有,欢迎分享本文,转载请保留出处!
 关于作者
oldking 老鬼(oldking),程序员,VPS爱好者,长时间以各种名称出没于各类主机论坛,技术社区,08年开始接触建站,09年开始有了第一个自己的网站,熟悉一点 Web 知识,熟悉一点服务器运维知识,爱好鼓捣各种新奇的东西,现在,一切从头开始,认真做一个自己喜欢的东西。

 发表评论


表情

  1. Wei
    Wei @回复

    Cloudflare 不是可以共存,而是会自动执行 CNAME Flattening,也就是说 CF 自动抓去 CNAME 目的地 ip,然后以 A 记录的形式返回给用户。
    Cloudxns 也有同样的功能,选择私有记录类型 LINK 即可。

  2. 阿七
    阿七 @回复

    即使301的话,根域名也需要CNAME呀。
    还是和MX有冲突。

    • oldking
      oldking【站长】2017-11-07 at 01:35  回复

      @阿七根域名用A记录就可以了,根域名一般不需要用cdn加速,因为主网站是www,根域名只是为了跳转,当然,如果是为了完全影藏ip的话,还有其他办法

  3. 懿古今
    懿古今 @回复

    就是因为这个问题导致我放弃了QQ的域名邮箱,不过现在习惯了QQ邮箱也不错

  4. 豆芽
    豆芽 @回复

    我的裸域+163企业邮箱暂时没发现问题

  5. Xy1on
    Xy1on @回复

    鬼哥,网站用的什么插件压缩啊?

    • oldking
      oldking【站长】2018-07-17 at 00:30  回复

      @Xy1on我用的是主题自带的,很多wp的缓存插件应该都这个功能,很简单的几行代码也能实现。