为了便于开发,我设置了一个子域名,其 A 记录为 127.0.0.1(在权威服务器上设置的时间超过 24 小时,就像我设置普通子域名一样)。假设它是 localhost.example.com。我可以使用 nslookup 在工作中毫无问题地找到它:
$ nslookup localhost.jasperhorn.nl
Server: dc01.[...]
Address: 10.1.1.50
Non-authoritative answer:
Name: localhost.jasperhorn.nl
Address: 127.0.0.1
然而,我在家里没有收到任何回复:
$ nslookup localhost.jasperhorn.nl
Server: dsldevice.lan
Address: 192.168.1.1
DNS request timed out.
timeout was 2 seconds.
*** Request to dsldevice.lan timed-out
当我在家运行 nslookup 时明确添加名称服务器时,它可以正常工作:
$ nslookup localhost.jasperhorn.nl ns1.flexwebhosting.nl
Server: ns1.flexwebhosting.nl
Address: 82.192.67.204
Name: localhost.jasperhorn.nl
Address: 127.0.0.1
(在工作中,添加名称服务器会导致问题,但我认为这是由于防火墙造成的,与家里的问题无关。)
当我从我的两台服务器(均运行 Linux)尝试进行相同的调用时,无论指定还是不指定名称服务器,我都会得到正确的答案(127.0.0.1)。
这是否表明路由器有问题或者还有其他问题?
答案1
实际上,我很遗憾地不相信您提供的一些结果。(我并不是说您报告的结果不准确。我是说我不相信这些结果。)
首先,为了解决这个问题,您当前的问题表明:
nslookup localhost.jasperhorn.nl ns1.flexwebhosting.nl
我得到的结果和你一样。但是,在这种情况下,你不是在向他们询问 localhost.example.com,而是在向他们询问 localhost.jasperhorn.nl。这与向他们询问 localhost.example.com 不同。当我这样做时:
nslookup localhost.example.com ns1.flexwebhosting.nl Server: ns1.flexwebhosting.nl Address: 82.192.67.204
*** ns1.flexwebhosting.nl can't find localhost.example.com: Query refused
他们为您提供了结果。对于我来说,我在美国华盛顿州,距离这个 DNS 服务器的位置(大概在荷兰)有半个地球的距离,我发现他们确实设置了一个接收我的流量的 DNS 服务器,他们验证了我是否有权使用它们,他们发现我没有,他们费心发送回复(使用 DNS 协议)让我知道他们拒绝了我的查询。或者他们只是快速关闭/拒绝了 UDP 端口 53 连接。无论哪种方式,他们以某种方式快速让我知道我不应该费心尝试从他们那里获取 DNS 结果。如果您使用相同的 DNS 服务器,他们似乎正在花时间验证您使用该服务器的权限。(请注意,即使您指定了相同的 IPv4 地址,您可能也不会使用同一台计算机作为 DNS 服务器,因为它们可能会路由不同于外部 IPv4 流量的内部 IPv4 流量)。
因此,接下来我查找了 DNS 根服务器列表,并尝试了以下操作:
nslookup localhost.example.com 198.41.0.4
部分结果:
Server: UnKnown Address: 198.41.0.4
Name: localhost.example.com Served by: - m.gtld-servers.net 192.55.83.30 com
好吧,所以它不想告诉我。它说检查 192.55.83.30 以获取与“com”相关的答案。(这是有道理的,因为“localhost.example.com。”在“com。”内,我显示了通常隐含的最后一个句点。)
好的,现在我们来看看正确答案是什么:
nslookup localhost.example.com m.gtld-servers.net
结果关键部分:
Server: UnKnown Address: 192.55.83.30
Name: localhost.example.com Served by: - a.iana-servers.net 199.43.132.53 2001:500:8c::53 example.com - b.iana-servers.net 199.43.133.53 2001:500:8d::53 example.com
哦,他们也不想告诉我。但他们告诉我,a.iana-servers.net 是询问的更好的地方。localhost.example.com.
好的,我会这样做。
nslookup localhost.example.com a.iana-servers.net Server: a.iana-servers.net Address: 199.43.132.53
***
a.iana-servers.net can't find localhost.example.com: Non-existent domain
好的。就是这样。这是官方的正确答案。所有其他 DNS 服务器都应该提供相同的答案。让我们检查一下:
nslookup localhost.example.com google-public-dns-a.google.com Server: google-public-dns-a.google.com Address: 8.8.8.8
*** google-public-dns-a.google.com can't find localhost.example.com: Non-existent domain
这是另一个名称服务器:
nslookup localhost.example.com resolver1.opendns.com Server: resolver1.opendns.com Address: 208.67.222.222
***
resolver1.opendns.com can't find localhost.example.com: Non-existent domain
好的,所以这些信誉良好的消息来源与官方正确的消息来源一致。因此,对于您显示的第一个结果,即 10.1.1.50(这是一个私有 IPv4 地址,根据您所在的网络指向不同的设备),响应的设备提供了一个非权威的答案,与实际正确的答案不符。它没有说域不存在,而是说:Address: 127.0.0.1
那个设备真可耻。我认为这是配置错误。也许是一个相当明智的做法:“example.com”通常以特殊方式处理,因此“example.com”可能提供有趣的结果并不一定意味着 DNS 服务器在查找非特殊域的标准任务上表现不佳。不过,我还是希望看到设备提供正确的信息。
现在,最后,让我们讨论一下路由器。路由器没有响应。这让我想知道如果给路由器另一个不存在的域会发生什么。
现在,我已经说过为什么我不会太担心来自“example.com”域的结果(因为有些人可能会对它进行特殊处理;错误处理并不一定意味着其他域也会被错误处理)。所以让我不再关注“example.com”名称,而是稍微概括一下这种情况(假装其他名称也可能会发生这种情况)。当名称服务器提供错误结果时会发生什么?我将忽略您指定的域名,并讨论如何处理无法正确响应的设备。
这表明名称服务器存在问题。从示例输出来看,存在问题的名称服务器位于 192.168.1.1,名为“dsldevice.lan”。如果这是您的路由器(根据名称来看,这很有可能),那么这就是问题的根源。该设备似乎试图通过以特殊方式运行并产生某些结果来智取您,并且这样做违反了 DNS 的工作方式。如果我注意到这一点,我会执行以下操作之一:
- 通过调整一些设置,看看路由器是否能修复。(具体来说,需要调整的设置可能与 DNS、名称服务等有关。)
- 看看路由器是否可以通过更改固件(官方升级或非官方发行版,如 DD-WRT)来修复。这就是我处理路由器的方式。如果我们不谈论路由器,我可以用以下说法概括这种方法:“更换 DNS 服务器(使用不同的软件)”。
- 只需忽略该问题,让路由器停止充当 DNS 服务器。(使用其他 DNS 服务器的最巧妙方法可能是调整指定要使用哪个 DNS 服务器的 DHCP 服务器的设置。在许多情况下,DHCP 服务器可能是路由器。在这种情况下,我会调整路由器中的 DHCP 设置,告诉路由器将设备指向提供我信任的结果的其他 DNS 服务器)