如何配置 Linux 路由/过滤,以便将数据包从一个接口通过网桥发送到同一台机器上的另一个接口

如何配置 Linux 路由/过滤,以便将数据包从一个接口通过网桥发送到同一台机器上的另一个接口

我正在尝试测试以太网桥接设备。我的 Linux 机器上有多个以太网端口。我想将数据包从一个接口(例如 IP 为 192.168.1.1 的 eth0)发送到同一子网上的另一个接口(例如 IP 为 192.168.1.2 的 eth1)。

我意识到通常不会在同一个子网上配置两个接口,如果这样做,内核会直接路由到每个接口,而不是通过线路。我如何才能覆盖此行为,以便到 192.168.1.2 的流量从 192.168.1.1 接口流出,反之亦然?

提前致谢!

答案1

使用网络命名空间。感觉就像运行虚拟机,但它不是虚拟机,只是看起来像一个单独的 IP 堆栈。

ip netns add otherhost
ip netns exec otherhost /bin/bash

这将在网络命名空间下打开一个 shell otherhost。如果你检查其中的网络配置,你会发现没有接口。就像你在运行不同的主机一样。

现在,将eth1接口移动到otherhost网络命名空间:

ip link set eth1 netns otherhost

现在,otherhost命名空间有了您的eth1接口。像配置单独的主机一样配置它,并eth0在默认网络命名空间上执行相同操作。就是这么简单。

请注意,如果您关闭所有 shell otherhost,网络命名空间将会消失,并且其接口将会移回默认网络命名空间。

答案2

https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt

accept_local- BOOLEAN 接受具有本地源地址的数据包。结合合适的路由,这可用于通过线路在两个本地接口之间引导数据包并正确接受它们。默认为 FALSE

使用sysctl -w net.ipv4.conf.eth0.accept_local=1

通过网络发送数据包。

答案3

尝试

#mark packets from 192.168.1.1 to 192.168.1.2
iptables -t mangle -I OUTPUT -s 192.168.1.1 -d 192.168.1.2 -j MARK --set-mark 11
#mark packets from 192.168.1.2 to 192.168.1.1
iptables -t mangle -I OUTPUT -s 192.168.1.2 -d 192.168.1.1 -j MARK --set-mark 12

#add routing table for 192.168.1.1 
ip ru a fwmark 11 table 11
ip r a 192.168.1.2 dev eth0  t 11

#add routing table for 192.168.1.2
ip ru a fwmark 12 table 12
ip r a 192.168.1.1 dev eth1  t 12

man ip , man iptables 了解更多信息

相关内容