我有一個棘手的案例:
+---+ +----+
|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
網路命名空間可能是一種選擇。它們本質上是網路堆疊的獨立實例,因此它們至少在理論上應該能夠分離兩個介面。
上次我嘗試和它們一起玩,但我無法讓它們正常工作。