V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hqfzone
V2EX  ›  DNS

CNAME 和 MX 共存的解决方案?

  •  
  •   hqfzone · 2016-07-25 20:46:59 +08:00 · 20085 次点击
    这是一个创建于 3045 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家都知道裸域如果设置了 CNAME , MX 就会失效。 那么,能不能解决呢?

    前提是用裸域作为主域名

    34 条回复    2016-07-26 19:43:02 +08:00
    hqfzone
        1
    hqfzone  
    OP
       2016-07-25 20:55:49 +08:00
    貌似 cloudxns 提供了一种方法,它说:如果 www.a.com LINK 至 www.b.comwww.b.com 的 A 记录为 3.3.3.3,用户解析 www.a.com 时,结果会显示 www.a.com 的 A 记录为 3.3.3.3(前提是 www.a.comwww.b.com 都在 CloudXNS 系统中解析)
    那么,如果 www.b.com 是 cname 到一个不在 cloudxns 解析的域名呢?可以吗?

    有没有 cloudxns 的人员,回答一下?​​
    ivmm
        2
    ivmm  
       2016-07-25 20:56:20 +08:00
    DesignerSkyline
        3
    DesignerSkyline  
       2016-07-25 20:58:03 +08:00 via iPad
    CloudXNS 不行
    CNAME Flattening 支持的有 rage4 cloudflare route53 dnsimple
    ZE3kr
        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 。
    hqfzone
        5
    hqfzone  
    OP
       2016-07-25 21:05:54 +08:00
    @DesignerSkyline
    @ZE3kr 看上去, cloudxns 的 LINK 好像就是 CNAME Flattening 啊。那么主流的 CDN 厂商,有哪些支持 EDNS client subnet 呢?比如阿里、腾讯之类的?
    abelyao
        6
    abelyao  
       2016-07-25 21:08:59 +08:00
    dnspod 支持裸域 cname 同时 mx 解析,除了这点,现在首选 cloudxns
    Kilerd
        7
    Kilerd  
       2016-07-25 21:12:37 +08:00
    这是一个很尴尬的问题。 我也想知道 CloudXNS 到底支不支持
    Andy1999
        8
    Andy1999  
       2016-07-25 21:13:31 +08:00 via iPhone
    alais
    Delbert
        9
    Delbert  
       2016-07-25 21:14:34 +08:00 via Android
    zoneedit 裸域和 mx 同时解析,九年没出问题。当然, ze 本身几度易主。。。
    ZE3kr
        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 ,第三方应该是不能的。
    ZE3kr
        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 记录了,如此循环,你的域名可能无法再解析……不过应该现在的客户端或者是解析缓存服务器都能避免这种错误了。
    lslqtz
        12
    lslqtz  
       2016-07-25 21:41:02 +08:00
    @ZE3kr 意思就是直接在另一个域名上做 MX 记录?
    abelyao
        13
    abelyao  
       2016-07-25 21:44:22 +08:00
    @ZE3kr 道理都懂,我只是在回答楼主问的如何解决。
    Bardon
        14
    Bardon  
       2016-07-25 22:18:41 +08:00
    万网(阿里云)、 dnspod 都支持
    Ellison
        15
    Ellison  
       2016-07-25 22:41:17 +08:00
    我用的 dnspod,没有问题
    mytsing520
        16
    mytsing520  
       2016-07-25 23:12:32 +08:00
    @ZE3kr 你这家是哪家?
    geekzu
        17
    geekzu  
       2016-07-26 00:55:51 +08:00
    cloudxns 的 LINK 并不是 CNAME Flattening ,只支持托管在 xns 的域名记录,如果不是托管在自家的记录会自动转化为 cname
    roadna
        18
    roadna  
       2016-07-26 01:47:27 +08:00 via Android
    @ZE3kr 感谢!
    最近刚好有这样的需求, xxx.com 要 CNAME 到 github pages, 又想绑定 QQ 域名邮箱
    Jimuforest
        19
    Jimuforest  
       2016-07-26 08:04:30 +08:00
    在这都能遇到...
    MinonHeart
        20
    MinonHeart  
       2016-07-26 09:08:50 +08:00 via iPhone
    用子域做邮箱好了
    a84945345
        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
    lslqtz
        22
    lslqtz  
       2016-07-26 10:09:42 +08:00
    @MinonHeart 这个是不错的建议~,我觉得大部分 @跳转到 www 也是基于这个原因。。
    CloudXNS
        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 的关注与支持!
    johnjiang85
        24
    johnjiang85  
       2016-07-26 10:34:29 +08:00
    johnjiang85
        25
    johnjiang85  
       2016-07-26 10:54:52 +08:00
    cloud flare 可以进行递归查询根上的 CNAME 记录并返回最终的 A 记录,但是我们认为在 DNS 攻击频繁的网络环境中,该功能会严重影响 DNS 的解析性能,目前在 DNSPod 上是不支持去递归查询的。只有当 CNAME 指向的记录能够在 DNSPod 直接解析出 A 记录时,会直接返回 A 记录,不返回 IP 。
    johnjiang85
        26
    johnjiang85  
       2016-07-26 10:56:21 +08:00
    @johnjiang85 最后一句是“不返回 IP ” -> “不返回 CNAME ”
    lslqtz
        27
    lslqtz  
       2016-07-26 11:38:34 +08:00 via iPhone
    @abelyao 那就把 cloudxns 上需要的部分记录 ns 过去?
    dynos01
        28
    dynos01  
       2016-07-26 11:48:24 +08:00 via iPad
    其实有个办法。。。用一台 vps 跑 crontab ,解析要 cname 到的 ip ,如果发现变动,则利用 dns 服务商的 api 将要设置 cname 的域名的 a 记录变成新的,应该是相当于 cname 了
    hqfzone
        29
    hqfzone  
    OP
       2016-07-26 17:24:25 +08:00
    @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 记录被转向了吧?
    hqfzone
        30
    hqfzone  
    OP
       2016-07-26 17:25:11 +08:00
    @Jimuforest 哈哈,一看头像就认识
    CloudXNS
        31
    CloudXNS  
       2016-07-26 17:35:15 +08:00
    @hqfzone
    所以要加速的话,在 CloudXNS 中可以上 A 记录,开牛盾。。
    因为 A 和 MX 并不冲突。。
    ZE3kr
        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 。
    hqfzone
        33
    hqfzone  
    OP
       2016-07-26 18:33:02 +08:00
    @ZE3kr NS 的问题应该不会出现吧,至少还没听说过。

    看上去第一个方案最好,只是选择自由度就小了很多。加 www 前缀,还是要看域名及个人喜好了。
    johnjiang85
        34
    johnjiang85  
       2016-07-26 19:43:02 +08:00
    @hqfzone 理论上 NS 记录和 CNAME 记录确实是冲突的,但是在实际使用中还没有发现相关的影响解析的 CASE 。
    CDN 厂商提供的域名上设置 MX 记录当然是可行的,也是完全符合协议的,但是除非是大客户,不然 CDN 厂商不会支持的。因为每支持一个客户,需要单独分配一套完全独立的 CNAME 解析链,并同步修改调度。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2633 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 15:38 · PVG 23:38 · LAX 07:38 · JFK 10:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.