有没有办法查询网络中的所有 mac 地址?

有没有办法查询网络中的所有 mac 地址?

我知道这个问题被标记为“离题”和“非专业”,但在创建网关或 IDS 时,这可能相当相关。此外,Google 找不到任何可用的东西……

每个常见的交换机中都有一个称为 MAC 表 (或 CAM 表) 的东西(根据这篇文章:https://en.wikipedia.org/wiki/CAM_Table

如果交换机确切知道到 MAC 地址的路由,并在每个端口上通告它们(似乎合乎逻辑)...

  • 假设有一台 Linux 机器,是否可以查询每一个网络中指定接口的 MAC 地址?

答案1

我一般安装阿帕勒特为此目的,在系统上安装一个。它是一个守护进程,使用 libcap 来监视流量。它保存每个接口的 mac 地址数据库。它还可以监视一些异常类型的事件并发送通知。它会跟踪上次使用情况,并在重新启动后保留数据库(与仅设置桥接接口相比)。

答案2

公平地说,每个人都说“arp -a”,但我对这个答案并不满意,因为它只显示了已知MAC 地址(及其对应的 IP)。

列表全部端口上的地址,您需要更改当前的网络配置。我们将使用 bridge-utils 包,但任何其他桥接实现(例如:OpenvSwitch)都可以做到这一点。以下描述适用于基于 Debian 的系统:

  1. 首先,您应该安装 bridge-utils 包。
  2. 使用 ifdown 将选定的端口关闭
  3. 在要列出 MAC 地址的端口上创建网桥

假设端口为 eth0,IP 地址是动态的。在 /etc/network/interfaces 中应出现以下内容

allow-hotplug eth0
iface eth0 inet manual

auto br0
iface br0 inet dhcp
  bridge-ports eth0
  bridge_fd 0
  bridge_stp off

要应用这些更改,您可以在 eth0 上使用 ifup,然后在 br0 上使用 ifup,或者简单地重新启动。

  1. 现在你可以使用 brctl 来查询端口

它将列出完整的 MAC 表:

root@debian:~# brctl showmacs br0

输出应如下所示:

port no mac addr                is local?       ageing timer
  1     ab:cd:ef:01:02:03       no                 1.72
  1     ab:cd:ef:01:02:04       no                25.52
  1     ab:cd:ef:01:02:05       no                 2.64
  1     ab:cd:ef:01:02:06       no                10.67
  1     ab:cd:ef:01:02:07       yes                0.00

相关内容