是否有可能使检测 MAC 地址更加直接的方法?

是否有可能使检测 MAC 地址更加直接的方法?

简单介绍一下背景,我是一名学生计算机技术员,花了不少时间寻找大量设备的以太网 MAC 地址,以便注册这些设备以供在校园互联网上使用。但是,我想让我的生活更简单一点,开发一些东西,也许是一个小型 CLI 程序,可以检测通过以太网端口连接到计算机的设备的 MAC 地址。

*请注意,我指的只是以太网 MAC 地址,即分配给设备以太网端口的 MAC 地址。这与分配给设备 WiFi 卡的 WiFi MAC 地址不同,因为它是不同的独立组件。

*我只需要一次查看一个设备的 MAC 地址,因此不需要以太网交换机。

我有时会使用路由器来帮助人们获取设备(如电视)的以太网 MAC 地址,因为该地址未在设备本身的任何菜单中列出,也未在设备标签或包装上列出。我知道路由器会根据设备连接到路由器的方式检测连接到它的任何设备的 MAC 地址。我想要做的是省掉路由器(尽管我的路由器很小巧可爱),因为要实现这个功能我必须同时携带路由器和笔记本电脑。我知道可以将计算机变成路由器,因为我以前就这样做过。在之前的工作中我必须这样做,以便将一个小型本地集群计算机网络(连接到哑交换机)连接到我们的校园网络,使用集群的头节点作为路由器,因为它有 4 个空闲的以太网端口(顺便说一下,它是一个 Linux 集群)。

1) 由于计算机可以设置为路由器,因此我想将自己的计算机设置为路由器(但最好仅通过 CLI 程序临时设置),但我希望在终端中显示连接的设备。

我使用某种 CLI 命令将前面提到的计算机设置为路由器,我确信在某个时候我会记起它是什么,这样我就可以再次使用该软件,所以这不是什么大问题(除非你有什么建议)。

也许我忽略了一些东西,但我不知道如何直接将我的想法变为现实,因为我不知道检测到的 MAC 地址存储在哪里,或者是否有一个简单的命令可以用来打印我的计算机在充当路由器后检测到的 MAC 地址。

请记住,我更喜欢在 Linux 中完成这一切(我主要使用 Debian,但熟悉 CentOS/SL),因为我的同事实际上可能会调整我的程序以在自己的 Raspberry Pi 上运行。这就是为什么我想制作一个我之前描述的 CLI 程序,因为如果我们成功的话,Pi 将只用于那个特定目的。没有鼠标,没有键盘,只有一个带屏幕的 Pi,它会显示连接到其以太网端口的设备的 MAC 地址。Windows 实现会注明,但请记住,无论如何我都会将它们翻译成 Linux,所以请尽可能详细地说明。

2) 我想知道是否有可能查看以太网适配器之外的 MAC 地址。让我解释一下这个问题:

我之所以问这个问题,是因为我有一台属于家人的 Chromebook,我可以保留它。如果可以的话,我可能会在上面安装 Linux 并用它来测试,但它没有以太网端口。我可以获得以太网适配器,但根据我的经验,我知道当您使用以太网适配器将设备连接到校园网络时(例如,使用带有适配器的计算机连接到校园以太网),以太网适配器的 MAC 地址是网络首先看到的地址(任何时候我联系校园网络运营中心,他们都可以告诉我连接到房间以太网端口的适配器的 MAC 地址。我不会很快与他们联系,如果我联系他们,我会问他们)。

因此,我假设如果我将笔记本电脑变成路由器,我可能会遇到这样的问题:它可能会查看连接到它的适配器的 MAC 地址,而不是该适配器另一端的设备的 MAC 地址。因此,如果可以“查看”适配器之外的内容,那么如何实现呢?我对 arp 和 trace route 等命令的作用范围一无所知,尽管我只在少数情况下使用它们。但是,我确实想知道我的想法是否正确,路由器可能有办法查看设备路径上的 MAC 地址。这一切都假设可以将没有以太网端口的计算机变成路由器,因为这远远超出了我的知识范围。

此外,我和我的同事也有可能忽略了一些非常简单的事情。最后:

3) 如果您有任何大胆的想法,请告诉我。我愿意尝试其他方法,尤其是采用更简单的方法来实现我们想要实现的目标。

答案1

请务必注意,我仅指以太网 MAC 地址,即分配给设备以太网端口的 MAC 地址。这与分配给设备 WiFi 卡的 WiFi MAC 地址不同,因为它是不同的独立组件。

需要注意的是,只要 Wi-Fi 连接设备与以太网连接设备桥接到同一个网络,就无法仅通过检查网络状态来区分它们的 MAC 地址,因为它们的行为方式完全相同。您只能通过查看接入点“已连接设备”列表或设备本身显示的信息来区分它们。

我知道路由器会根据设备与路由器的连接方式来检测与其连接的任何设备的 MAC 地址。

大多数路由器会显示 DHCP 租约表中注册的所有地址。有些路由器还会将此列表与 ARP 缓存/ICMPv6 ND 缓存中保存的地址相结合。

可以说,这两种方法都需要设备发起对话。路由器实际上无法“探测”线路另一端的情况。

我想制作一个我之前描述的 CLI 程序,因为如果我们成功的话,Pi 只会用于这个特定目的。没有鼠标,没有键盘,只有一个带屏幕的 Pi,可以显示连接到其以太网端口的设备的 MAC 地址。

对于大多数设备来说,这很容易做到,只需使用 tcpdump 捕获以太网接口上看到的所有数据包即可。通常,设备会发送诸如 DHCP 查询、ICMPv6 NA、IGMP 或 MLD 注册、未经请求的 ARP 等。您可以捕获所有这些并获取源地址。

但正如前面提到的,如果设备在连接时根本不发送数据包,那么也无法了解其 MAC 地址。(连接后,以太网不需要任何特殊的 L2 握手。DHCP 只是常见的,而不是强制性的。)

因此,我假设如果我将笔记本电脑变成路由器,我可能会遇到这样的问题:它可能会看到连接到它的适配器的 MAC 地址,而不是该适配器另一端的设备。

不,通常不是这样。USB 连接的以太网适配器的行为与“普通”内置或 PCI 连接的端口相同 - 它们不是独立的网络设备;相反,计算机完全控制发送和接收的以太网帧。

因此,当笔记本电脑通过 USB 适配器接收以太网帧时,它将始终看到原始源 MAC。

我可以获得以太网适配器,但是根据我的经验,我知道当您通过以太网适配器将设备连接到校园网络时(例如,使用带有适配器的计算机连接到校园以太网),以太网适配器的 MAC 地址是网络首先看到的地址 [...] 所以,如果可以“看到”适配器的过去,那是怎么可能的呢?

确实如此,但这与适配器“隐藏” MAC 地址无关。

请注意,在一个段落中,你正在谈论你的笔记本电脑看到来自网络的数据包。但在另一段中,你正在谈论你的笔记本电脑是如何被看到的经过网络。

有了 USB 和内置以太网端口,计算机可以完全控制其发送的以太网帧,包括“源 MAC”地址。但是,计算机本身不具有分配给它的 MAC 地址 – 它们始终来自以太网适配器。(即使它是内置以太网端口,网络看到的 MAC 地址仍然来自其集成的以太网芯片,而不是来自整个计算机。)

因此,网络可以看到 USB 适配器的 MAC 地址,因为该地址首先来自那里。USB 适配器实际上并没有向网络“隐藏”真正的 MAC 地址,因为那里除了适配器本身提供的地址之外,没有其他“真实”地址。

同样,笔记本电脑将会清楚地看到传入的数据包 - USB 适配器不会采取任何措施来隐藏接收数据包中的 MAC 地址。

(旁注:“计算机没有 MAC”规则也有例外。以太网适配器中可能没有内置 MAC,而是通过引导加载程序配置等其他来源提供 MAC,这种情况在“嵌入式​​” SoC 上非常常见。)

这一切都假设可以将没有以太网端口的计算机变成路由器,因为这超出了我的知识范围

如果你将 USB 以太网适配器连接到计算机,那么它有一个以太网端口。无论是通过 USB 还是 PCI 连接,它都以相同的级别工作。

任何计算机都可以成为路由器,即使它根本没有以太网 - “成为路由器”的唯一要求是连接两个 IP 子网。例如,如果您有一台带 Wi-Fi 的笔记本电脑以及虚拟机网络,它还可以充当虚拟机的路由器。

1) 由于计算机可以设置为路由器,因此我想将自己的计算机设置为路由器(但最好仅通过 CLI 程序临时设置),但我希望在终端中显示连接的设备。

我使用某种 CLI 命令将前面提到的计算机设置为路由器,我确信在某个时候我会记起它是什么,这样我就可以再次使用该软件,所以这不是什么大问题(除非你有什么建议)。

但这一切都不重要,因为你的电脑不需要成为路由器以便知道所连接设备的 MAC 地址。上面提到的信息源(DHCP 租约和 ARP 缓存)在路由器中很常见,但并非路由器独有,实际上也不是 IP 路由的一部分。

任何 IP 设备都会有 ARP 缓存,任何计算机都可以充当 DHCP 服务器,即使它实际上根本不进行任何路由。例如,您可以安装域名系统在您的笔记本电脑上,将其指向任何以太网端口,这样您就拥有一个 DHCP 服务器,它可以回答来自任何连接设备的租用请求。

例如,这是我常用的“即时 DHCP”命令:

sudo dnsmasq --no-daemon --conf-file=/dev/null --no-hosts --port=0 \
             --interface=eth0 --bind-dynamic \
             --dhcp-range=192.168.1.1,192.168.1.254,255.255.255.0,1h \
             --dhcp-option=option:dns-server,8.8.8.8

就是这样。只要你将设备连接到 eth0,如果如果该设备设置为使用 DHCP,它将显示在 dnsmasq 输出中。(并且它将被分配一个您的笔记本电脑也可以访问的 IP 地址。)您将其与实际 IP 路由(可能还有 NAT/伪装)相结合,但您不需要这样做。

然而,你甚至不需要实际的 DHCP 服务都不是。如果连接的设备想要使用 DHCP,它无论如何都会发送 DHCP 查询 - 您只需从数据包捕获工具(例如)中挑选出原始地址即可tcpdump

tl;dr:参见spiff 的帖子。

答案2

您可以使用tcpdump嗅探器嗅探以太网接口上收到的所有数据包,并过滤掉(忽略)来自您自己的 MAC 地址的所有数据包。然后在tcpdump运行时,将目标设备直接插入以太网接口。大多数设备在以太网链路首次启动时都会广播一些 ARP 和 DHCP 以及其他流量,因此您应该会在首次连接以太网电缆时看到一些数据包。

此解决方案的优点在于,您甚至不必将 Ubuntu 盒子变成任何类型的路由器或网桥即可实现此目的。您所需要的只是一个可用于此用途的以太网接口。

假设您的 Ubuntu 盒子的以太网接口是 eth0,MAC 地址为“00:11:22:33:44:55”。您可以运行如下命令:

sudo tcpdump -nei eth0 'not ether src 00:11:22:33:44:55' | awk '{print $2}'

该命令将仅打印 eth0 上收到的每个数据包的源 MAC 地址。您可能会看到来自目标设备的多个数据包,因此您可能会看到同一 MAC 地址的多个副本。您可以按 Ctrl-C 退出该命令。您可能可以改进此脚本,例如,从输出中获取单个 MAC 地址并将其复制到剪贴板,但我将把这留给读者作为练习。

如果您的目标设备在其以太网链路首次启动时没有发送数据包,请尝试重新启动它。大多数设备在启动时都会发送数据包。

相关内容