有没有一种快速可靠的方法可以使用设备的 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 网站上)