如何从 Linux 机器识别连接到同一交换机的 NIC?

Rei*_*ann 15 linux redhat bonding interface

最初设定

作为 Linux 管理员,您已经安装了一个带有 6 个 NIC eth0 到 eth5 的全新 Linux 机器。eth0 接口已正确配置,所有其他接口当前都已启动但没有 IP 地址。网络人员简单地将四根电缆连接到这个盒子上。两根 LAN 电缆用于将盒子连接到生产网络,两根用于将盒子连接到专用网络。你只知道eth0连接到生产网络。但是您不知道哪个其他 NIC 连接到同一交换机,因为存在不同的服务器代和/或网络人员使用错误的 NIC 进行连接。

手头的任务

由于此设置是您的基础架构的典型设置,因此您希望自动配置绑定接口。现在您的任务是检测哪些 NIC 根本没有连接,哪些 NIC 链接到同一交换机,以便它们可以绑定。您只能访问 Linux 机器,而不能查询交换机。

想法

检测链接状态很容易:

ethtool $device | grep 'Link detected' | cut -d ':' -f 2
Run Code Online (Sandbox Code Playgroud)

但是如何匹配连接到同一交换机的设备呢?

在 HP-UX 中有一个用于此目的的工具,称为linkloop [1]。缺少官方的 Linux 工具(不过有一个旧的 SourceForce 项目)。

我已经想到的可能解决方案是:

  1. 使用 tcpdump 侦听所有接口。制作并发送 ICMP(广播)数据包。看到该数据包的接口需要连接到同一交换机。-> 需要可能用于此的简单工具的建议。我想使用普通的 shell 命令或 Python 来编写脚本。

  2. 尝试通过一些简单的协议(HTTP?)与外部盒子对话,看看是否有响应。-> 容易出错并且依赖于外部盒子。

您对如何解决此任务有进一步的想法或建议吗?

预先感谢您的所有评论!

[1] http://linux.die.net/man/1/linkloop

YLe*_*arn 10

交换机可能已经向您发送了您想要的信息。如果它们是 Cisco 交换机,默认情况下它们将使用称为 CDP(Cisco 发现协议)的进程,该进程将为您提供有关其所连接交换机的信息。

您可以使用 tcpdump 通过以下方式查看此信息(替换相应的接口):

tcpdump -nn -v -i eth0 -s 1500 -c 1 'ether[20:2] == 0x2000'
Run Code Online (Sandbox Code Playgroud)

CDP 的标准版本是 LLDP(链路层发现协议)。一些供应商默认情况下会启用此功能,而其他供应商会关闭此功能,因此您的里程会有所不同。Linux 有一些 LLDP 实现,但如果你想要类似于上面的东西,你可以使用它(在 Cisco 交换机上设置 LLDP 并测试以下内容,这与上面更一致):

tcpdump -nn -v -i eth0 -s 1500 -c 1 'ether proto 0x88cc'
Run Code Online (Sandbox Code Playgroud)

除此之外,我会说您提供的选项 1 的修改可能会起作用,但是,您可以尝试普通 ICMP(到不在 ARP 表中的主机)并捕获 ARP 数据包,而不是发送广播 ICMP。如果 ARP 请求从 eth0 发出并且您在 eth1 和 eth3 上收到它,那么您就知道它们在同一个 VLAN 上。最简单的命令如下:

tcpdump -i eth0 arp
Run Code Online (Sandbox Code Playgroud)