我们有一台 Linux (debian) 服务器,它有两个 NIC,连接到同一个交换机。(我们以前有一个专用于服务器之间通信的交换机,但当我们的大多数服务器移至托管设施时,该交换机也随之移动。)这些 NIC 具有不同的静态 IP 地址,但大约每月一次,arpwatch 会发出一对触发器消息,因为其中一个 IP 会从一个接口跳转到另一个接口并返回。这可能是什么原因造成的?
答案1
这可能与同一网络上多个 NIC 的 Linux ARP 行为有关,并已在这个 Server Fault 问题。基本上你需要设置一些系统控制参数:
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
这些将导致 ARP 回复仅在实际拥有 ARP 请求中请求的 IP 地址的网络接口上发出。
正如上述问题中提到的,这是因为在 Linux 中,默认情况下主机拥有一个 IP,而不是一个特定的接口,因此回复将通过它选择的任何接口发出。当您在同一网络上有多个接口时,这可能会导致问题,而这正是上述 sysctl 参数修改的内容。
答案2
如果它在 Linux 上并且您正在使用 udev(可能确实如此,它已经成为“标准”几年了),您可以强制将 eth0 或 eth1 等分配给特定的 MAC 地址。
例如,我在工作时使用的 IBM x3655 文件服务器上的 /etc/udev/rules.d/70-persistent-net.rules 中有以下内容。它有 4 个 NIC,其中三个插入 3 个不同的 VLAN,最后一个插入“内部 Gb 主干网”(机架中用于所有服务器间通信的专用千兆交换机 - NFS、ntp、dns、rsync 等)。显然,每个接口在重新启动时获得相同的名称和相同的 IP 地址至关重要:
# 此文件由 /lib/udev/write_net_rules 自动生成 # 由 persistent-net-generator.rules 规则文件运行的程序。 # # 您可以修改它,只要将每个规则保留在一行上即可。 # 内置 Broadcom Extreme NIC ## PCI 设备 0x14e4:0x164a (bnx2) 子系统=="net", 动作=="添加", 驱动程序=="?*", 属性{地址}=="00:14:5e:5a:18:ac", 属性{类型}=="1", 内核=="eth*", 名称="eth0" 子系统=="net", 动作=="添加", 驱动程序=="?*", 属性{地址}=="00:14:5e:5a:18:ae", 属性{类型}=="1", 内核=="eth*", 名称="eth1" # PCI Intel e1000 网卡 ## PCI 设备 0x8086:0x105e (e1000) 子系统=="net", 驱动程序=="?*", ATTR{地址}=="00:15:17:2e:e0:c3", 名称="eth2" 子系统=="net", 驱动程序=="?*", ATTR{地址}=="00:15:17:2e:e0:c2", 名称="eth3"
答案3
我没有答案,但也许可以给出一些提示。不久前,我的一位同事提到,Linux 驱动程序中有一个特定网卡的错误。如果服务器有多个接口,这个错误显然会导致 MAC(!) 地址在接口之间跳转。我从未检查过这一点,但我似乎记得这个错误据说在 2.6.17 左右版本中已经修复。
答案4
为了让那些不熟悉 sysctl 的人澄清 Kamil 的解决方案,请编辑此文件:
vim /etc/sysctl.conf
添加以下两行:
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
然后运行:
sudo sysctl -p
以便它们生效