大家都知道裸域如果设置了 CNAME , MX 就会失效。 那么,能不能解决呢?
前提是用裸域作为主域名
1
hqfzone OP |
3
DesignerSkyline 2016-07-25 20:58:03 +08:00 via iPad
CloudXNS 不行
CNAME Flattening 支持的有 rage4 cloudflare route53 dnsimple |
4
ZE3kr 2016-07-25 21:00:53 +08:00 via iPhone 1
需要 DNS 解析商支持 ANAME ,或者 CNAME Flattening 功能,相当于是自动将主域的 CNAME 转化成 A 记录,实测感觉是 CloudFlare 效果最好,即使是原本 CNAME 是分区解析, CloudFlare 也能正确解析上(前提是目标 CNAME 支持 EDNS client subnet )。
我这里有介绍 ANAME : https://ze3kr.com/2016/05/rage4-best-dns/ Rage4 和 CloudFlare 都有支持,其他国外不少解析商也支持,比如 DNSimple 。 |
5
hqfzone OP @DesignerSkyline
@ZE3kr 看上去, cloudxns 的 LINK 好像就是 CNAME Flattening 啊。那么主流的 CDN 厂商,有哪些支持 EDNS client subnet 呢?比如阿里、腾讯之类的? |
6
abelyao 2016-07-25 21:08:59 +08:00
dnspod 支持裸域 cname 同时 mx 解析,除了这点,现在首选 cloudxns
|
7
Kilerd 2016-07-25 21:12:37 +08:00
这是一个很尴尬的问题。 我也想知道 CloudXNS 到底支不支持
|
8
Andy1999 2016-07-25 21:13:31 +08:00 via iPhone
alais
|
9
Delbert 2016-07-25 21:14:34 +08:00 via Android
zoneedit 裸域和 mx 同时解析,九年没出问题。当然, ze 本身几度易主。。。
|
10
ZE3kr 2016-07-25 21:15:13 +08:00
CloudXNS 的 LINK 更像是一个 "软连接",需要在两个域名设置完全一样的 A 记录时,在一个域名上设置 A 记录,另一个用 LINK 就能解决,这样每次只需要改一个 A 记录即可。前提是这两个域名都在 CloudXNS 上,如果不是,就会用 CNAME 而不是 LINK ,与 CNAME 就没有区别了。
还有就是只有是目标 CNAME 是分区解析时,才需要 EDNS client subnet ,国内应该有不少支持了,不过有些只是针对个别解析服务器才支持 EDNS client subnet 。 @DesignerSkyline Route53 不支持 CNAME Flattening ,他只能是说把一级(或二级)域名解析到一个他自己的服务上(如 CloudFront , S3 , EC2 …),然后给你直接解析 A 记录而不是 CNAME ,第三方应该是不能的。 |
11
ZE3kr 2016-07-25 21:32:29 +08:00 1
我还是讲一些为什么不能这样做的原因吧:
@abelyao 并不是说 MX 和 CNAME 不能同时在后台设置,但是请参见 RFC1912 section 2.4 ,“ A CNAME record is not allowed to coexist with any other data.”,有些 DNS 解析商为了遵守 RFC1912 就禁止你在根域下设置 CNAME ,不过实际上还是可以这样的,所以一些解析商没有禁止你在根域下设置 CNAME 。 这里有写在根域下设置 CNAME 的一些后果: https://blog.cloudflare.com/introducing-cname-flattening-rfc-compliant-cnames-at-a-domains-root/ Technically, the root could be a CNAME but the RFCs state that once a record has a CNAME it can't have any other entries associated with it: that's a problem for a root record like example.com because it will often have an MX record (so email gets delivered), an NS record (to find out which nameserver handles the zone) and an SOA record. 也就是说设置了 CNAME 后就不能设置其它类型的记录,比如 NS 、 MX ……而你的一级域名已经在根域名下分配了 NS 记录(比如 example.com 已经在 .com 下分配到了 NS 记录 `dig @a.gtld-servers.net example.com ns` 可以看出),所以不该再有一个 CNAME 了。 为什么会这样?因为设置了 CNAME 后所有记录都会 “转发” 到设置的那个域名,比如我 www.ze3kr.com CNAME 到了 ze3kr.com 上,现在查 www.ze3kr.com 的 MX 和 NS 记录,全都是 ze3kr.com 上的记录。 同理,假如你把 example.com CNAME 到了 example.net 上,然后 example.com 上的 MX 、 NS 等等记录都会解析到 example.net 上。最坏的情况还不只是 MX 到了 example.net 上别人能在他的服务器上收发给你域名上的邮件,而是, NS 记录也解析到了 example.net 上,而且 example.net 上正好也设置了 NS 记录,于是你的域名本身就被别人解析走了,不只是邮箱。不过被别人解析走之后,你的 example.com 上可能就解析不到 CNAME 记录了,如此循环,你的域名可能无法再解析……不过应该现在的客户端或者是解析缓存服务器都能避免这种错误了。 |
14
Bardon 2016-07-25 22:18:41 +08:00
万网(阿里云)、 dnspod 都支持
|
15
Ellison 2016-07-25 22:41:17 +08:00
我用的 dnspod,没有问题
|
16
mytsing520 2016-07-25 23:12:32 +08:00
@ZE3kr 你这家是哪家?
|
17
geekzu 2016-07-26 00:55:51 +08:00
cloudxns 的 LINK 并不是 CNAME Flattening ,只支持托管在 xns 的域名记录,如果不是托管在自家的记录会自动转化为 cname
|
18
roadna 2016-07-26 01:47:27 +08:00 via Android
|
19
Jimuforest 2016-07-26 08:04:30 +08:00
在这都能遇到...
|
20
MinonHeart 2016-07-26 09:08:50 +08:00 via iPhone
用子域做邮箱好了
|
21
a84945345 2016-07-26 09:31:20 +08:00
这里有 CloudXNS 官方介绍为什么 CNAME 和 MX 不能共存的原因:https://www.cloudxns.net/Support/detail/id/130.html
这个是金粉专家团给出的一个解决 CNAME 和 MX 共存的方案: https://www.cloudxns.net/Support/detail/id/792.html |
22
lslqtz 2016-07-26 10:09:42 +08:00
@MinonHeart 这个是不错的建议~,我觉得大部分 @跳转到 www 也是基于这个原因。。
|
23
CloudXNS 2016-07-26 10:24:59 +08:00
CloudXNS 的 Link 记录历经了几次改造,现在已经支持避免 CNAME 和 MX 的冲突了,并且支持传递分区解析。
只不过,需要注意以下几点: 1.Link 和被 Link 记录必须同时是 CloudXNS 中的域名,如果不是则退化成 CNAME ; 2.不支持双重 link ,除了第一个,后面的都会退化成 CNAME ; 3.@下配置 Link 记录时,被 Link 记录必须不是 link 记录,否则会造成 @无法解析; 4.@下配置 Link 记录时,不能配置非 CloudXNS 中的域名,否则会造成 @无法解析(不会退化成 CNAME ); 另外,由于牛盾在 CloudXNS 系统中原生使用的是 Link 记录(只是不在用户面板显示),所以根据上面的 2 和 3 ,则:@下配置 Link 记录时,被 Link 记录不能是开启牛盾的状态,否则会造成 @无法解析。 感谢大家对 CloudXNS 的关注与支持! |
24
johnjiang85 2016-07-26 10:34:29 +08:00
|
25
johnjiang85 2016-07-26 10:54:52 +08:00
cloud flare 可以进行递归查询根上的 CNAME 记录并返回最终的 A 记录,但是我们认为在 DNS 攻击频繁的网络环境中,该功能会严重影响 DNS 的解析性能,目前在 DNSPod 上是不支持去递归查询的。只有当 CNAME 指向的记录能够在 DNSPod 直接解析出 A 记录时,会直接返回 A 记录,不返回 IP 。
|
26
johnjiang85 2016-07-26 10:56:21 +08:00
@johnjiang85 最后一句是“不返回 IP ” -> “不返回 CNAME ”
|
28
dynos01 2016-07-26 11:48:24 +08:00 via iPad
其实有个办法。。。用一台 vps 跑 crontab ,解析要 cname 到的 ip ,如果发现变动,则利用 dns 服务商的 api 将要设置 cname 的域名的 a 记录变成新的,应该是相当于 cname 了
|
29
hqfzone OP @abelyao
@ZE3kr @Bardon @CloudXNS @a84945345 @johnjiang85 统一回复及感谢。 首先,我说的共存不仅仅是可以设置,还要保证设置之后, MX 记录没有失效的隐患。 那些说没遇到问题的,可能是因为域名访问量少,邮件发送方所用的 DNS 没有缓存你的 CNAME 记录,一旦有 CNAME 缓存, MX 应该是失效的。( TTL 越小,冲突隐患可能越小) 所以目前看来,至少国内这几家,几乎是不行了,因为大部分 CDN 厂商让你 CNAME 到的域名,都和你现在用的 DNS 不是同一家。 那么终极解决方案,可不可以是 CDN 厂商提供?比如 abc.com 的 MX 记录本来是 abc-mx.com ,但是裸域需要用七牛的 CDN ,七牛提供给你的 CNAME 域名是 abc.qiniudns.com ,同时,允许你提交一个 MX 记录,七牛为你在 abc.qiniudns.com 下添加一条 MX 记录为 abc-mx.com ?这样,就不怕 MX 记录被转向了吧? |
30
hqfzone OP @Jimuforest 哈哈,一看头像就认识
|
32
ZE3kr 2016-07-26 17:51:45 +08:00 via iPhone
@hqfzone 你的思路对了, CNAME 会被缓存,所以就算都能设置,也只是从权威服务器上解析的 MX 是对的, DNS 缓存服务器会出问题。不过在 CDN 厂商设置 MX 也不太行,因为 CNAME 还会与 NS 记录冲突,之前也说了,根域名上肯定是要有 NS 记录,不过这不是太大的问题。
最后解决方案有三个: 1. 直接用 CDN 厂商的 DNS (或者是有合作的),比如 CloudFlare 、百度云加速、 Akaimai 、和 CloudFront 配合 Route 53 、 @CloudXNS 配合牛盾,效果最佳。 2. ANANE 方案,解析可能会慢一些,分区解析可能出问题 3. 加 www 前缀,然后主域跳转到 www , www 的上 CDN , CloudXNS 就能在主域设置跳转,缺点就是主域上不了 CDN 。 |
33
hqfzone OP |
34
johnjiang85 2016-07-26 19:43:02 +08:00
@hqfzone 理论上 NS 记录和 CNAME 记录确实是冲突的,但是在实际使用中还没有发现相关的影响解析的 CASE 。
CDN 厂商提供的域名上设置 MX 记录当然是可行的,也是完全符合协议的,但是除非是大客户,不然 CDN 厂商不会支持的。因为每支持一个客户,需要单独分配一套完全独立的 CNAME 解析链,并同步修改调度。 |