我有一个带有9个网卡的
linux机箱,我希望其中有8个网卡在同一个子网上有唯一的地址,例如:
ifconfig eth1 192.168.123.1 netmask 255.255.0.0 ifconfig eth2 192.168.123.2 netmask 255.255.0.0 ifconfig eth3 192.168.123.3 netmask 255.255.0.0 ... ifconfig eth8 192.168.123.8 netmask 255.255.0.0
在这种情况下,默认ARP行为极其适得其反,因为它会导致所有IP的所有流量完全通过eth1传递,这几乎与我想要的完全相反.
所以我四处翻找并最终对sysctl进行了一些更改,例如:
net.ipv4.conf.all.arp_filter=1 net.ipv4.conf.all.arp_ignore=1 net.ipv4.conf.all.arp_announce=2
这确实阻止了eth1冒充所有其他人,但我仍然无法成功ping除eth1的地址以外的任何内容. (例如,来自同一交换机上的第二台计算机,只有192.168.123.1响应ping)
我猜我需要用arptables或iproute或SOMETHING做点什么,但我在这个领域迷失了.
奖励要点:解决方案必须与Linux 2.6.27.27兼容. (更具体地说,Slax 6.1.2)
解决方法
你需要一个
strong end system model. Linux基本上是围绕一个弱的发送系统模型构建的,所以它对于这个应用程序来说真的不是一个好的操作系统选择.
您将不得不伪造所需的所有行为,从ARP到策略路由到源地址选择.您还需要过滤器以防止数据包到达错误的接口时被接受.
绝对必要的步骤是:
>在所有接口上配置arp_filter = 1和arp_ignore = 2.
>为传出流量添加每个接口,基于源的路由. (必须根据源地址选择目标接口.)
>添加每个接口的入口过滤以静默丢弃在错误接口上接收的数据包. (将目标地址分配给另一个接口的数据包.)
不幸的是,对于这三个步骤是否都是必需的,尚未达成共识.弱端系统模型内置于整个Linux TCP / IP堆栈中,并不清楚组播等细微问题可能出现的问题.
例如,目前尚不清楚如何为广播选择输出接口.它应该全部消失吗?也许.如果堆栈获得一个源地址未分配给其中一个接口的出站广播,那么正确的行为是什么?
同样,你选择了错误的工具.