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

DNS 权威服务器、非权威服务器、客户端,哪一方负责 DNS CNAME 记录的解析呢?

  •  
  •   jsq2627 · 2014-07-25 16:31:08 +08:00 · 6196 次点击
    这是一个创建于 3774 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如我客户机设置 DNS 服务器为 8.8.8.8
    我有个域名 sb123.com,其中有一条 CNAME 记录 gae.sb123.com 指向 ghs.google.com

    此时我客户机访问 http://gae.sb123.com ,8.8.8.8 上假设还没有缓存的结果,它会递归查询权威服务器。权威服务器是直接返回 CNAME ghs.google.com 呢,还是先把 CNAME 解析出来返回 IP 呢?如果是前者,那 8.8.8.8 是去查询这个 CNAME 再向客户机返回 IP 呢,还是直接把 CNAME 返回给客户机由客户机来查询呢?

    小弟初学 DNS 原理,请多指教。
    17 条回复    2014-07-26 22:10:31 +08:00
    jsq2627
        1
    jsq2627  
    OP
       2014-07-25 16:34:19 +08:00
    根据我的猜测,我觉得是由 8.8.8.8 解析好这个 CNAME,再给客户机返回 IP。是否是这样呢?

    如果我的猜测正确,这么说的话,假如我用 GAE 部署应用,然后绑定了自己的域名,那么就可以躲过 DNS 污染了?
    itsjoke
        2
    itsjoke  
       2014-07-25 16:43:01 +08:00   ❤️ 1
    dig +trace看到应该是:"直接把 CNAME 返回给客户机由客户机来查询"
    wwqgtxx
        3
    wwqgtxx  
       2014-07-25 17:00:09 +08:00 via Android   ❤️ 1
    应该是客户端自行解析cname,你可以在本地搭建一个dns服务器看看输出即可
    bombless
        4
    bombless  
       2014-07-25 17:00:34 +08:00   ❤️ 1
    cname就是cname,如果直接就能返回ip还要cname做什么
    leavic
        5
    leavic  
       2014-07-25 17:14:16 +08:00   ❤️ 1
    trace结果只返回cname指向的域名,应该要DNS自己再查对应的的A记录.

    而且按照DNS的规范,你查什么记录我就给你什么记录,除了ANY类型之外,我不可能在你查CNAME的时候主动告诉你别的记录.
    响应包的Qtype值是2字节,只能是一种类型,不可能在一个包里回复两种类型的记录,也不可能对一个查询回应两个响应包.
    leavic
        6
    leavic  
       2014-07-25 17:16:29 +08:00   ❤️ 1
    @jsq2627 8.8.8.8根本不存在污染问题,Google DNS要被污染,美国人都上不了facebook,你要面对的是DNS劫持.
    wy315700
        7
    wy315700  
       2014-07-25 17:25:20 +08:00
    $ dig cdn.tianwaihome.com +trace

    ; <<>> DiG 9.8.3-P1 <<>> cdn.tianwaihome.com +trace
    ;; global options: +cmd
    . 21387 IN NS d.root-servers.net.
    . 21387 IN NS h.root-servers.net.
    . 21387 IN NS m.root-servers.net.
    . 21387 IN NS k.root-servers.net.
    . 21387 IN NS l.root-servers.net.
    . 21387 IN NS e.root-servers.net.
    . 21387 IN NS c.root-servers.net.
    . 21387 IN NS j.root-servers.net.
    . 21387 IN NS i.root-servers.net.
    . 21387 IN NS b.root-servers.net.
    . 21387 IN NS f.root-servers.net.
    . 21387 IN NS g.root-servers.net.
    . 21387 IN NS a.root-servers.net.
    ;; Received 228 bytes from 8.8.8.8#53(8.8.8.8) in 1498 ms

    com. 172800 IN NS a.gtld-servers.net.
    com. 172800 IN NS b.gtld-servers.net.
    com. 172800 IN NS c.gtld-servers.net.
    com. 172800 IN NS d.gtld-servers.net.
    com. 172800 IN NS e.gtld-servers.net.
    com. 172800 IN NS f.gtld-servers.net.
    com. 172800 IN NS g.gtld-servers.net.
    com. 172800 IN NS h.gtld-servers.net.
    com. 172800 IN NS i.gtld-servers.net.
    com. 172800 IN NS j.gtld-servers.net.
    com. 172800 IN NS k.gtld-servers.net.
    com. 172800 IN NS l.gtld-servers.net.
    com. 172800 IN NS m.gtld-servers.net.
    ;; Received 497 bytes from 2001:7fd::1#53(2001:7fd::1) in 3336 ms

    tianwaihome.com. 172800 IN NS a.dnspod.com.
    tianwaihome.com. 172800 IN NS b.dnspod.com.
    tianwaihome.com. 172800 IN NS c.dnspod.com.
    ;; Received 236 bytes from 192.26.92.30#53(192.26.92.30) in 1942 ms

    cdn.tianwaihome.com. 3600 IN CNAME tianwaihome.b0.aicdn.com.
    tianwaihome.com. 600 IN NS c.dnspod.com.
    tianwaihome.com. 600 IN NS a.dnspod.com.
    tianwaihome.com. 600 IN NS b.dnspod.com.
    ;; Received 153 bytes from 54.228.253.233#53(54.228.253.233) in 315 ms

    用我自己的域名做了下测试
    可以看到 8.8.8.8返回的就是cname 具体cname如何解析,那是下一步解析的
    jsq2627
        8
    jsq2627  
    OP
       2014-07-25 17:31:27 +08:00
    @itsjoke @wwqgtxx @bombless @leavic @wy315700 谢谢各位的解答。我查询到了 RFC 中相关的定义,确认了 CNAME 是会返回给客户端的。
    http://tools.ietf.org/html/rfc1034#section-5.2.2

    从 ping ghs.google.com 的结果也能看出客户端是能够得到 ghs.google.com 的 CNAME ghs.l.google.com 的。

    但是 RFC 里面有一段话
    “In most cases a resolver simply restarts the query at the new name when
    it encounters a CNAME.”
    意思是大多数情况下服务器也会去查询一次?

    @leavic 嗯。你说的我明白,8.8.8.8自身是没问题的。我的意思是在国内向8.8.8.8进行UDP查询是会受到污染的。
    jsq2627
        9
    jsq2627  
    OP
       2014-07-25 17:35:35 +08:00
    @wy315700 这里似乎看不出吧。+trace 做的是递归查询,8.8.8.8 只返回了那些 Root servers。CNAME 记录是 DNSPOD 的权威服务器返回的。
    rcmerci
        10
    rcmerci  
       2014-07-25 17:37:27 +08:00
    还不太清楚DNS相关的东西,求教程
    wy315700
        11
    wy315700  
       2014-07-25 17:39:26 +08:00
    @jsq2627 最后不是有从dnspod查出来cname的吗
    leavic
        12
    leavic  
       2014-07-25 18:50:13 +08:00   ❤️ 1
    @jsq2627 这不叫污染,这是劫持,是两个概念,污染的结果就是DNS服务器本身被污染,劫持是你的通信过程被劫持.
    jsq2627
        13
    jsq2627  
    OP
       2014-07-25 19:25:10 +08:00 via iPhone
    @leavic 谢谢科普。
    julyclyde
        14
    julyclyde  
       2014-07-25 22:41:22 +08:00 via iPad
    @wwqgtxx 自己搭一个那还叫客户端么
    dorentus
        15
    dorentus  
       2014-07-25 22:55:39 +08:00   ❤️ 1
    我试了一下,添加了两个域名:

    1) t0.example.rubyist.today CNAME 指向 t1.example.rubyist.today
    2) t1.example.rubyist.today CNAME 指向非本域的 g.cn

    然后 dig t0.example.rubyist.today +dnssec +trace 结果如下:

    https://gist.github.com/dorentus/da420768387cdc6bbc0b

    可以看到我自己域名的权威服务器把本域能解析的都解析了,最后把非本域的 CNAME 直接丢给了客户端。
    jsq2627
        16
    jsq2627  
    OP
       2014-07-26 00:06:54 +08:00
    @dorentus :-) 谢谢,你的解释让我更加明确了这个结论。
    julyclyde
        17
    julyclyde  
       2014-07-26 22:10:31 +08:00
    不明白这事有啥好讨论的。抓包看看不就知道了?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2329 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 01:49 · PVG 09:49 · LAX 17:49 · JFK 20:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.