我有一台运行 2.4.37 内核的旧 Linux 机器。机器中有两块 NIC 卡,它们位于同一网络上,但 IP 不同。为了进行一些测试,我们希望每个 IP 的流量都通过该 NIC 路由,但实际发生的情况是,两个 IP 的所有流量都通过其中一个以太网设备路由,而另一个则未使用。如果我使用网络上另一台 ARP 缓存为空的机器并 ping 两个 IP,然后检查 ARP 缓存,我会发现它具有两个 IP 下两个 NIC 之一的 MAC。基本上,Linux 机器允许两个 NIC 响应彼此的 ARP 请求 - 这是默认行为。但是,我为两个 NIC 启用了 arp_filter,这应该可以消除这种情况,但似乎没有效果。我也尝试过禁用 rp_filter,但这似乎也没有效果。以下是我的相关 sysctl 条目:
net.ipv4.conf.eth1.arp_filter = 1
net.ipv4.conf.eth1.rp_filter = 0
net.ipv4.conf.eth0.arp_filter = 1
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.lo.arp_filter = 1
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.default.arp_filter = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.arp_filter = 1
net.ipv4.conf.all.rp_filter = 0
我在 Google 上找到了大量有同样问题的人的链接,但是一旦他们设置 arp_filter=1,问题就消失了,而对我来说却没有。
编辑:我也尝试过各种 arp_ignore 和 arp_announce 设置,但无论我做什么,我都无法让每个接口只响应自己 IP 的 ARP
答案1
防止 ARP 流量的一种方法是使用
net/ipv4/conf/$DEV/arp_filter
。简而言之,使用 arp_filter 会导致接收方(在下面的例子中是 real-server)执行路由查找以确定发送回复的接口,而不是默认行为(如上所示),即从接收请求的所有以太网接口进行回复。如果到达目的地的唯一路由是通过其中一张网卡,则 arp_filter 解决方案可能会产生意想不到的效果。
因此 arp_filter 的工作方式是查询路由表来确定应使用哪个接口将数据包发送到请求主机。如果您的路由表有一条默认路由,如下所示:
default dev eth0 src 192.168.0.10
那么它将始终在 eth0 上发送 ARP 回复,无论 eth0 是否具有匹配的 IP。
一个可能的解决方案(我还没有测试过)是设置源策略路由根据源 IP 选择传出接口:
echo 10 eth0 >> /etc/iproute2/rt_tables
echo 11 eth1 >> /etc/iproute2/rt_tables
ip route add 192.168.0.0/24 dev eth0 table eth0
ip route add 192.168.0.0/24 dev eth1 table eth1
ip rule add from 192.168.0.10 lookup eth0
ip rule add from 192.168.0.11 lookup eth1