为什么 nslookup 会返回响应,然后超时?

为什么 nslookup 会返回响应,然后超时?

这是我的 nslookup 正在做的事情:

ubuntu@ca:~$ time nslookup focal-250
Server:     127.0.0.53
Address:    127.0.0.53#53

Non-authoritative answer:
Name:   focal-250.test
Address: 128.8.8.187
;; connection timed out; no servers could be reached



real    0m15.024s
user    0m0.005s
sys     0m0.018s

前六行(即正确的响应)立即打印出来,然后等待 15 秒“超时”。类似的东西ping做同样的事情:停顿 15 秒,然后开始工作。

这是一个运行 systemd-resolved 的 Ubuntu 20.04 LTS 系统。唯一奇怪的是它dnsmasq在其接口之一上侦听名称服务,并且该接口的地址被配置为其自己的名称服务器:

ubuntu@ca:~$ resolvectl 
Global
       LLMNR setting: no                  
MulticastDNS setting: no                  
  DNSOverTLS setting: no                  
      DNSSEC setting: no                  
    DNSSEC supported: no                  
          DNSSEC NTA: 10.in-addr.arpa     
                      16.172.in-addr.arpa 
                      168.192.in-addr.arpa
                      17.172.in-addr.arpa 
                      18.172.in-addr.arpa 
                      19.172.in-addr.arpa 
                      20.172.in-addr.arpa 
                      21.172.in-addr.arpa 
                      22.172.in-addr.arpa 
                      23.172.in-addr.arpa 
                      24.172.in-addr.arpa 
                      25.172.in-addr.arpa 
                      26.172.in-addr.arpa 
                      27.172.in-addr.arpa 
                      28.172.in-addr.arpa 
                      29.172.in-addr.arpa 
                      30.172.in-addr.arpa 
                      31.172.in-addr.arpa 
                      corp                
                      d.f.ip6.arpa        
                      home                
                      internal            
                      intranet            
                      lan                 
                      local               
                      private             
                      test                

Link 3 (ens5)
      Current Scopes: DNS        
DefaultRoute setting: yes        
       LLMNR setting: yes        
MulticastDNS setting: no         
  DNSOverTLS setting: no         
      DNSSEC setting: no         
    DNSSEC supported: no         
  Current DNS Server: 128.8.8.254
         DNS Servers: 128.8.8.254
          DNS Domain: test       

Link 2 (ens4)
      Current Scopes: DNS         
DefaultRoute setting: yes         
       LLMNR setting: yes         
MulticastDNS setting: no          
  DNSOverTLS setting: no          
      DNSSEC setting: no          
    DNSSEC supported: no          
  Current DNS Server: 192.168.1.1 
         DNS Servers: 192.168.1.1 
          DNS Domain: freesoft.org
ubuntu@ca:~$ ip -br addr
lo               UNKNOWN        127.0.0.1/8 ::1/128 
ens4             UP             192.168.4.183/24 fe80::e2c:d2ff:fe67:0/64 
ens5             UP             128.8.8.254/24 fe80::e2c:d2ff:fe67:1/64
ubuntu@ca:~$ tail -5 /etc/dnsmasq.conf 
listen-address=128.8.8.254
bind-interfaces
dhcp-range=128.8.8.101,128.8.8.200,12h
dhcp-authoritative
domain=test
ubuntu@ca:~$ tail -4 /etc/resolv.conf 

nameserver 127.0.0.53
options edns0 trust-ad
search test freesoft.org

它正在做我想做的事情,即回答对“.test”域的查询,但我不明白为什么它在得到答案后停滞了 15 秒。

答案1

nslookup将查询 A 和 AAAA 记录,因此如果 A 查询立即返回而 AAAA 从未返回,nslookup则将打印立即响应,然后超时。

下面是我制作的一个表格,显示dnsmasq128.8.8.254 上的服务器如何回答各种类型的查询:

dig @128.8.8.254 A focal-250          immediate success (A record)
dig @128.8.8.254 A focal-250.test     immediate success (A record)
dig @128.8.8.254 AAAA focal-250       immediate SERVFAIL
dig @128.8.8.254 AAAA focal-250.test  15 second timeout, no response

的输出nslookup意味着它获得了 A 记录响应(前六行),然后等待 AAAA 记录超时。

我发现“修复”该问题的一种方法是通过放入其配置文件来表明dnsmasq它对该test域具有权威性。auth-zone=test现在它的行为是这样的:

dig @128.8.8.254 A focal-250          immediate success (A record)
dig @128.8.8.254 A focal-250.test     immediate success (A record)
dig @128.8.8.254 AAAA focal-250       immediate SERVFAIL
dig @128.8.8.254 AAAA focal-250.test  immediate NOERROR (no records)

nslookup现在ping立即做出回应。

我还发现,dnsmasq出于同样的原因,使 变得“权威”很有用in-addr.arpa:因此它会立即返回 NOERROR 而不是超时。该systemd-resolved服务似乎使用来自记录响应的服务器的答案,而不是不响应任何内容的服务器:

ubuntu@ca:~$ dig +short @128.8.8.254 -x 18.165.83.71
ubuntu@ca:~$ dig +short @192.168.1.1 -x 18.165.83.71
server-18-165-83-71.iad55.r.cloudfront.net.
ubuntu@ca:~$ dig +short @127.0.0.53 -x 18.165.83.71
server-18-165-83-71.iad55.r.cloudfront.net.

答案2

在我看来,nslookup 有 3 次重试和 5 秒超时。这可以解释 15 秒的延迟。您可以通过以nslookup交互模式启动来进行验证(只需键入该名称并按 Enter 键)。在该模式下,您编写set all并获得 所使用的所有选项(及其值)的列表nslookup。这可能是最简单的部分。

你说这nslookup会给你正确的答案,是的,但是联系的 DNS 服务器(/etc/resolv.conf 中的服务器)127.0.0.53并不是答案。答案来自dnsmasq128.8.8.254 的服务器,因为答案中的地址是该 DHCP 服务器范围内的地址。

focal-250.test除非你有文件中的地址/etc/hosts。你似乎没有。因此,从 的角度来看nslookup,发送至 的地址请求127.0.0.53未得到应答,并且配置为重试。

困难的部分是解释服务器如何systemd-resolved工作。如果域名是完全限定的,换句话说,它有几个点,如example.com,解析很简单,它只是发送到上游 DNS 服务器,这些服务器是128.8.8.254 192.168.1.1(我假设这是您的本地路由器),如命令所示resolvectl。但如果名称没有点,就像您使用的名称一样focal-250,分辨率可能首先转至 LLMNR、MulticastDNS 和/或 Avahi 系统,如果未解析,则转至普通 DNS 服务器。请阅读第4.1点在这里简短地研究一下这个问题。

简而言之,您应该检测(并确保)短名称正在由您实际想要解析的 DNS 服务器进行解析。 A dig @128.8.8.254 focal-250dig @192.168.1.1 focal-250并且dig @127.0.0.53 focal-250应该告诉您哪一个是成功的并给出了正确的答案。

请注意:某处接口配置错误ens4,桥接地址设置为 ,192.168.4.183但该接口中的 DNS 服务器设置为192.168.1.1

相关内容