我有一个有9个网卡的Linux盒子,我想让它们中的八个在同一个子网上有唯一的地址,例如:
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行为是非常适得其反的,因为它导致所有通过eth1传输的IPstream量,这与我想要的完全相反。
所以我翻遍了,最后对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做一些事情,但是我在这个领域已经迷失了方向。
奖励积分:解决scheme必须与Linux 2.6.27.27兼容。 (更具体地说,Slax 6.1.2)
你需要一个强大的terminal系统模型 。 Linux基本上是build立在弱发送系统模型的基础上的,所以对于这个应用程序来说,它并不是一个好的操作系统select。
你将不得不伪造你需要的所有行为,从ARP到策略路由到源地址select。 你还需要filter,以防止数据包被接受,如果他们到达错误的接口。
绝对必要的步骤是:
在所有接口上configurationarp_filter = 1和arp_ignore = 2。
为传出stream量添加每个接口,基于源的路由。 (目标接口必须根据源地址select。)
添加每个接口的入口过滤,以静默丢弃在错误的接口上收到的数据包。 (具有分配给另一个接口的目的地地址的分组。
不幸的是,这三个步骤是否都是需要的,还没有达成共识。 弱端系统模型是内置于整个Linux TCP / IP协议栈中的,并不清楚像组播这样的微妙问题会出现什么问题。
例如,如何为广播select输出接口尚不清楚。 它们应该全部出去吗? 也许。 如果堆栈获得一个源地址未分配给其中一个接口的出站广播,那么正确的行为是什么?
再次,你select了这个工作的错误工具。
我会build议绑定物理接口,然后configuration单个绑定接口上的所有地址。
您还需要在交换机上提供支持。
这里有一个你可以用来开始的迷你教程 。
看来你想要一个相当于9台独立机器的testing环境,并且认为一台机器上的9个接口可以模拟这个环境。 在Linux中,由于David Schwartz所描述的原因,无法通过单个堆栈来完成。 BTDT并有伤疤。 2个接口已经够糟糕了。
一个更好的解决scheme可能是在一个主机上运行8个或9个分立的虚拟机,并将8个或9个接口连接到这些虚拟机。
您更可能希望创build一个具有8/9接口的网桥,然后为该网桥分配一个IP地址(bridge-utils数据包,命令'brctl add')。
这样,网桥就像一个交换机一样,可以在你的子网中有一个IP地址。