这是我的 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
则将打印立即响应,然后超时。
下面是我制作的一个表格,显示dnsmasq
128.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
并不是答案。答案来自dnsmasq
128.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-250
,dig @192.168.1.1 focal-250
并且dig @127.0.0.53 focal-250
应该告诉您哪一个是成功的并给出了正确的答案。
请注意:某处接口配置错误ens4
,桥接地址设置为 ,192.168.4.183
但该接口中的 DNS 服务器设置为192.168.1.1
。