Linux

通過物理介面路由流量

  • February 18, 2022

我在一台 linux 機器上有兩個乙太網介面。兩者都具有以下 IP 地址: 介面 A:10.0.1.5/24 介面 B:10.0.2.5/24

兩個介面都連接到在兩個網路之間路由的路由器。

現在我想啟動 iperf3 測量,將伺服器綁定到介面 A,將客戶端綁定到介面 B。

問題是流量不會離開物理介面,而只會流經核心,導致鏈路上的速度甚至無法實現。

我可以做些什麼來強制流量通過物理介面?ip_forward 被禁用。

謝謝。

讓 Linux 系統使用單個路由堆棧,在不使用介面的情況下執行從自身到自身的數據包的多宿主路由是非常困難的(但並非不可能)。lo

但是在 Linux 上創建額外的網路堆棧來模擬一個系統中的多個系統非常容易:通過使用網路命名空間

在這裡,可以將兩個 NIC 之一放棄給一個新的網路命名空間,該命名空間將成為初始(主機)網路命名空間的對等點。它們不會直接通信,而只能通過外部路由器進行通信。讓我們假設介面是真正命名的AB並且路由器使用地址10.0.1.1/24+ 10.0.2.1/24

  • 在使用iproute2工具時創建一個具有額外便利管理的新網路命名空間(在後台,掛載命名空間偽文件以在沒有程序的情況下保留資源等)。
ip netns add sideB
  • 將介面移動B到新的網路命名空間:
ip link set dev B netns sideB

注意:無線介面需要使用iw命令代替。

  • 配置新的網路命名空間:

當介面更改命名空間時,其所有網路設置都會失去(無論是在介面消失、觸發地址消失、觸發路由消失的主機上,還是在新的網路命名空間上):

ip -n sideB link set dev B up
ip -n sideB address add 10.0.2.5/24 dev B

不需要,但萬一 iperf3 感到困惑,有一個功能性的環回介面:

ip -n sideB link set lo up
  • 配置兩側之間的路由(初始/主機命名空間可能已經通過預設路由,但讓我們明確一點)
ip route add 10.0.2.0/24 via 10.0.1.1 dev A

ip -n sideB route add 10.0.1.0/24 via 10.0.2.1 dev B

現在可以執行(在兩個終端中):

iperf3 -s

ip netns exec sideB iperf3 -c 10.0.1.5

客戶端在新的網路命名空間中執行。

測量結束後,刪除網路命名空間會將 NIC 返回到主機命名空間。但是,如果任何程序錯誤地使用了這個網路命名空間(類似ip netns exec side B setsid sleep 9999),ip netns delete sideB下面只會從iproute2工具的視圖中刪除命名空間,但在程序結束之前不會真正刪除命名空間,從而使 NIC 難以恢復。所以最好先把它移回來:

ip -n sideB link set dev B netns 1
ip netns delete sideB

其中1表示 PID 1 的網路命名空間:初始/主機命名空間。此外,這允許在給定物理 NIC 的容器內執行實驗(因為1網路命名空間是容器的命名空間,而不是實際主機的命名空間),否則物理 NIC 將重新出現在主機上並永遠失去到容器中如果無法訪問主機。

如果沒有工具(如 udev + ifupdown或 NetworkManager)檢測到 NIC的allow-hotplug幻影,則必須在返回時再次對其進行配置。

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