当前位置: 首页 > 知识库问答 >
问题:

手动执行递归DNS查询

贾骏
2023-03-14

在我正在进行的理解DNS的实验中,我试图理解名称服务器如何进行递归查询。我得到了基本的想法-你从一个顶级dns服务器开始,然后它向你发送一个要联系的权威名称服务器列表,然后你联系这些服务器,等等,直到你得到一个权威的响应。

听起来很简单。

但当我在实践中尝试时,我在第一步后就卡住了。我只是使用命令行工具手动执行此操作-(我确保关闭递归)

好的,那么第1步:从根名称服务器开始。我从维基百科的根名称服务器列表中随机选择了198.41.0.4(威瑞信)。

我向它发送了一个请求,请求解析“google.com”。

它向我发回以下信息:

+---------------------------------------------------------------------------+
| 47547 | QR: 1 | OP: 00 | AA: 0 | TC: 0 | RD: 1 | RA: 0 | Z: 0 | RCODE: 00 |
+---------------------------------------------------------------------------+
| QDCOUNT:     1,   ANCOUNT:     0,   NSCOUNT:    13,   ARCOUNT:    15      |
+---------------------------------------------------------------------------+

ANSWERS : 0

AUTHORITIES:
NS: m.gtld-servers.net
NS: l.gtld-servers.net
NS: k.gtld-servers.net
NS: j.gtld-servers.net
NS: i.gtld-servers.net
NS: h.gtld-servers.net
NS: g.gtld-servers.net
NS: f.gtld-servers.net
NS: e.gtld-servers.net
NS: d.gtld-servers.net
NS: c.gtld-servers.net
NS: b.gtld-servers.net
NS: a.gtld-servers.net

ADDITIONAL:
A: 192.55.83.30
A: 192.41.162.30
A: 192.52.178.30
A: 192.48.79.30
A: 192.43.172.30
A: 192.54.112.30
A: 192.42.93.30
A: 192.35.51.30
A: 192.12.94.30
A: 192.31.80.30
A: 192.26.92.30
A: 192.33.14.30
AAAA: 2001:0503:231d:0000:0000:0000:0002:0030
A: 192.5.6.30
AAAA: 2001:0503:a83e:0000:0000:0000:0002:0030

好的,所以我不确定所有这些额外记录的意义是什么——它们似乎都是本地局域网地址,所以我不知道它们对我有什么用处。但是无论如何,看看authority部分返回的结果,我看到了另一个名称服务器列表。好的,我想下一步是我需要选择一个返回的名称服务器,并获取它的IP。所以我发出一个请求来解析a.gtld-servers。net和。。。

...它只返回完全相同的名称服务器列表。

所以我不知道该怎么办。如何最终访问“google.com”的权威名称服务器?

编辑:

好的,看起来那些192地址不是我错误地假设的局域网地址,而是其他名称服务器。我想我可以联系那些命名服务器来接近权威。但是,我怎么知道如何使用这些名称服务器?我认为ARCOUNT部分只是为了附加信息...为什么所有这些名称服务器都放在附加部分,而不是作为答案或权威?这只是一些惯例,引用到其他名称服务器去在附加部分?


共有2个答案

陈德泽
2023-03-14

您对威瑞信服务器的查询有问题。试试这个:

  1. 挖@

注意:如果google。comnameservers与google位于同一区域。com,#1应该返回粘合记录,这意味着它还将解析名称服务器的IP地址。

钱志
2023-03-14

您可以使用挖掘跟踪命令:它将准确地显示由典型递归命名服务器执行的每个查询。

例如,如果您尝试www.google。com(如果不指定类型,dig默认使用A,我使用Nodenssec删除了DNSSEC相关信息以简化输出):

$ dig +trace www.google.com +nodnssec

; <<>> DiG 9.12.0 <<>> +trace www.google.com +nodnssec
;; global options: +cmd
.           307678 IN NS f.root-servers.net.
.           307678 IN NS a.root-servers.net.
.           307678 IN NS m.root-servers.net.
.           307678 IN NS e.root-servers.net.
.           307678 IN NS i.root-servers.net.
.           307678 IN NS l.root-servers.net.
.           307678 IN NS c.root-servers.net.
.           307678 IN NS g.root-servers.net.
.           307678 IN NS b.root-servers.net.
.           307678 IN NS k.root-servers.net.
.           307678 IN NS h.root-servers.net.
.           307678 IN NS d.root-servers.net.
.           307678 IN NS j.root-servers.net.
;; Received 447 bytes from 192.168.10.229#53(192.168.10.229) in 5 ms

com.            172800 IN NS j.gtld-servers.net.
com.            172800 IN NS m.gtld-servers.net.
com.            172800 IN NS g.gtld-servers.net.
com.            172800 IN NS i.gtld-servers.net.
com.            172800 IN NS k.gtld-servers.net.
com.            172800 IN NS b.gtld-servers.net.
com.            172800 IN NS h.gtld-servers.net.
com.            172800 IN NS c.gtld-servers.net.
com.            172800 IN NS a.gtld-servers.net.
com.            172800 IN NS f.gtld-servers.net.
com.            172800 IN NS l.gtld-servers.net.
com.            172800 IN NS e.gtld-servers.net.
com.            172800 IN NS d.gtld-servers.net.
;; Received 839 bytes from 192.36.148.17#53(i.root-servers.net) in 88 ms

google.com.     172800 IN NS ns2.google.com.
google.com.     172800 IN NS ns1.google.com.
google.com.     172800 IN NS ns3.google.com.
google.com.     172800 IN NS ns4.google.com.
;; Received 291 bytes from 192.5.6.30#53(a.gtld-servers.net) in 145 ms

www.google.com.     300 IN A 172.217.7.196
;; Received 48 bytes from 216.239.34.10#53(ns2.google.com) in 83 ms

每个段落都是一个查询,显示回复和回复者(我们查询的对象)。

让我们回到第一个查询,重做您对198.41.0.4(又称a.root-servers.net)所做的操作:

$ dig A www.google.com @198.41.0.4 +nodnssec

; <<>> DiG 9.12.0 <<>> A www.google.com @198.41.0.4 +nodnssec
;; global options: +cmd
;; Sending:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44332
;; flags: rd ad; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: b56cbe6c8ffd3856
;; QUESTION SECTION:
;www.google.com.        IN A

;; QUERY SIZE: 55

;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44332
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 13, ADDITIONAL: 27
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1472
;; QUESTION SECTION:
;www.google.com.        IN A

;; AUTHORITY SECTION:
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.

;; ADDITIONAL SECTION:
a.gtld-servers.net. 172800 IN A 192.5.6.30
b.gtld-servers.net. 172800 IN A 192.33.14.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
m.gtld-servers.net. 172800 IN A 192.55.83.30
a.gtld-servers.net. 172800 IN AAAA 2001:503:a83e::2:30
b.gtld-servers.net. 172800 IN AAAA 2001:503:231d::2:30
c.gtld-servers.net. 172800 IN AAAA 2001:503:83eb::30
d.gtld-servers.net. 172800 IN AAAA 2001:500:856e::30
e.gtld-servers.net. 172800 IN AAAA 2001:502:1ca1::30
f.gtld-servers.net. 172800 IN AAAA 2001:503:d414::30
g.gtld-servers.net. 172800 IN AAAA 2001:503:eea3::30
h.gtld-servers.net. 172800 IN AAAA 2001:502:8cc::30
i.gtld-servers.net. 172800 IN AAAA 2001:503:39c1::30
j.gtld-servers.net. 172800 IN AAAA 2001:502:7094::30
k.gtld-servers.net. 172800 IN AAAA 2001:503:d2d::30
l.gtld-servers.net. 172800 IN AAAA 2001:500:d937::30
m.gtld-servers.net. 172800 IN AAAA 2001:501:b1f9::30

;; Query time: 134 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Wed Aug 15 09:39:43 EST 2018
;; MSG SIZE  rcvd: 839

那么这里发生了什么:

  1. 您在回复中没有aa标志,这表明名称服务器回复对此查询不具有权威性(如果您要求它,它将是权威性的)。NS例如)
  2. 它在AUTHORITY SECTION中告诉你谁是下一步的权威,即com.;这意味着给你一组名称服务器(NS记录)
  3. 为了帮助您在附加部分中更快地执行,它为您提供了上述名称服务器的IP地址,否则您将首先需要将它们的名称解析为IP才能与它们联系。

RFC1034中定义了这些部分:

这四个部分是:

问题包含查询名称和其他查询参数。

答案携带直接回答查询的RRs。

权威携带描述其他权威服务器的RRs。可以选择在回答部分携带权威数据的SOA RR。

附加的RRs可能有助于在其他章节中使用RRs。

因此,数据不能放在“回答”部分,因为它不直接回答呈现的查询,也不能放在“权威”部分,因为您查询的命名服务器对gtld-servers.net不具有权威

这也解释了为什么挖掘e.gtld-servers。净@198.41.0.4 nodnssec将返回基本相同的答案,但这主要是因为。com和。net由同一个注册表(VeriSign)处理,它们共享相同的权威名称服务器(VeriSign也处理两个根名称服务器-aj,但这是无关的)

所以,是的,下一步是连接到为gtld服务器提供的任何IP。netnameserver重新执行查询,并确定它是否对www.google具有权威性。com,因为它不是,所以它将在“授权”部分提供下一步。

像这样:

$ dig A www.google.com @a.gtld-servers.net. +norecurse +nodnssec

; <<>> DiG 9.12.0 <<>> A www.google.com @a.gtld-servers.net. +norecurse +nodnssec
;; global options: +cmd
;; Sending:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26904
;; flags: ad; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 22d54e7533355129
;; QUESTION SECTION:
;www.google.com.        IN A

;; QUERY SIZE: 55

;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26904
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 9

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.google.com.        IN A

;; AUTHORITY SECTION:
google.com.     172800 IN NS ns2.google.com.
google.com.     172800 IN NS ns1.google.com.
google.com.     172800 IN NS ns3.google.com.
google.com.     172800 IN NS ns4.google.com.

;; ADDITIONAL SECTION:
ns2.google.com.     172800 IN AAAA 2001:4860:4802:34::a
ns2.google.com.     172800 IN A 216.239.34.10
ns1.google.com.     172800 IN AAAA 2001:4860:4802:32::a
ns1.google.com.     172800 IN A 216.239.32.10
ns3.google.com.     172800 IN AAAA 2001:4860:4802:36::a
ns3.google.com.     172800 IN A 216.239.36.10
ns4.google.com.     172800 IN AAAA 2001:4860:4802:38::a
ns4.google.com.     172800 IN A 216.239.38.10

;; Query time: 142 msec
;; SERVER: 192.5.6.30#53(192.5.6.30)
;; WHEN: Wed Aug 15 09:54:27 EST 2018
;; MSG SIZE  rcvd: 291

等等

另外,你也搞错了:

它们似乎都是本地局域网地址,所以我不知道它们对我有什么用。

专用地址空间由RFC 1918描述,其中列出:

10.0.0.0-10.255.255.255(10/8前缀)

172.16.0.0-172.31.255.255(172.16/12前缀)

192.168.0.0-192.168.255.255(192.168/16前缀)

谢天谢地,这些区块中没有一个知识产权。

 类似资料:
  • 问题内容: 我得到一张下表: 如果用户搜索“ 1”,则程序将查看具有“ 1”的,然后它将在“ 5”中得到一个值,然后程序将继续在其中搜索“ 5”,并且将得到“ 3”在中,依此类推。因此它将打印出: 如果用户搜索“ 6”,它将打印出: 如何建立一个查询来做到这一点? 问题答案: 编辑 @leftclickben提到的解决方案也是有效的。我们也可以对它使用存储过程。 我们使用临时表存储输出结果,并且由

  • 我正在调试我的web应用程序,我有一个POST请求。(使用ajax,使用xhrfields:{withcredentials:true})。dataType是'application/json',我的服务器是tomcat,我手动将我的“Access-Control-Allog-Origin”标头设置为“http://localhost:8080”。 跨源请求被阻止:同一源策略不允许读取http:/

  • 问题内容: 我有一组按层次结构组织的数据,应该可以增长到任意大小。我需要检索整个树,但是我无法弄清楚如何仅使用SQL来完成。我当前的解决方案是创建一个临时表,并使用递归函数依次查询树的分支,然后将结果存储在临时表中,随后我再次对其进行查询以产生所需的结果。 我的问题是,从本质上讲,我正在执行的联接正确吗?构造一个中间表,然后查询结果。似乎应该有一种使用联接的方法,但是MySQL文档仅涵盖检索有限深

  • 问题内容: JPA 2是否具有运行递归查询的任何机制? 这是我的情况:我有一个实体E,其中包含一个整数字段x。它还可能具有通过@OneToMany映射的E类型的子代。我想做的是通过主键找到一个E,并获取其x的值以及所有后代的x值。有没有办法在单个查询中执行此操作? 我正在使用Hibernate 3.5.3,但我不希望在Hibernate API上没有任何明确的依赖关系。 编辑:根据这一项目,Hib

  • 我是一名学生,开始学习线性回归。我们得到了一个手动回归公式:(X.T*X)**-1*X.T*y还有一个简单数组的例子: 现在我想用Boston数据集对多个变量做同样的处理。我需要创建一个类,该类的功能与LinearRegression()相同。一定有。fit()方法和。预测方法。当数组有超过1列时,如何操作没有任何解释。。。所以我很困惑。 以下是我最初所做的: 但它只返回1个系数,我不确定它是否正

  • 在我的progress函数中,它将到达递归的底部,但是我期望返回的值没有改变。 这应该返回true,它符合条件(记录文本),但随后继续移动,并且始终返回false。