cname与mx记录为什么不能共存

1 引言

有用户在v2ex反应,腾讯云(DNSPod)和阿里云都不支持cnamemx记录共存,但是之前腾讯云和阿里云都是支持cnamemx共存的,那么是什么原因导致这个产品使用发生变化?

2 RFC

RFC1034明确表示cname不能与其它记录共存

If aCNAME RR is present at a node, no other data should be present; this ensuresthat the data for a canonical name and its aliases cannot be different.

当然还有一条是关于查询逻辑的:

如果一个域名有cname纪录,那么查询其余类型都应该返回cname记录

当然查询逻辑是可以通过修改代码更改的。

3 发送邮件域名查询逻辑

假如dns.com区配置了mx和cname纪录:

dns.com. in cname 123.jiasule.com.
dns.com in mx 10 mail.cnnic.cn.
比如我们向[email protected]发送邮件,

  1. 向递归DNS(localDNS)发起dig @localdns dns.com mx查询
    2.递归DNS会将这个查询转发给dns.com的权威服务器,dig @ns1.dns.com dns.com mx
  2. 按照之前所说的查询逻辑,权威服务器会返回dns.com. in cname 123.jiasule.com.
  3. 递归DNS拿到123.jiasule.com这个结果,根据cname查询,会继续查询jiasule.com的权威服务器,然后发起dig @ns.jiasule.com dns.com mx,显然jiusule.com是不可能有dns.com的mx记录。

也就说在根据标准RFC实现的递归服务器和权威服务器都是无法实现CNAME与MX记录共存的,除非权威服务器和递归服务器都进行二次开发。

实际来说不现实,所以支持cname与mx记录共存的权威服务器都不遵循

如果一个域名有cname纪录,那么查询其余类型都应该返回cname记录

这个查询逻辑,实际的查询逻辑一般都是查询什么类型返回什么类型,如

dig @ns.dns.com dns.com mx ==>  dns.com in mx 10 mail.cnnic.cn.
dig @ns.dns.com dns.com cname ==> dns.com. in cname 123.jiasule.com.

虽然权威服务器已经满足我们的需求了,但是递归服务器无法满足该需求,在cloudXNS一篇CloudXNS码农提示】为何CNAME和MX不能共存?里提到递归DNS服务器在查询某个常规域名记录(非CNAME记录)时,如果在本地cache中已有该域名有对应的CNAME记录,则会开始用该别名记录来重启查询。--这个结论需要验证或查看RFC相关文档

总结来说,这个问题就是无解,对于阿里云和腾讯云来说,一旦用户使用mx与cname记录共存,那么就会有工单来问为什么邮件发不出去的问题。

3 怎么解决

CloudXNS码农提示】为何CNAME和MX不能共存?提到的一种301跳转的方式,当然还有一种方案是对mx的使用进行特殊处理,对mx记录进行特殊处理一般适用于CDN厂商。

问题是可以解决,但是对于使用者来说会造成一定困扰,比较好的方式是调整业务使用方法

你可能感兴趣的:(cname与mx记录为什么不能共存)