在同一子网上具有 IP 的多个物理接口

fru*_*ter 16 networking linux nic subnet

我有一个带有 9 个 NIC 的 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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,默认的 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
Run Code Online (Sandbox Code Playgroud)

这确实阻止eth1了冒充所有其他人,但除了eth1的地址之外,我仍然无法 ping 任何其他内容。(例如,来自同一交换机上的第二台计算机,仅192.168.123.1响应 ping)

我猜我需要用 arptables 或 iproute 或其他东西做点什么,但我在这个领域迷失了方向。

加分项:解决方案必须与 Linux 2.6.27.27 兼容。(更具体地说,Slax 6.1.2)

Dav*_*rtz 19

您需要一个强大的终端系统模型。Linux 基本上是围绕弱发送系统模型构建的,因此对于此应用程序来说,它确实不是一个好的操作系统选择。

您将不得不伪造您需要的每一个行为,从 ARP 到策略路由再到源地址选择。您还需要过滤器来防止数据包到达错误的接口时被接受。

绝对必要的步骤是:

  1. 在所有接口上配置 arp_filter=1 和 arp_ignore=2。

  2. 为传出流量添加每个接口、基于源的路由。(必须根据源地址选择目标接口。)

  3. 添加每接口入口过滤以静默丢弃在错误接口上接收的数据包。(具有分配给另一个接口的目标地址的数据包。)

不幸的是,对于这三个步骤是否就足够了,还没有达成共识。弱端系统模型内置于整个 Linux TCP/IP 堆栈中,目前尚不清楚多播等细微问题可能会出现什么问题。

例如,不清楚您将如何选择广播的输出接口。它应该全部熄灭吗?也许。如果堆栈获得源地址未分配给其中一个接口的出站广播,那么正确的行为是什么?

同样,您为这项工作选择了错误的工具。


小智 7

您更可能希望使用 8/9 接口创建一个网桥,然后为该网桥分配一个 IP 地址(bridge-utils 数据包,命令“brctl add”)。

这样,网桥将充当交换机,并且可以在您的子网中拥有一个 IP 地址。