20

我注意到一些更好的网络发现应用程序(例如 iOS 版 Fing 和 Mac 版 iNet)即使没有宣传 Bonjour 服务(例如 iTunes Wi-Fi Sync)也能够发现 iOS 设备和 Mac 设备的设备名称。这是怎么做到的?我知道如何进行反向 mDNS 查询https://serverfault.com/questions/143184/how-do-i-get-the-machine-name-from-an-ip-via-multicast-dns。但是,虽然反向 mDNS 查找(至少由 dig 命令完成)dig -x the.ip @224.0.0.251 -p 5353) 将适用于没有以其他方式广播任何 Bonjour 服务的 Mac,除非在 iOS 设备上运行 Wi-Fi 同步或其他一些 Bonjour 服务,否则它不起作用。我不知道如何获得名称,但这些应用程序可靠地获得它。我在 iNet 发现时使用了 Wireshark,我只看到 ICMP 和 NetBios 查询都返回 0 个答案。

另请注意,我已经通过广播 ping 然后解析 ARP 表获得了设备的 IP 地址。我想通过获取设备名称并查找字符串“iPhone”或“iPad”来发现以这种方式发现的哪些设备是 iOS 设备。

另请注意,iNet 应用程序网站提供了有关他们如何进行反向 IP 查找的以下内容。我认为这意味着他们对每个 IP 进行反向 DNS 查找和反向 mDNS 查找。

Reverse IP lookups (host­names) are per­formed as unicast and mul­ti­cast queries for every IP found.- http://www.bananaglie.de/inet/index_e.php

4

1 回答 1

18

您是否尝试过 dns-sd 命令行工具?

如果您键入dns-sd -B _services._dns-sd._udp以获取所有可用服务,您将看到有可用的_whats-my-name服务。

$ dns-sd -B _services._dns-sd._udp
Browsing for _services._dns-sd._udp
DATE: ---Tue 16 Dec 2014---
14:38:30.746  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
14:38:30.747  Add        3   5 .                    _tcp.local.          _nfs
14:38:30.747  Add        3   5 .                    _tcp.local.          _afpovertcp
14:38:30.747  Add        3   5 .                    _tcp.local.          _smb
14:38:30.747  Add        2   0 .                    _tcp.local.          _whats-my-name
14:38:31.330  Add        3  10 .                    _tcp.local.          _nfs
14:38:31.330  Add        3  10 .                    _tcp.local.          _afpovertcp
14:38:31.330  Add        2  10 .                    _tcp.local.          _smb

之后,我们可以查询该服务,该服务输出以下内容:

$ dns-sd -B _whats-my-name._tcp
Browsing for _whats-my-name._tcp
DATE: ---Tue 16 Dec 2014---
14:40:20.738  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
14:40:20.742  Add        2   0 local.               _whats-my-name._tcp. Blub MacBook Pro

Instance Name是这里有趣的部分。我假设该_whats-my-name服务在每台运行 bonjour 的计算机上都可用。如果您在每种情况下都无法访问 dns-sd,也许您可​​以搜索发送的查询并使用基本的 bash 工具对其进行重建。此外,您不应在脚本中使用 dns-sd。相反,您应该为您的编程语言使用协议的特定实现。

注意:请注意,设备的名称可能无法可靠地检测您正在与哪个设备进行通信

希望有帮助。

于 2014-12-16T13:55:59.580 回答