dns服务器

为什么cname记录和MX记录冲突?(不能同时解析MX记录和cname记录)

先约定一下名称,裸域就是你申请的域名,比如moneyslow.com或者xyz.com这种。
很多提供权威DNS解析的服务商都不提供域名裸域又叫根域(root record)的CNAME解析,有些即使提供了也会在你添加裸域的CNAME记录时给你一个警告提醒。

CNAME记录和MX记录冲突的根本原因在于CNAME (Canonical NAME)记录的特殊性。根据RFC 1034的规定,根域名不能设置CNAME记录,这是由DNS服务本身的固有限制决定的。或许你可以在一些DNS服务商那里为根域名添加CNAME记录,但这些都是不符合DNS规范

万网的权威DNS解析服务,当给域名的裸域添加CNAME时就会报错,说是不支持给裸域添加CNAME记录;国内比较知名的权威DNS服务商DNSPod也会在你给域名的裸域添加CNAME解析时提醒你:如果发现邮件收发异常请删除这条域名的CNAME解析。

为何这些权威DNS服务提供商都不建议给裸域添加CNAME记录呢?这个要从DNS协议这块来说起了。DNS协议是在1987年11月起草的,当时压根没有人知道万维网(WorldWideWeb),因为万维网的概念是在两年后的1989年被万维网之父TimBerners-Lee提出的。当时也更不会有各种提供绑定域名服务的互联网建站公司了。因此DNS协议规定不能给裸域添加CNAME记录。

CNAME(Canonicalname),即一个域名的别名,如果你的域名moneyslow.com的CNAME记录是xzy.com,那么就可以说moneyslow.com是xyz.com的别名。既然moneyslow.com是xyz.com的别名了,那么查询moneyslow.com的其他记录比如MX(MaileXchange)记录,就直接用xyz.com的MX记录就行了。对别名的理解是这样的,并且DNS协议也明确规定了,更详细的内容可以查看RFC1034和RFC1035。

举个例子来说:

moneyslow.com CNAME xyz.com
moneyslow.com MX xxx.com
xyz.com MX zzz.com


以上的意思很明显,moneyslow.com的CNAME记录是xyz.com,而moneyslow.com的MX记录是xxx.com,xyz.com的MX记录是zzz.com。
当你访问moneyslow.com这个地址的网页服务时,你拿到的是xyz.com,然后被本机缓存起来了。接着你再给moneyslow.com这个域名发送邮件时,根据DNS协议规定,你的公共DNS服务器(也叫缓存DNS服务器)会先去本机DNS缓存里查询moneyslow.com的CNAME记录是否存在,如果存在就再去查询这个CNAME记录的MX记录,然后向这个MX服务器发送邮件。而在这个例子中会导致本该发送给xxx.com MX服务器的邮件结果发送给了zzz.com MX服务器。
当然,反过来,即先发邮件再打开网页就不会有问题。

所以,不止不建议给裸域添加CNAME记录,如果其他子域提供邮件服务的话也是不能添加CNAME记录的。比如你提供邮件服务的子域是sub.moneyslow.com即邮箱地址类似xxx@sub.moneyslow.com,那么你不是能给sub.moneyslow.com添加CNAME记录的。之所以很多服务商不支持给裸域添加CNAME是因为裸域使用邮件服务的概率比较大。

另外,也有些比较有实力的服务商会提供诸如将裸CNAME记录转换成A记录的功能。就像cloudflare.com提供的CNAME flattening服务。原理就是你显式的添加CNAME记录,而CloudFlare在背后将CNAME记录递归解析并转换成A记录。由于CloudFlare的数据中心比较多,所以返回给你的递归解析后的记录也是离你最近的记录,根本不用担心访问速度的问题。
CNAME flattening 解决的问题:
A 记录只能指向单个 IP。无法有效利用已有的 CDN 网络。比方说,Google有这么多服务器,你加 A 记录的话只能指向某一个 IP,其他的服务器永远访问不到,多尴尬(用 CNAME 可解)。可惜,CNAME 记录不能应用于根域名。你可以给比方说:你可以给www.moneyslow.com 加 CNAME 到 xyz.com 但不能把 moneyslow.com 也指向 xyz.com。这将导致 @moneyslow.com 的 MX 记录失效。(故而 DNS 标准形成时候的几个 RFC 都不允许这种做法)(在 www 子域名上应用 CNAME 可解),但是这样很不易于推广嘛。你怎么跟你的用户解释,为什么打 www 和不打 www 打开的网站完全不同?并且叮嘱客户一定要加 www。

使用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记录。

下图是cloudflare的自带功能截图

为什么cname记录和MX记录冲突?(不能同时解析MX记录和cname记录)

其结果就是dig出来的多个ip地址的A记录:

$ dig example.com

QUESTION SECTION:
;example.com.   IN   A

;; ANSWER SECTION:
example.com.   299   IN   A   162.159.255.115
example.com.   299   IN   A   162.159.254.115
example.com.   299   IN   A   162.159.252.116
example.com.   299   IN   A   162.159.253.116
example.com.   299   IN   A   162.159.253.115

以下是dns记录的基础知识:

  1. A记录(IP指向)
    又称IP指向,用户可以在此设置子域名并指向到自己的目标主机地址上,从而实现通过域名找到服务器找到相应网页的功能。
    说明:指向的目标主机地址类型只能使用IP地址。
  2. CNAME(别名指向)
    通常称别名指向。您可以为一个主机设置别名。相当于用子域名来代替ip地址,优点是如果ip地址变化,只需要改动子域名的解析,而不需要逐一改变ip地址解析。
    说明:
    (1)CNAME的目标主机地址只能使用主机名,不能使用IP地址;
    (2)主机名前不能有任何其他前缀,如:http://等是不被允许的;
    (3)A记录优先于CNAME记录。即如果一个主机地址同时存在A记录和CNAME记录,则CNAME记录不生效。
    (4)CNAME最典型的应用CDN,一般都是很多域名CNAME到CDN服务商单个域名下的子域名。
  3. MX记录
    邮件交换记录。用于将以该域名为结尾的电子邮件指向对应的邮件服务器以进行处理。如:用户所用的邮件是以域名mydomain.com为结尾的,则需要在管理界面中添加该域名的MX记录来处理所有以@mydomain.com结尾的邮件。
    说明:
    (1)MX记录可以使用主机名或IP地址;
    (2)MX记录可以通过设置优先级实现主辅服务器设置,”优先级”中的数字越小表示级别越高。也可以使用相同优先级达到负载均衡的目的;
    (3)如果在”主机名”中填入子域名则此MX记录只对该子域名生效。
  4. NS记录(Name Server)
    是域名服务器记录。用来表明由哪台服务器对该域名进行解析。您注册域名时,总有默认的DNS服务器,每个注册的域名都是由一个DNS域名服务器来进行解析的,DNS服务器NS记录地址一般以以下的形式出现:
    ns1.domain.com
    ns2.domain.com
    说明:
    (1)”优先级”中的数字越小表示级别越高;
    (2)”IP地址/主机名”中既可以填写IP地址,也可以填写像ns.mydomain.com这样的主机地址,但必须保证该主机地址有效。如,将 news.mydomain.com的NS记录指向到ns.mydomain.com,在设置NS记录的同时还需要设置ns.mydomain.com的 指向,否则NS记录将无法正常解析;
    (3)NS记录优先于A记录。即,如果一个主机地址同时存在NS记录和A记录,则A记录不生效。这里的NS记录只对子域名生效。