1 引言
有用户在v2ex
反应,腾讯云(DNSPod)和阿里云都不支持cname
与mx
记录共存,但是之前腾讯云和阿里云都是支持cname
与mx
共存的,那么是什么原因导致这个产品使用发生变化?
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.
比如我们向testser@dns.com发送邮件,
- 向递归DNS(localDNS)发起
dig @localdns dns.com mx
查询
2.递归DNS会将这个查询转发给dns.com的权威服务器,dig @ns1.dns.com dns.com mx
- 按照之前所说的查询逻辑,权威服务器会返回
dns.com. in cname 123.jiasule.com.
- 递归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厂商。
问题是可以解决,但是对于使用者来说会造成一定困扰,比较好的方式是调整业务使用方法
网友评论