我有一个带有 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 到策略路由再到源地址选择。您还需要过滤器来防止数据包到达错误接口时被接受。
绝对必要的步骤是:
在所有接口上配置arp_filter=1和arp_ignore=2。
为传出流量添加每个接口的基于源的路由。(必须根据源地址选择目标接口。)
添加每个接口的入口过滤,以静默丢弃在错误接口上接收的数据包。(目标地址分配给另一个接口的数据包。)
不幸的是,对于这三个步骤是否足够,人们还没有达成共识。弱端系统模型内置于整个 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 退出。
如果有人能成功,请建议其他方法。