背景
我有一个设备通过以太网插入我的 Windows PC。该设备正在运行 mDNS 服务并有自己的主机名 ( gp800-49d1a
)。
从 WSL,我可以ping gp800-49d1a
成功,并得到nslookup gp800-49d1a
以下结果:
Server: 172.30.176.1
Address: 172.30.176.1#53
Non-authoritative answer:
Name: gp800-49d1a.local
Address: 169.254.93.130
Name: gp800-49d1a.local
Address: fe80::e700:63f:1807:adf2
我可以获取 IP 地址169.254.93.130
。通过此地址进行连接有效。到目前为止,一切都正确。
问题
当我nslookup gp800-49d1a
从 Windows 命令提示符运行时,得到以下结果:
Server: dns.google
Address: 8.8.8.8
*** dns.google can't find gp800-49d1a: Non-existent domain
当我ping gp800-49d1a
从 Windows 命令提示符运行时,它运行正常。
因此,由于某种原因,WSL 中的 nslookup 是可以的,但 Windows 中的 nslookup 则不可以。
附加信息
我可以使用主机名从 Google Chrome 顺利访问我的设备。看来 Chrome 和 WSL 都知道如何找到 mDNS 条目,但 Windows 命令提示符中的 nslookup 却不知道。
问题
由于 nslookup 无法从 Windows 命令提示符中找到我的设备,我还可以使用什么来从 Windows 获取我的设备的 IP 地址?
答案1
nslookup
是一个专用的 DNS 客户端,而不是 mDNS 客户端,也不是通用的主机名查找工具。它完全忽略了操作系统的整个“主机名查找”系统,而是手动将 DNS 数据包发送到一台服务器(它在操作系统提供的列表中找到的第一台服务器)。
它在 WSL 中起作用的唯一原因是您正在与 Windows 主机上运行的 DNS 服务(“Dnscache”)对话,然后它将查询代理到它支持的所有机制(包括由 Windows 上的“Dnscache”处理的 mDNS)。
然而,即使在这种情况下,Linux nslookup仍然绕过正常的 Linux 主机名查找,而是手动执行 DNS,并且仍然认为它只与在 /etc/resolv.conf 中找到的一个特定服务器进行单播 DNS 通信 - 只是该服务器在未经 nslookup 知情的情况下执行此转换。
但是,当您直接在 Windows 上运行它时,这种情况不会发生 - nslookup 与 8.8.8.8 的 DNS 服务器对话,而该服务器对您的 .local mDNS 主机名一无所知。
答案2
正如所提到的u1686_grawity 的回答,Windows 命令提示符中的 nslookup 不适用于 mDNS。
要获取设备的 IP 地址,您可以使用 PowerShell 命令Resolve-DnsName <hostname>
。
> Resolve-DnsName gp800-49d1a
Name Type TTL Section IPAddress
---- ---- --- ------- ---------
gp800-49d1a.local AAAA 120 Answer fe80::e700:63f:1807:adf2
gp800-49d1a.local A 120 Answer 169.254.93.130