我有一个棘手的案例:
+---+ +----+
|D1 +->eth0---------<-eth0-+D2 |
| | | |
| +->eth1---------<-eth1-+ |
+---+ +----+
在 D2 上eth0
并且eth1
具有来自同一子网的 IP 地址:eth0
10.1.1.1/24
, eth1
10.1.1.2/24
。 D1 上的接口没有分配地址,它的作用类似于交换机。
现在,我希望 D2 能够将流量发送到10.1.1.2
via eth0
,因此数据包路径必须是:D2(eth0)--D1(eth0)--D1(eth1)--D2(eth1)。
当我10.1.1.2
从 D2 ping 时,它在本地发送数据包,即 D1 没有收到任何数据包。我应该在 D2 上更改哪些内容才能实现所需的行为?
谢谢。
答案1
你想要的东西在 Linux 下是不可能实现的。至少不在路由层内。如果目标地址属于本地接口,则数据包始终通过环回接口,从该接口无法(通过 RfC)路由到外部。
我认为可能可以使用iptables
并将DNAT
目标更改为子网中未使用的地址,并使用ip neigh
静态将 MAC 地址设置为另一个 NIC 之一,但甚至不DNAT
匹配到本地地址的数据包的规则。
可以使用虚拟机或网络命名空间,这样内核就看不到10.1.1.1
on eth0
。但是您需要代理 ARP 和 DNAT 将传入数据包从物理接口移动到虚拟接口。
如果值得这么努力吗?
答案2
网络命名空间可能是一种选择。它们本质上是网络堆栈的独立实例,因此它们至少在理论上应该能够分离两个接口。
上次我尝试和它们一起玩,但我无法让它们正常工作。