AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 482913
Accepted
Andrew B
Andrew B
Asked: 2013-02-27 23:51:16 +0800 CST2013-02-27 23:51:16 +0800 CST 2013-02-27 23:51:16 +0800 CST

dig +trace 总是准确的吗?

  • 772

当 DNS 缓存的准确性受到质疑时,dig +trace这往往是确定面向 Internet 的 DNS 记录的权威答案的推荐方法。这似乎在与 配对时特别有用+additional,它也显示胶水记录。

有时似乎在这一点上存在一些分歧——有人说它依赖于本地解析器来查找中间名称服务器的 IP 地址,但命令输出没有提供任何迹象表明这发生在根目录的初始列表之外名称服务器。+trace如果 的目的是从根服务器开始并向下追踪,那么假设情况并非如此似乎是合乎逻辑的。(至少如果你有正确的根名称服务器列表)

是否dig +trace真的将本地解析器用于根名称服务器之后的任何内容?

domain-name-system
  • 3 3 个回答
  • 21779 Views

3 个回答

  • Voted
  1. Best Answer
    Andrew B
    2013-02-27T23:51:16+08:002013-02-27T23:51:16+08:00

    这显然是一个分阶段的问答,但这往往会使人感到困惑,而且我找不到涵盖该主题的规范问题。

    dig +trace是一个很好的诊断工具,但其设计的一个方面被广泛误解:将要查询的每台服务器的 IP 都是从您的解析器库中获得的。这很容易被忽视,并且通常只会在您的本地缓存对缓存的名称服务器有错误答案时才成为问题。


    详细分析

    这更容易用输出样本分解;我将省略第一个 NS 代表团之后的所有内容。

    ; <<>> DiG 9.7.3 <<>> +trace +additional serverfault.com                                                                      
    
    ;; global options: +cmd
    .                   121459  IN      NS      d.root-servers.net.
    .                   121459  IN      NS      e.root-servers.net.
    .                   121459  IN      NS      f.root-servers.net.
    .                   121459  IN      NS      g.root-servers.net.
    .                   121459  IN      NS      h.root-servers.net.
    .                   121459  IN      NS      i.root-servers.net.
    .                   121459  IN      NS      j.root-servers.net.
    .                   121459  IN      NS      k.root-servers.net.
    .                   121459  IN      NS      l.root-servers.net.
    .                   121459  IN      NS      m.root-servers.net.
    .                   121459  IN      NS      a.root-servers.net.
    .                   121459  IN      NS      b.root-servers.net.
    .                   121459  IN      NS      c.root-servers.net.
    e.root-servers.net. 354907  IN      A       192.203.230.10
    f.root-servers.net. 100300  IN      A       192.5.5.241
    f.root-servers.net. 123073  IN      AAAA    2001:500:2f::f
    g.root-servers.net. 354527  IN      A       192.112.36.4
    h.root-servers.net. 354295  IN      A       128.63.2.53
    h.root-servers.net. 108245  IN      AAAA    2001:500:1::803f:235
    i.root-servers.net. 355208  IN      A       192.36.148.17
    i.root-servers.net. 542090  IN      AAAA    2001:7fe::53
    j.root-servers.net. 354526  IN      A       192.58.128.30
    j.root-servers.net. 488036  IN      AAAA    2001:503:c27::2:30
    k.root-servers.net. 354968  IN      A       193.0.14.129
    k.root-servers.net. 431621  IN      AAAA    2001:7fd::1
    l.root-servers.net. 354295  IN      A       199.7.83.42
    ;; Received 496 bytes from 75.75.75.75#53(75.75.75.75) in 10 ms
    
    com.                        172800  IN      NS      m.gtld-servers.net.
    com.                        172800  IN      NS      k.gtld-servers.net.
    com.                        172800  IN      NS      f.gtld-servers.net.
    com.                        172800  IN      NS      g.gtld-servers.net.
    com.                        172800  IN      NS      b.gtld-servers.net.
    com.                        172800  IN      NS      e.gtld-servers.net.
    com.                        172800  IN      NS      j.gtld-servers.net.
    com.                        172800  IN      NS      c.gtld-servers.net.
    com.                        172800  IN      NS      l.gtld-servers.net.
    com.                        172800  IN      NS      d.gtld-servers.net.
    com.                        172800  IN      NS      i.gtld-servers.net.
    com.                        172800  IN      NS      h.gtld-servers.net.
    com.                        172800  IN      NS      a.gtld-servers.net.
    a.gtld-servers.net. 172800  IN      A       192.5.6.30
    a.gtld-servers.net. 172800  IN      AAAA    2001:503:a83e::2:30
    b.gtld-servers.net. 172800  IN      A       192.33.14.30
    b.gtld-servers.net. 172800  IN      AAAA    2001:503:231d::2:30
    c.gtld-servers.net. 172800  IN      A       192.26.92.30
    d.gtld-servers.net. 172800  IN      A       192.31.80.30
    e.gtld-servers.net. 172800  IN      A       192.12.94.30
    f.gtld-servers.net. 172800  IN      A       192.35.51.30
    g.gtld-servers.net. 172800  IN      A       192.42.93.30
    h.gtld-servers.net. 172800  IN      A       192.54.112.30
    i.gtld-servers.net. 172800  IN      A       192.43.172.30
    j.gtld-servers.net. 172800  IN      A       192.48.79.30
    k.gtld-servers.net. 172800  IN      A       192.52.178.30
    l.gtld-servers.net. 172800  IN      A       192.41.162.30
    ;; Received 505 bytes from 192.203.230.10#53(e.root-servers.net) in 13 ms
    
    • (root nameservers)的初始查询. IN NS命中本地解析器,在本例中为 Comcast。( 75.75.75.75) 这很容易发现。
    • 下一个查询是针对serverfault.com. IN A并运行的e.root-servers.net.,它是从我们刚刚获得的根名称服务器列表中随机选择的。它的 IP 地址为192.203.230.10,并且由于我们+additional启用了它,它似乎来自胶水。
    • 由于它不是 serverfault.com 的权威,因此它被委托给com.TLD 名称服务器。
    • 从这里的输出中不明显的是,它dig没有e.root-servers.net.从胶水中获取 IP 地址。

    在后台,这是真正发生的事情:

    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
    02:03:43.301022 IP 192.0.2.1.59900 > 75.75.75.75.53: 63418 NS? . (17)
    02:03:43.327327 IP 75.75.75.75.53 > 192.0.2.1.59900: 63418 13/0/14 NS k.root-servers.net., NS l.root-servers.net., NS m.root-servers.net., NS a.root-servers.net., NS b.root-servers.net., NS c.root-servers.net., NS d.root-servers.net., NS e.root-servers.net., NS f.root-servers.net., NS g.root-servers.net., NS h.root-servers.net., NS i.root-servers.net., NS j.root-servers.net. (512)
    02:03:43.333047 IP 192.0.2.1.33120 > 75.75.75.75.53: 41110+ A? e.root-servers.net. (36)
    02:03:43.333096 IP 192.0.2.1.33120 > 75.75.75.75.53: 5696+ AAAA? e.root-servers.net. (36)
    02:03:43.344301 IP 75.75.75.75.53 > 192.0.2.1.33120: 41110 1/0/0 A 192.203.230.10 (52)
    02:03:43.344348 IP 75.75.75.75.53 > 192.0.2.1.33120: 5696 0/1/0 (96)
    02:03:43.344723 IP 192.0.2.1.37085 > 192.203.230.10.53: 28583 A? serverfault.com. (33)
    02:03:43.423299 IP 192.203.230.10.53 > 192.0.2.1.37085: 28583- 0/13/14 (493)
    

    +trace欺骗并咨询本地解析器以获取下一跳名称服务器的 IP 地址,而不是咨询胶水。鬼鬼祟祟的!

    这通常是“足够好”并且不会对大多数人造成问题。不幸的是,有一些极端情况。如果出于某种原因您的上游 DNS 缓存为名称服务器提供了错误的答案,则此模型将完全崩溃。

    现实世界的例子:

    • 域过期
    • 胶水被重新指向注册商重定向名称服务器
    • 为 ns1 和 ns2.yourdomain.com 缓存虚假 IP
    • 用恢复的胶水更新域
    • 任何带有虚假域名服务器 IP 的缓存都会继续将人们带到一个网站,该网站说该域名正在出售

    在上述情况下,+trace将建议域所有者自己的名称服务器是问题的根源,并且您只需一个电话就可以错误地告诉客户他们的服务器配置错误。您是否可以(或愿意)做某事是另一回事,但拥有正确的信息很重要。

    dig +trace是一个很棒的工具,但与任何工具一样,您需要知道它能做什么和不能做什么,以及当它证明不够用时如何手动解决问题。


    编辑:

    还应该注意的是,dig +trace不会警告您有关NS指向CNAME别名的记录。这是 ISC BIND(可能还有其他人)不会尝试纠正的 RFC 违规行为。+trace将非常乐意接受A它从本地配置的名称服务器获取的记录,而如果 BIND 要执行完全递归,它将拒绝整个区域并返回 SERVFAIL。

    如果存在胶水,这可能很难排除故障;这将正常工作,直到 NS 记录被刷新,然后突然中断。当记录指向别名时,无胶委托总是会破坏 BIND 的递归。NS

    • 27
  2. Dennis Kaarsemaker
    2014-04-28T02:02:25+08:002014-04-28T02:02:25+08:00

    另一种跟踪 DNS 解析的方法是使用dnsgraph(完全披露:我写了这个),而不使用本地解析器来查找根名称服务器。它有一个命令行工具和一个网络版本,您可以在http://ip.seveas.net/dnsgraph/找到一个实例

    以 serverfault.com 为例,它现在实际上有一个 DNS 问题:

    在此处输入图像描述

    • 11
  3. Binky
    2018-11-01T16:37:36+08:002018-11-01T16:37:36+08:00

    这个线程很晚,但我认为关于为什么 dig +trace 对本地解析器使用递归查询的问题部分没有得到直接解释,这个解释与 dig +trace 结果的准确性有关。

    在对根区域的 NS 记录进行初始递归查询后,dig 可能会在以下条件下向本地解析器发出后续查询:

    1. 由于下一次迭代查询的响应大小超过 512 字节,引用响应被截断

    2. dig 从引用响应的 AUTHORITY 部分中选择一个 NS 记录,其相应的 A 记录(胶水)在 ADDITIONAL 部分中丢失

    因为 dig 只有来自 NS 记录的域名,所以 dig 必须通过查询本地 DNS 服务器将名称解析为 IP 地址。这是根本原因(双关语,抱歉)。

    AndrewB 有一个与我刚才描述的不完全一致的示例,因为选择的根区域 NS 记录:

    . 121459 IN NS e.root-servers.net.

    有对应的A记录:

    e.root-servers.net. 354907 IN A 192.203.230.10

    但是请注意,e-root 没有相应的 AAAA 记录,其他一些根服务器也没有 AAAA 记录。

    另外,请注意响应的大小:

    ;; Received 496 bytes from 75.75.75.75#53(75.75.75.75) in 10 ms

    496 字节是已被截断的响应的常见大小(即下一个粘合记录将大于 16 字节,从而使响应超过 512 字节)。换句话说,在查询 root 的 NS 记录时,完整的 AUTHORITY 和完整的 ADDITIONAL(A 和 AAAA 记录)将超过 512 字节,因此任何未通过 EDNS0 选项指定更大查询大小的基于 UDP 的查询将得到一个在 ADDITIONAL 部分某处被截断的响应,如上面的跟踪所示(只有 f、h、i、j 和 k 有 A 和 AAAA 粘合记录)。

    缺少 e.root-servers.net 的 AAAA 记录以及对“NS”的响应大小。查询强烈建议下一个递归查询是出于我声称的原因而完成的。也许客户端 O/S 支持 IPv6,并且更喜欢 AAAA 记录——或者其他一些原因。

    但无论如何,在读完这个帖子后,我研究了 dig +trace 在对 root 的初始查询之后执行递归查询的现象。根据我的经验,选择没有相应胶合 A/AAAA 记录的 NS 记录与挖掘然后将该记录的递归查询发送到本地 DNS 之间的对应关系是 100%。而反之亦然——我还没有看到从referral中选出的NS记录有对应的胶水记录时的递归查询。

    • 0

相关问题

  • Solaris DNS

  • resolv.conf 在经过一段时间后被更改

  • 为什么有些网站的网址中没有“www”就无法显示?[关闭]

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve