怎样设置DNS记录

2024年11月30日 | 分类: 【技术】

MX记录和CNAME记录冲突的三种解决方案

原文:https://blog.lanluo.cn/11560

很多朋友在部署域名邮箱的时候都会发现,DNS服务商会提示根域名MX记录和CNAME记录有冲突,不能共存。今天,我就来介绍一下这种情况为什么会发生,且如何完美解决。

CNAME记录和MX记录冲突的根本原因在于CNAME (Canonical NAME)记录的特殊性。根据RFC1034的规定,根域名不能设置CNAME记录,这是由DNS服务本身的固有限制决定的。或许你可以在一些DNS服务商那里为根域名添加CNAME记录,但这些都是不符合DNS规范的。如果要将根域名设置为另一个域名的别名,需要设置ALIAS记录。在下一节我将具体介绍ALIAS记录。

如果根域名设置了CNAME记录,会和其他所有的记录相冲突,而最常见的冲突情形就是MX记录。对于同一个根域名,CNAME记录和A记录、NS记录、SOA记录、TXT记录等都会冲突,不过这些情形并不常见,所以一般不会造成太大的问题。

我们以同时在根域名设置CNAME记录和MX记录为例。向该域名的域名邮箱发信且使用DNS寻址时,如果先寻到了CNAME记录,就无法再获取到该域名对应的MX记录。这就会导致使用该域名搭建的域名邮箱在收件时会经常丢信漏信。同时,CNAME记录不仅与MX记录冲突,也会与TXT记录冲突,这就会导致为根域名设置的SPF-TXT记录无法生效,因此发信时更容易进垃圾箱。

那么问题来了,如果我们要为网站开启CDN, 那么最常见的方式就是使用CNAME接入。如果还需要一并使用域名邮箱,那么就不得不造成CNAME记录和MX记录的冲突。有什么好办法呢?这里我们有三个办法,可以解决这个问题。

解决CNAME和MX记录的冲突有三种可行的办法,分别是

  • (1) 使用www.域名接入CDN;
  • (2) 使用A记录轮询接入CDN;
  • (3) 使用ALIAS (CNAME Flattening) 记录代替CNAME记录。

接下来我将具体介绍这三种方法。

使用www.域名接入CDN

大家都知道,一般来说为根域名设置CNAME记录的情况都是由于网站需要接入CDN. 如果您可以接受网站采用www.example.com这样的网址而不是example.com,那么您完全可以使用www.example.com域名接入CDN. 由于www.example.com不是根域名了,因此它的CNAME记录不会和根域名的MX记录冲突,这样就解决了网站的CDN接入与域名邮箱共存的问题。

这种方法的有点在于最为简单,但缺点是必须使用www.形式的域名。

使用A记录接入CDN

如果您无法接受网站采用www.域名,那么您也可以将根域名采用A记录的方式接入CDN. 使用A记录时,您还可以自行设定线路,或者设置轮询。根域名的A记录不会和MX记录冲突,这样就解决了网站的CDN接入与域名邮箱共存的问题。

一般来说,这种情况比较适用于网站使用自行搭建的CDN系统,因为商用CDN系统的IP地址有时会发生变动,造成A记录解析失效。

使用ALIAS (CNAME Flattening) 记录代替CNAME记录

使用ALIAS记录代替CNAME记录是目前国际上最主流的设置办法了,它能起到与CNAME记录完全一样的效果,又不会和其他记录产生冲突。

这里我们先介绍一下ALIAS记录。ALIAS记录,又称CNAME Flattening记录,中文为“别名”记录,是一种CNAME记录的替代型记录。它能够起到和CNAME记录完全一样的效果,即将一个域名设置为另一个域名的别名,而唯一的差别就是ALIAS记录不会与其他记录发生冲突。

因此,我们只需要在DNS服务商那里为根域名设置ALIAS或者CNAME Flattening记录就可以了,它的设置方法与CNAME记录完全相同。通过设置ALIAS记录,我们就能够完美解决网站根域名的CDN接入与域名邮箱共存问题。如果您的DNS服务商目前不支持ALIAS记录,您可以使用市面上很多免费的DNS服务,比如Cloudflare, he.net, dnsimple.com, Route53 (这个不免费), cloudns.net, 等等。这些DNS服务商都支持设置ALIAS记录。大部分国际域名注册商,比如Godaddy, Porkbun, Namesilo, Namecheap, Gandi, Google Domains等等,也都支持设置ALIAS记录。

综上所述,CNAME记录具有特殊性,会和同域名下的所有其他记录发生冲突,导致无法同时配置根域名的CDN和MX域名邮箱。有三种方法可以解决CNAME记录与MX记录的冲突,分别是

  • (1) 使用www.域名接入CDN;
  • (2) 使用A记录轮询接入CDN;
  • (3) 使用ALIAS (CNAME Flattening) 记录代替CNAME记录。

我们推荐您使用一个支持ALIAS记录的DNS服务商,然后为您的根域名设置ALIAS记录,就可以完美解决这个问题。