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

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

我有一个带有 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

在这种情况下,默认 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冒充所有其他人,但我仍然无法eth1成功 ping 除地址之外的任何内容。(例如,从同一交换机上的第二台计算机,仅192.168.123.1响应 ping)

我猜我需要使用 arptables 或 iproute 或其他东西来做某事,但我在这个领域迷失了方向。

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

答案1

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

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

绝对必要的步骤是:

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

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

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

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

例如,不清楚如何选择广播的输出接口。是否应该将所有广播都发出?也许。如果堆栈收到一个出站广播,其源地址未分配给其中一个接口,正确的行为是什么?

再次,你选择了错误的工具来完成这项工作。

答案2

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

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

答案3

我建议绑定物理接口,然后在单个绑定接口上配置所有地址。

您还需要交换机上的支持。

这是一个迷你教程您可以使用它来开始。

答案4

是的,按照 David Schwartz 的建议是可能的:

echo -ne 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth3/rp_filter

//为了实现正确的功能,即当 eth0 和 eth1 位于同一子网时,从 eth1 生成 ARP 回复

echo -ne 0 > /proc/sys/net/ipv4/conf/all/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth1/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

//Create a table called "new_rt_table" and create a routing rule that says any packet with a mark equal to '1' gets routed according to the "new_rt_table"(can name it whatever you want) table. The file /etc/iproute2/rt_tables is the only source of table names on the system. Internally, routing tables have integer identifiers.

echo 1 new_rt_table >> /etc/iproute2/rt_tables
ip rule add from all fwmark 1 table new_rt_table

//设置“new_rt_table”表以通过 eth1 路由数据包

ip route add default dev eth1 table new_rt_table
ip route show table new_rt_table

//标记数据包以便“ip route”可以通过 eth1 进行路由

iptables -F -t mangle
iptables -t mangle -I OUTPUT -s <ip addr of eth1> -o eth0 -j MARK --set-mark 1

//在内核配置中启用对多个路由表的支持。

内核配置

→ 网络支持 → 网络选项

[*] IP:高级路由器

[*] IP:策略路由

配置IP_ADVANCED_ROUTER

配置 IP 多表

//上述步骤将重定向从 eth0 输出的数据包以正确从 eth1 退出。

如果有人能成功,请建议其他方法。

相关内容