CNAME为什么会给A记录 或其他记录有冲突

作域名解析的时候,遇到过A记录和CNAME记录冲突的情况,一直不太理解为什么会冲突。直到看到了,一段RFC文档,才明白。 CNAME记录和其他记录是不一样的。可以理解成CNAME记录不是最终的一个记录,是一个指向,指向那个域名就去查询被指向的域名的记录。

说着比较拗口。举个例子,我想发查询一个域名(xxx.gxxgle.com)的A记录, 比如查询

xxx.gxxgle.com  的 A 记录,如果 xxx.gxxgle.com 存在一个CNAM记录 ccc.gxxgle.com , 那么就去查询 ccc.gxxgle.com 的A记录。

开始提到了一段 RFC 文档 原地址是  https://tools.ietf.org/html/rfc1034

The domain system provides such a feature using the canonical name (CNAME) RR. A CNAME RR identifies its owner name as an alias, and specifies the corresponding canonical name in the RDATA section of the RR.

大意是说,域名系统提供了一个cname功能, cname记录把自己作为一个别名,并且cname中的记录值是真正需要处理的记录值。

If a CNAME RR is present at a node, no other data should be present; this ensures that the data for a canonical name and its aliases cannot be different. This rule also insures that a cached CNAME can be used without checking with an authoritative server for other RR types.

重点来了 如果一个域名的CNAME记录存在, 那么就应该保证其他的记录不存在, 这是为了防止标准的名字(canonical name)和别名( aliases)的记录值不同。同时CNAME还可以作为缓存,从而不用去权威服务器检查其他的记录类型。

做个测试

cname别名冲突测试

进行查询一下

nslookup - 8.8.8.8
> set type=a
> xxx.gxxgle.com
Server: 8.8.8.8
Address: 8.8.8.8#53

Non-authoritative answer:
xxx.gxxgle.com canonical name = yyy.gxxgle.com.

可以看到,对 xxx.gxxgle.com 进行A记录的查询的时候,存在 CNAME记录, 就转向了对 CNAME的记录的查询。 也就是说对一个域名的进行记录查询,如果存在cname记录,就查cname对应的记录。所以如果同时对一个域名做了 CNAME记录和其他的记录,就会有冲突。意思是 CNAME记录和其他的任何类型的记录都可能冲突,不仅仅是 A记录。所以不太理解CNAME最好还是不用。要么就搞明白CNAME什么时候用。

如果裸域名上做了,cname记录,那么这个域名的MX记录就不管用了,换句话说就是不能收邮件了。因为了有CNAME记录,就没办法让MX记录生效了。如果是阿里云的后台,添加的时候就是提示有冲突。

 

留下评论