Linux

是否可以僅使用 TUN/TAP 介面在網路名稱空間之間發送數據包?

  • November 17, 2018

我試圖了解不同類型的(虛擬)介面(例如 TUN/TAP、veth 等)之間的區別,並在容器的上下文中研究其中一些類型。

是否可以僅使用 TUN/TAP 介面在容器之間(在其自己的網路名稱空間中)將數據包發送到主機的網路名稱空間,或者是否需要 veth 對(每個名稱空間中的一端)來執行此操作?

據我了解,TUN/TAP 介面只能用於從/從該介面的網路命名空間對應的網路堆棧向/從使用者空間發送/接收數據包,而不能在網路命名空間之間發送數據包。它是否正確?

tun/tap 介面始終屬於某個應用程序:發送到該介面的數據包被應用程序讀取,應用程序寫入的數據包通過該介面進入核心網路堆棧。

通常,您將使用虛擬乙太網對 (veth) 連接網路命名空間。他們只是將數據包轉發到該對的另一個介面。

沒有什麼能阻止您編寫一個完全執行此操作的應用程序:打開兩個 tun/tap 介面,從一個讀取數據包並將其轉發到另一個,反之亦然。您還可以使用現成的應用程序來執行此操作,例如socat.

你甚至可以編寫兩個應用程序,每個應用程序都打開一個 tun/tap 介面,應用程序之間使用其他方式進行通信,並以這種方式實現轉發。基本上所有 VPN 應用程序都以這種方式工作(儘管對於 VPN 應用程序“通過其他方式”通常是“通過現有網路連接”,所以它並不算數)。

所以是的,使用正確的應用程序,您可以將命名空間與 tun/tap 介面連接起來。但是,通常這樣做並沒有多大意義,因為您必須編寫這樣的應用程序,而且它的效率會低於僅使用 veth-pair。

編輯

我嘗試將一個 tun 介面移動socat到我創建的網路命名空間中,儘管在主網路命名空間中執行ns0,但它工作正常,正如我預期的那樣:socat

socat TUN:10.1.0.254/24,tun-name=tun0a,iff-up TUN:10.1.0.1/24,tun-name=tun0b
ip link set tun0b netns ns0

然後您必須再次設置tun0b移動後的地址。

因此,“交叉”是通過將一個(或兩個)tun/tap 網路介面置於與程序不同的命名空間中而發生的。

引用自:https://unix.stackexchange.com/questions/481968