找出哪个 DNS 服务器回答了你的查询

找出哪个 DNS 服务器回答了你的查询

我有一个看似简单的问题,但经过一番搜索却找不到该问题的答案:
我知道,如果我想查找某个域名的 IP 地址,我会输入,例如:

nslookup google.de

并得到

Server:     127.0.1.1
Address:    127.0.1.1#53

Non-authoritative answer:
Name:   google.de
Address: 172.217.18.3

但是,我不知道我从哪里得到这个答案。据我所知,我的解析器首先尝试询问我的本地 DNS 服务器(位于 Ubuntu dnsmasq 上),如果该服务器没有答案,它会询问下一个服务器,依此类推。但我想知道最终哪个服务器有答案。这可能吗?
我也试过

dig +trace www.google.com

它提供了已发布服务器的所有信息,但执行完全迭代查找。我基本上喜欢这样的答案,但使用常规查找。

答案1

我想知道到底哪个服务器有答案。这可能吗?

这是无法实现的。你不会发现具体的被咨询的权威服务器在 DNS 回复的有效负载中的任何地方都有名称。存在 CHAOS 查询,其目的是识别特定的递归服务器回复您,但没有等价的东西来提取递归者从中获取数据的确切权威服务器的名称。

Phillip 链接的 StackOverflow 问答提供了有关如何识别NS递归 DNS 响应的授权部分中存在的记录列表的说明。不过,这是服务器的完整列表,而不是具体的服务器。即使这些信息足以满足您的使用,DNS 标准仍将这些信息视为可选信息,并且为了减少内部来源的反射攻击的有效载荷大小,在递归响应中看到这些信息的情况越来越少。

如果您知道区域的名称,则可以NS通过显式请求来请求完整的记录列表。这需要知道您位于区域的顶点;对example.comNS 记录的请求将返回所需的响应,但www.example.com除非委托给另一组服务器,否则不会返回www。在这种情况下,您别无选择,只能反复向后工作,直到发现区域的顶点。

长话短说,没有可靠的短路径(即单一查询)来获取有关全部来自递归服务器的上游权限,并且了解响应查询的特定权威服务器的方法,而无需控制权威服务器并在每个服务器上创建唯一数据。(如果这样做,请为此目的创建一个唯一的区域,以便它不会干扰您更敏感的生产区域传输)

答案2

看到这个https://stackoverflow.com/questions/38021/how-do-i-find-the-authoritative-name-server-for-a-domain-name

简而言之,nslookup 将查询类型设置为 SOA

单线:

 nslookup -querytype=soa google.de
 nslookup -d2 -type=ANY google.de
 nslookup -d2 -type=ANY google.de 8.8.8.8

寻找: 主名称服务器

command line> nslookup
> set querytype=soa
> google.de
Server:  google-public-dns-a.google.com
Address:  8.8.8.8

Non-authoritative answer:
google.de
    primary name server = ns2.google.com 
    responsible mail addr = dns-admin.google.com
    serial  = 160093636
    refresh = 900 (15 mins)
    retry   = 900 (15 mins)
    expire  = 1800 (30 mins)
    default TTL = 60 (1 min)

>

编辑:

有人告诉我,SOA 记录可能不是最佳方法。甚至可能设置不正确。因此,NS 记录可能是更好的选择:

nameserver域名的服务器在哪里...

  nslookup  -type=NS google.de

或者用大量的调试信息来找到nameserver

  nslookup -d2 -type=NS google.de

答案3

当您使用dig默认答复时,您将拥有应答名称服务器的 IP,该 IP 应该是系统中配置的递归名称服务器(/etc/resolv.conf通常)。

答案4

因此,为了更好地理解 +trace 命令,您可以使用 dnstracer。

安装它并运行 dnstracer 命令,如下面的示例所示,-s 表示从根服务器请求完整跟踪,-4 表示仅查询 ipv4(如果你没有启用 ipv6,则很有用),-o 表示也输出查询结果

 dnstracer -s . -4 -o b.org
Tracing to b.org[a] via A.ROOT-SERVERS.NET, maximum of 3 retries
A.ROOT-SERVERS.NET [.] (198.41.0.4) 
 |\___ b2.org.afilias-nst.org [org] (2001:0500:0048:0000:0000:0000:0000:0001) Not queried
 |\___ b2.org.afilias-nst.org [org] (199.249.120.1) 
 |     |\___ ns2.dan.com [b.org] (173.201.66.67) Got authoritative answer 
 |     |\___ ns2.dan.com [b.org] (2603:0005:2225:0000:0000:0000:0000:0043) Not queried
 |      \___ ns1.dan.com [b.org] (97.74.98.67) Got authoritative answer 
 |      \___ ns1.dan.com [b.org] (2603:0005:2125:0000:0000:0000:0000:0043) Not queried
 |\___ b0.org.afilias-nst.org [org] (2001:0500:000c:0000:0000:0000:0000:0001) Not queried
 |\___ b0.org.afilias-nst.org [org] (199.19.54.1) 
 |     |\___ ns1.dan.com [b.org] (97.74.98.67) (cached)
 |     |\___ ns1.dan.com [b.org] (2603:0005:2125:0000:0000:0000:0000:0043) Not queried
 |      \___ ns2.dan.com [b.org] (173.201.66.67) (cached)
 |      \___ ns2.dan.com [b.org] (2603:0005:2225:0000:0000:0000:0000:0043) Not queried
 |\___ a2.org.afilias-nst.info [org] (2001:0500:0040:0000:0000:0000:0000:0001) Not queried
 |\___ a2.org.afilias-nst.info [org] (199.249.112.1) 
 |     |\___ ns2.dan.com [b.org] (173.201.66.67) (cached)
 |     |\___ ns2.dan.com [b.org] (2603:0005:2225:0000:0000:0000:0000:0043) Not queried
 |      \___ ns1.dan.com [b.org] (97.74.98.67) (cached)
 |      \___ ns1.dan.com [b.org] (2603:0005:2125:0000:0000:0000:0000:0043) Not queried
 |\___ c0.org.afilias-nst.info [org] (2001:0500:000b:0000:0000:0000:0000:0001) Not queried
 |\___ c0.org.afilias-nst.info [org] (199.19.53.1) 
 |     |\___ ns1.dan.com [b.org] (97.74.98.67) (cached)
 |     |\___ ns1.dan.com [b.org] (2603:0005:2125:0000:0000:0000:0000:0043) Not queried
 |      \___ ns2.dan.com [b.org] (173.201.66.67) (cached)
 |      \___ ns2.dan.com [b.org] (2603:0005:2225:0000:0000:0000:0000:0043) Not queried
 |\___ a0.org.afilias-nst.info [org] (2001:0500:000e:0000:0000:0000:0000:0001) Not queried
 |\___ a0.org.afilias-nst.info [org] (199.19.56.1) 
 |     |\___ ns2.dan.com [b.org] (173.201.66.67) (cached)
 |     |\___ ns2.dan.com [b.org] (2603:0005:2225:0000:0000:0000:0000:0043) Not queried
 |      \___ ns1.dan.com [b.org] (97.74.98.67) (cached)
 |      \___ ns1.dan.com [b.org] (2603:0005:2125:0000:0000:0000:0000:0043) Not queried
 |\___ d0.org.afilias-nst.org [org] (2001:0500:000f:0000:0000:0000:0000:0001) Not queried
  \___ d0.org.afilias-nst.org [org] (199.19.57.1) 
       |\___ ns1.dan.com [b.org] (97.74.98.67) (cached)
       |\___ ns1.dan.com [b.org] (2603:0005:2125:0000:0000:0000:0000:0043) Not queried
        \___ ns2.dan.com [b.org] (173.201.66.67) (cached)
        \___ ns2.dan.com [b.org] (2603:0005:2225:0000:0000:0000:0000:0043) Not queried

ns1.dan.com (97.74.98.67)               b.org -> 3.64.163.50
ns2.dan.com (173.201.66.67)             b.org -> 3.64.163.50

这将显示 . 由根 DNS 服务器负责,然后 org 由 *.afilias-nst.org DNS 服务器负责,最后 b 由 dan.com 服务器负责。它将检测路径中损坏的 DNS 服务器,甚至一些错误配置

正常查询将选择上述任意路径,不会查询所有服务器,而只查询每个级别的一个服务器,绕过可能已在缓存中的服务器。

如果你想找到哪个 DNS 服务器正在回复你的查询,那就比较难了,而且很大程度上取决于你的设置……但至少在大型设置中,这有时是可行的

在大多数地方可能不起作用,但是 DNS EDNS 协议允许远程服务器发送 NSID,以帮助识别原始服务器。

在 dig 中使用 +edns +nsid ,它可能会返回带有以下 id 的 NSID 行:

 dig +edns +nsid google.com  @8.8.8.8

; <<>> DiG 9.10.3-P4-Debian <<>> +edns +nsid google.com @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11816
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
; NSID: 67 70 64 6e 73 2d 6c 68 72 ("gpdns-lhr")
;; QUESTION SECTION:
;google.com.                    IN      A

;; ANSWER SECTION:
google.com.             300     IN      A       74.125.193.102
google.com.             300     IN      A       74.125.193.138
google.com.             300     IN      A       74.125.193.139
google.com.             300     IN      A       74.125.193.113
google.com.             300     IN      A       74.125.193.100
google.com.             300     IN      A       74.125.193.101

;; Query time: 20 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Thu Oct 05 23:17:15 UTC 2023
;; MSG SIZE  rcvd: 148

如果 NSID 行是空的,则表示远程服务器未配置为发送该信息。

在 bind 中,你可以通过设置 server-id 选项来配置你的服务器返回 NSID:https://bind9.readthedocs.io/en/latest/reference.html#namedconf-statement-server-id

相关内容