我在 AD (2008R2) 中遇到了一个有趣的 DNS 问题,我找不到调试的方法。主要是如果我从命令行尝试
ping <machinename>
然后我收到回复说找不到主机。但当我这样做时nslookup <machinename>
我从 DNS 获得了正确的响应,其中包含正确的 AAAA 和 A 记录。有人知道这是什么原因造成的吗?
客户端机器运行Windows 7 Enterprise。
答案1
确保 HOSTS 和 LMHOSTS 中没有任何奇怪的内容。nslookup 通过直接与 DNS 服务器对话来工作,而 ping 使用的名称解析由操作系统完成。这意味着您的 HOSTS 文件可能已损坏,或者 Winsock 等已损坏。
由于我们正在使用 IPv4 和 IPv6,当您 ping 主机 -4 和 ping 主机 -6 时会发生什么?
您可能还想关闭 WINS/NetBIOS
答案2
之前的评论是正确的。我只想补充一点,名称解析可能存在一个序列。至少,这在 Linux 下以名为 /etc/nsswitch 的文件的形式存在。默认情况下,本地 HOST 文件将在调用名称服务器之前解析名称。至于名称服务器的实际 IP 地址,这些是在控制面板 -> 网络中设置的
通常,HOSTS 文件位于 C:\WINDOWS\SYSTEM32\DRIVERS\ETC
可以使用记事本编辑此文件。我经常在我拥有的各种虚拟 Windows 服务器上使用此文件。
答案3
我刚刚遇到了完全相同的问题。对我来说,问题是由定义了多个 DNS 服务器引起的。我的 IPv4 设置设置为 DHCP,主 DNS 设置为我的路由器,辅助 DNS 设置为 Google DNS 服务器。虽然顺序无关紧要。
当我切换到使用通过 DHCP 提供的 DNS 服务器时,问题就解决了。重新添加 DNS 服务器会再次出现问题。
我真的不明白这背后的根本原因。但也许这对你来说也是同样的问题。
答案4
我遇到了类似的问题,通过更改路由器的 DHCP 设置来为我的本地网络提供一个域,并将静态 DNS 条目放在该域中,我解决了该问题。
然而,我发现一些论坛帖子描述了类似的问题,但症状略有不同,解决方案也不同(注册表更改),所以我将详细描述我的问题,以将其与该问题区分开来。
我的问题
我最近买了一个新的路由器(Mikrotik),并对其进行了配置,为网络上的每个主机分配一个静态 IP,并为每个主机分配一个本地 DNS主机名(并且只有一个主机名)。这在 UNIX/Linux/Mac OS X 上运行良好,但 Windows 运行起来有问题。
在 Windows 上,我无法 ping一些按名称查找主机,尽管我可以通过 nslookup 查找它们并通过 IP 对它们进行 ping 操作:
C:\>nslookup router
Server: router
Address: 192.168.22.1
Non-authoritative answer:
Name: router
Address: 192.168.22.1
C:\>ping router
Ping request could not find host router. Please check the name and try again.
C:\>ping 192.168.22.1
Pinging 192.168.22.1 with 32 bytes of data:
Reply from 192.168.22.1: bytes=32 time<1ms TTL=64
Reply from 192.168.22.1: bytes=32 time<1ms TTL=64
Reply from 192.168.22.1: bytes=32 time<1ms TTL=64
Reply from 192.168.22.1: bytes=32 time<1ms TTL=64
Ping statistics for 192.168.22.1:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
C:\>nslookup overkill
Server: router
Address: 192.168.22.1
Non-authoritative answer:
Name: nas_server
Address: 192.168.22.5
但奇怪的是,其他一些方法却有效:
C:\>ping nas_server
Pinging nas_server [192.168.22.5] with 32 bytes of data:
Reply from 192.168.22.5: bytes=32 time<1ms TTL=64
Reply from 192.168.22.5: bytes=32 time<1ms TTL=64
Reply from 192.168.22.5: bytes=32 time<1ms TTL=64
Reply from 192.168.22.5: bytes=32 time<1ms TTL=64
Ping statistics for 192.168.22.5:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
C:\>
我使用 Wireshark 进一步调查,发现 ping 命令没有导致任何仅发送 DNS 数据包NetBIOS 名称服务数据包。对于我的路由器,这会失败,但对于我的 NAS 服务器,它会成功(因为 NAS 正在运行 Samba)。nslookup 使用 DNS,这就是它对所有事情都有效的原因。
Wireshark 从 ping 中捕获:
根本问题是 Windows 使用 NetBIOS 名称服务反而在某些情况下(例如当主机没有域时)的 DNS。
我的解决方案
注意:屏幕截图来自我的路由器的配置屏幕,但它们说明了一般概念。
我配置了我的 DHCP 服务器来告诉所有主机它们是域的一部分:
然后我配置了所有静态 DNS 条目以将所有主机放在此域中:
然后我清除了 Windows 中的所有 DHCP/DNS 信息:
C:\>ipconfig /release
C:\>ipconfig /renew
C:\>ipconfig /flushdns
一切顺利!
C:\>ping router
Pinging router.localnet [192.168.22.1] with 32 bytes of data:
Reply from 192.168.22.1: bytes=32 time<1ms TTL=64
Reply from 192.168.22.1: bytes=32 time<1ms TTL=64
Reply from 192.168.22.1: bytes=32 time<1ms TTL=64
Reply from 192.168.22.1: bytes=32 time<1ms TTL=64
Ping statistics for 192.168.22.1:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
C:\>