1. 首先裸域是可以设置CNAME的,但是根据RFC,如果设置了CNAME就不能设置其他记录,DNSPod现在可以同时在裸域添加MX和CNAME记录,但是在添加CNAME记录的时候会提示与MX记录有冲突。
2. 很多域名会在裸域设置MX记录,导致CNAME和MX记录冲突问题,原因就是17楼@
dant提出的问题,如果递归DNS是根据RFC协议,先查找CNAME,再找CNAME值的MX,如果CNAME记录值上没有设置MX记录,这时候就会导致MX失效。如果递归DNS没有按照RFC协议直接查询MX记录,或者在当前递归上没有缓存CNAME记录,那么这时候MX就不会失效。
3. 如果一定要同时设置MX记录和CNAME记录,DNSPod已经开始部署解决方案,可以部分解决CNAME记录和MX记录冲突的问题。
如果用户的CNAME记录链一直到最后的A记录都在DNSPod上解析,并且所有CNAME指向的域名都开启了CNAME加速功能(如果CNAME完全指向本域名的其他子域名则可以不用开启CNAME加速),那么我们在解析CNAME记录的时候会检查该子域名是否设置了MX记录,如果设置了MX记录则直接返回最终的A记录,不再返回中间的CNAME。这样递归上就不会同时存在CNAME和MX记录,从而避免找不到MX记录。
该功能已经在免费套餐上灰度了一段时间,10个节点灰度了2个节点:113.108.80.138和125.39.208.193,预计2个月时间可以全部灰度完成。
具体可以看下面的测试用例,前面两个是已经灰度的情况,第三个是未灰度的情况。
~$ nslookup
loveping.xyz 113.108.80.138
Server: 113.108.80.138
Address: 113.108.80.138#53
Name:
loveping.xyzAddress: 1.1.1.1
~$ nslookup
loveping.xyz 125.39.208.193
Server: 125.39.208.193
Address: 125.39.208.193#53
Name:
loveping.xyzAddress: 1.1.1.1
~$ nslookup
loveping.xyz 112.90.82.194
Server: 112.90.82.194
Address: 112.90.82.194#53
loveping.xyz canonical name =
cnametest.loveping.xyz.
cnametest.loveping.xyz canonical name =
cnametest1.loveping.xyz.
Name:
cnametest1.loveping.xyzAddress: 1.1.1.1
4. 当然这个方案存在的缺陷也比较明显,就是所有域名都要在DNSPod解析才能解决,那有没有其他解决方案呢,当然是有的。前面说了从RFC来看,应该先查找CNAME,再找CNAME的MX记录。那么对应的解决方案就是让你的CDN厂商在CNAME域名上增加与裸域相同的MX记录,当然如果CNAME到的是自己的其他域名的话,可以自己增加,同时为了兼容未严格按照RFC协议实现的递归DNS,裸域的MX建议继续保留。
这个方案好像非常好,可以完美的解决CNAME和MX冲突的问题,但也只是看上去完美而已,如果你不是大客户的话,CDN厂商没有可能给你单独支持的,因为支持该功能,CDN厂商需要给你分配完全单独的CNAME域名和调度系统,不能和任何其他域名重复,并且在需要修改调度的时候,需要同时修改该CNAME域名的调度,MX记录有修改时也需要联系CDN厂商给你改。而且是每多一个客户,就需要多维护一套,所以小客户是不可能使用的。