![在同一网络上具有多个接口的 Linux 服务器上,ARP 使用单个 MAC 地址进行响应](https://linux22.com/image/628331/%E5%9C%A8%E5%90%8C%E4%B8%80%E7%BD%91%E7%BB%9C%E4%B8%8A%E5%85%B7%E6%9C%89%E5%A4%9A%E4%B8%AA%E6%8E%A5%E5%8F%A3%E7%9A%84%20Linux%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%EF%BC%8CARP%20%E4%BD%BF%E7%94%A8%E5%8D%95%E4%B8%AA%20MAC%20%E5%9C%B0%E5%9D%80%E8%BF%9B%E8%A1%8C%E5%93%8D%E5%BA%94.png)
Linux 服务器有 2 个活动网络接口:
IF:eth1 IP:192.168.1.1/24 MAC:11:11:11:11:11:11 (1GbE)
IF:eth2 IP:192.168.1.2/24 MAC:22:22:22:22:22:22 (10GbE)
这个想法是,10GbE 接口 (eth2) 是与网络上的主机通信的主要接口。我想让第二个 1GbE 接口 (eth1) 保持开启,以防万一。如果 10GbE 接口发生故障:我仍然可以轻松进入,可以更新 DNS 以便主机可以连接,等等。
在观察接口统计数据时,我注意到尽管网络上的所有主机都在寻址此接口,但所有流量都是在 eth1 而不是 eth2 上发送/接收的。我确认 DNS A 记录指向正确接口的 IP。此外,我确认通过 IP 而不是 FQDN 寻址接口会产生相同的结果。
我清除了机器上的 ARP 缓存,然后通过 IP 地址 ping eth1 接口。我检查了我的 ARP 表,找到了 eth1 的 MAC 地址。我再次清除了 ARP 缓存,然后通过 IP 地址 ping eth2 接口。再次,我检查了我的 ARP 表,找到了 eth1(不是 eth2)的 MAC 地址。
如果我关闭 eth1,物理断开接口,或将其放在不同的逻辑网络上 - 我得到预期的行为,流量将通过我的 eth2 接口。
我的问题:为什么会发生这种情况?我看到一些证据表明,由于 Linux 内核的“弱主机模型”,这是预期的行为。
我怎样才能让两个接口在同一个网络上保持正常运行,并让它们按照我期望的方式工作。
答案1
Linux 旨在响应任何接口上的 ARP 请求。假设主机拥有 IP 地址,而不是特定接口。您看到的称为 ARP Flux。
您可以使用 sysctrl 更改此行为
arp_ignore - 整数
定义不同的模式来响应接收到的解析本地目标 IP 地址的 ARP 请求并发送回复:
0 - (默认): 回复任意本地目标IP地址,配置在任意接口上
1 - 仅当目标 IP 地址是传入接口上配置的本地地址时才回复
2 - 仅当目标 IP 地址是传入接口上配置的本地地址,并且与发送方的 IP 地址都属于此接口上的同一子网时才回复
3 - 不回复配置了范围主机的本地地址,仅回复全局和链接地址的解析
答案2
如果您的交换机支持,我将使用 802.1ad 链路聚合来提供故障转移。
使用此功能,您可以将两个接口绑定在一起,并将一个设置为主动接口,另一个设置为被动接口。您的 IP 地址将驻留在绑定接口上,因此如果一个 NIC 发生故障,IP 地址不会发生变化。