Linux 计算机不应答 ARP 请求

Linux 计算机不应答 ARP 请求

我们有这种情况:路由器(即 Ubuntu VM)在同一物理 NIC 上有多个 VLAN 接口。这些 VLAN 接口是动态配置和拆除的,并连接到用户可以添加或移除机器的网络。

有时我们会遇到这样的情况,例如,在 VLAN 1 上,路由器的 IP 为 10.0.0.254,而邻居机器的 IP 为 10.0.0.1。同时,在 VLAN 2 上,路由器的 IP 为 10.0.0.1,而邻居机器的 IP 为 10.0.0.2。

当 VLAN 1 上的 10.0.0.1 发送 ARP 询问“谁有 10.0.0.254 告诉 10.0.0.1”时,路由器没有响应。在路由器上嗅探流量显示 ARP 请求带有正确的 VLAN 标记,但被丢弃。

路由器是否会认为 ARP 消息到达了错误的接口而将其丢弃?

几点说明:

  1. VLAN 2 上没有 ARP 问题。
  2. 将 VLAN 1 上的邻居虚拟机的 IP(10.0.0.1)替换为 10.0.0.3 可解决问题。
  3. 正如我所提到的,两个 IP(10.0.0.254 和 10.0.0.1)都在同一个 MAC 地址上。
  4. 所有接口上的 arp_filter 均设置为 0
  5. 路由器的路由表并不引用所有这些动态接口。我们使用 iptables 和 fwmarks 以及 IP 规则和自定义路由表(全部由软件动态设置)根据流量来源的 VLAN 分别路由流量。

哪里有问题?

答案1

不支持将单个网络节点连接到使用相同 IP 地址的两个不同网络。地址冲突是使用 RFC 1918 地址的一个众所周知的缺点。这就是引入 RFC 4193 的原因,它规定必须随机生成 40 个地址位。

如果您不想通过重新编号网络来解决地址冲突,并且不想升级到 IPv6(以避免在第一种情况下发生此类冲突),那么您可以获得的最可靠的设置是将单个网络节点拆分为两个或多个网络节点。

单个 Linux VM 可以同时作为多个独立网络节点运行。该功能称为网络命名空间。每个网络命名空间都有自己的一组网络接口、本地地址、路由表条目和防火墙规则。不同的网络命名空间可以通过虚拟网络接口相互通信。

可以使用man ip-netns(或man ip如果您使用的是旧版本)找到有关网络命名空间功能的文档。

答案2

如果路由器的一个接口上有 IP 地址 10.0.0.1,那么另一台声称拥有该 IP 地址的机器将被视为 ARP 欺骗。即使您确实让它回答 ARP,您也永远无法将数据包从路由器发送到 10.0.0.1 - 路由表会是什么样子?

您需要为路由器及其连接的所有设备分配不同的 IP 地址。

答案3

听起来您的用户的机器没有配置为在最初创建或新分配 IP 时发送免费 ARP 请求。您可以使用 arping 实用程序完成此类操作。

相关内容