通过 MAC 快速检测网络上是否存在实体?

通过 MAC 快速检测网络上是否存在实体?

有没有一种快速可靠的方法可以使用设备的 MAC 地址来确定它当前是否从 Windows PC/服务器连接到网络?如果没有,那么从 Ubuntu 服务器?

  • arp -a 无法单独工作,因为项目在缓存中保留的时间太长。
  • arp -a 与每 5 分钟清除一次缓存相结合可能会有效,但似乎效率低下,并且只有当缓存在 5 分钟内完全重新填充时才有效。会吗?

背景:我厌倦了上班打卡,因此我编写了一个作为 Windows 服务运行的快速应用程序,定期检查我的手机是否存在于公司网络上,将其记录到数据库中,然后托管一个网站,通过汇总给定范围内的数据,您可以查看我在办公室的时间(使用正确的库在几个小时内就能完成令人惊叹的事情)。

大约一周后,公司决定希望每个人都尽可能使用该应用程序代替我们的考勤系统。

最初我使用的是 DHCP 预留,并定期 ping 我的 Android 手机来检测它。然而,在扩展时,我很快遇到了 iPhone 不响应 ping 的问题。除此之外,ping 速度很慢。每部手机需要大约一秒钟才能通过 ping 可靠地确认它在那里。

我尝试运行 arp -a 并梳理结果以查找 MAC 匹配项,但项目几乎无限期地保留在 arp 缓存中。我考虑过读取缓存,然后刷新它,但我不知道它是否能及时可靠地重新填充。如果确实如此,这是一个潜在的解决方案,尽管我不喜欢每五分钟刷新一次 arp 缓存的想法。

我目前的解决方案是对我们的接入点进行 SNMP 轮询,以收集其连接的客户端,然后对其进行解析,看看是否可以找到 MAC 匹配项。这种方法速度快,而且可靠,但它非常特定于相关接入点。如果我们切换接入点,那么下一个接入点可能不会通过 SNMP 列出其连接的客户端。即使它们列出,我也需要重新配置 SNMP 轮询。

我在想,如果有一个已知端口可以接受任何给定手机的连接,我可以打开一个 tcp 连接,然后关闭它来代替 ping,但我觉得这里一定有一个快速的第 2 层解决方案。

答案1

不要使用arp。使用arping

https://en.wikipedia.org/wiki/Arping

Arping 是一种计算机软件工具,用于发现和探测计算机网络上的主机。Arping 通过使用地址解析协议 (ARP) 请求方法发送链路层帧来探测所连接网络链路上的主机,该帧寻址到由网络接口​​的 MAC 地址标识的主机。

实用程序可以使用 ARP 来解析用户提供的 IP 地址。arping 的功能类似于实用程序 ping,用于使用 Internet 协议套件 Internet 层的 Internet 控制消息协议 (ICMP) 探测网络。

它基本上就是arp做什么的,但没有整个操作系统 ARP 缓存业务,即只是在线上发送文字的、一次性的 arp 请求。

PS 请记住,整个 ARP 业务只能在单个本地子网上工作,如果您需要更广泛的覆盖范围,则必须在路由器上运行它。

PPS 您可以使用较短的 DHCP 租约(例如 1 分钟到 5 分钟)。诚然,Apple 设备过去曾因不遵守 DHCP 规范而闻名,但现在情况应该不会那么糟糕了。我希望如此。

PPPS 甚至arping不会 100% 可靠(尽管它应该高达 99%)。有些设备会忽略未经请求的入站 arp 请求,就像有些设备会忽略 ping 一样。是的,它违反了 IETF,但忽略 ping 也是如此……

纬。

答案2

您使用 ARP 是正确的。因为您不想依赖设备告诉您它在网络上(这是另一种方式),所以您可以自己做。ARP 可以实现这一点,它不仅会为您提供 mac 地址,还会为您提供它们在网络中使用的 ip 地址。当您清除 arpcache 时,它​​会根据需要重新填充。这意味着,它只会用它在网络上必须与之通信的地址填充缓存。

更好的解决方案是,如果您已经知道客户端的 mac 地址,则可以为它们分配网络中的静态 ip 地址。这将在一定程度上解决您的缓存问题,因为缓存确实会定期过期。这意味着下次您的网络接口必须与设备通信时,它将进行另一次查找。现在,由于您遇到了 Apple 设备无法回复 ping 的问题,我建议您始终 ping 您的网络广播。例如,如果您的网关是 192.168.1.1,广播是 192.168.1.255,如果您向该网关发送 ping,则所有接受 ping 的设备都会响应您。

所以,总结一下,您可以继续清除 arp 缓存,因为它会可靠地重新填充,因为 TCP/IP 协议需要它来在计算机和路由器等之间交换数据包。但是,这只会给您的网络接口带来负担。或者在应用程序中,让它检测何时连接到公司网络,并通过与默认 icmp 不同的端口向您的服务器发送 ping,让您的服务器监听上述 ping,然后您就可以记录所需的一切。或者只是让应用程序不时 ping 您的服务器。仅仅因为设备不接受 ping,并不意味着它不能发送 ping。

答案3

有一款名为 Fing 的 Android 应用,主要可以扫描并显示有关网络上所有设备的信息(包括 IP 和 MAC)。

我不知道它使用哪种协议,但它可以检测 Apple 设备。您可以使用 Wireshark 之类的工具尝试对该应用程序进行逆向工程,并在您的工具上使用相同的技术。(有人已经尝试过了在相关的 Stack Exchange 网站上

相关内容