Linux

具有同一子網 IP 的多個物理介面

  • June 18, 2019

我有一個 linux 盒子,上面有 9 個 NIC,我希望其中 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)

你需要一個強大的終端系統模型。Linux 基本上是圍繞弱發送系統模型建構的,因此對於這個應用程序來說,它確實不是一個好的作業系統選擇。

您將不得不偽造您需要的每一個行為,從 ARP 到策略路由再到源地址選擇。如果數據包到達錯誤的介面,您還需要過濾器來防止數據包被接受。

絕對必要的步驟是:

  1. 在所有介面上配置 arp_filter=1 和 arp_ignore=2。
  2. 為傳出流量添加每個介面、基於源的路由。(必鬚根據源地址選擇目標介面。)
  3. 添加按介面入口過濾以靜默丟棄在錯誤介面上接收到的數據包。(目標地址分配給另一個介面的數據包。)

不幸的是,對於是否只需要這三個步驟,還沒有達成共識。弱端系統模型內置於整個 Linux TCP/IP 堆棧中,尚不清楚多播等細微問題可能會出現什麼問題。

例如,尚不清楚您將如何選擇廣播的輸出介面。它應該全部消失嗎?也許。如果堆棧獲得源地址未分配給其中一個介面的出站廣播,那麼正確的行為是什麼?

同樣,您為這項工作選擇了錯誤的工具。

引用自:https://serverfault.com/questions/415304