与多个具有相同IP但不同MAC地址的主机进行网络层通信

与多个具有相同IP但不同MAC地址的主机进行网络层通信

由于不幸的(错误)配置问题,我有大约 100 台主机,其中 IPv6/IPv4(甚至 IPv6 链路本地)地址都是相同的,目前我无法更改。但是,所有主机都有唯一且已知的 MAC 地址,并且位于同一个广播域中。是否可以通过自己制作相应的以太网帧(使用已知的 MAC 地址而不是通过 ARP/... 获得的 MAC)在 IP 级别上单独和同时与主机通信?所有(嵌入式)主机都运行 Linux 网络堆栈。

是否有针对现有程序(如 curl)的包装器,可以让我与每台主机保持单独的 TCP 连接,从而允许我在上述情况下同时通过 HTTP 与它们通信?在我看来,理论上这应该是可能的。

答案1

作为@AlexD提示,您必须在本地计算机中手动关联通用 IP 地址A B C D具有所需的 MAC 地址xx-xx-xx-xx-xx每个特定的远程主机,以便您可以连接到它。

在 Windows 中,您可以arp在提升的命令 shell 窗口中使用该命令:

arp -s a.b.c.d xx-xx-xx-xx-xx-xx

此关联是永久的,直到用 删除为止arp -d a.b.c.d(如 所示arp -?)。

Linux 中的命令和选项-s/-d相同,在 shell 中执行权限或以 为前缀sudo,但只影响驻留的 ARP 缓存,因此在重启时会被忘记(man arp推荐)。

編輯:如@Zac67如上所述,本地网络中的每个主机只能有一对 IP/MAC。这是因为本地流量仅使用给定 IP 地址的最后一个已知 MAC 地址(通过 ARP 查询或 ARP 表查找找到)进行。如果有其他机器具有相同的 IP,则无法识别它们。

仅当满足以下任一条件时,情况才会改变:

  1. [关联是静态的(由管理员使用 arp 命令完成)] 管理员再次更改配对,或者在重新启动此计算机时忘记配对(如果不是永久的,则会更改为动态)。或者,

  2. [使用 ARP 协议进行动态搜索。] 一段时间后,结果将被标记为过时,下一个连接将引发本地网络中的新搜索。然后其他主机可以赢得竞争并提供其 MAC 地址。

手动配对比自动配对具有更高的优先级。

归根结底:我们只能有一对 IP/MAC 供目标主机成功通信。如果由于配置错误或恶意软件/黑客活动,本地网络中存在多对 IP/MAC,并且我们正在使用 ARP 自动发现,那么我们将遇到间歇性问题或更糟糕的情况。

当然,具有唯一 IP 地址的动态方法更受欢迎;这意味着管理员的麻烦更少... ;)

答案2

您可以使用 在管理计算机上禁用传入的 ARP 更新,arptables然后使用 手动arp逐个更新每个损坏的主机的 ARP 表。

答案3

如果您制作了自己的 IP 堆栈,那么您所问的问题只是理论上可能实现的。

如果您使用 IP 地址,IP 堆栈将使用动态或静态 ARP 来确定每个 IP 所需的 MAC 地址。任何给定时间只能有一个映射。应用程序无法为任何套接字连接指定或强制特定映射。有关详细信息,请参阅@Fjor 的回答。

如果您使用允许每个套接字进行 IP 到 MAC 映射的 API 创建了自己的 IP 堆栈,那么您就可以执行所要求的操作。

相关内容