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


13

我有一个带有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或SOMETHING做一些事情,但是我在这个领域迷路了。

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


您可以发布路由表吗?
ponsfonze,2012年

2
创建此配置的目的是什么?你想达到什么目的?
大卫·史瓦兹

这种疯狂的谎言。
Sirex

如果要绑定这些接口,则必须实际绑定它们。
resmon6'8

1
@DavidSchwartz不,机器不应该像交换机(或路由器)那样工作。您可以将其更多地看作是为每个VM运行8个带有专用物理NIC的虚拟机(注意:我不是在运行VM,这只是一个类比)。从同一网络上的另一个盒子的角度来看,我的一台PC应该与八台分立的PC完全没有区别。
frustrated_tester

Answers:


17

您需要一个强大的终端系统模型。Linux基本上是基于弱发送系统模型构建的,因此,对于该应用程序而言,它实际上不是一个很好的OS选择。

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

绝对必要的步骤是:

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

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

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

不幸的是,对于是否仅需要这三个步骤尚无共识。弱端系统模型内置在整个Linux TCP / IP堆栈中,目前尚不清楚多播之类的细微问题可能会导致什么问题。

例如,不清楚如何选择广播的输出接口。它应该全部消失吗?也许。如果堆栈的出站广播源地址未分配给其中一个接口,那该怎么办?

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


6

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

这样,网桥将像交换机一样工作,并且可以将IP地址添加到您的子网中。


AFAIK,这实际上应该是Linux的正确答案。Linux通过使用桥接设备来解决David的答案中提到的许多问题(也可以通过建立更好的L2逻辑网络来避免L3问题)。
戴夫

4

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

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

这是一个迷你教程,您可以用来入门。


4

看来您想要一个等效于9台独立计算机的测试环境,并认为一台计算机上的9个接口可以模拟该环境。在Linux中,由于David Schwartz所述的原因,它根本无法通过单个堆栈完成此操作。并有BTDT的疤痕。有2个接口已经够糟糕了。

更好的解决方案可能是在一台主机中运行8或9个离散虚拟机,并将8或9个接口桥接到这些虚拟机。


阅读资源:Unix网络编程:套接字网络API,由Stevens,Fenner和Rudoff撰写。另请参阅RFC1122和RFC4907。
Skaperen

0

是的,可以遵循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都在同一个子网中时,ARP从eth1答复生成

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:策略路由

CONFIG_IP_ADVANCED_ROUTER

CONFIG_IP_MULTIPLE_TABLES

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

如果有人可以使用,请提出其他建议。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.