我正在尝试测试以太网桥接设备。我的 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 了解更多信息