用 tap/tun 做虛擬機器的網絡卡
本文首發於我的公眾號 CloudDeveloper(ID: cloud_dev) ,專注於乾貨分享,號內有大量書籍和視訊資源,後臺回覆 「1024」 即可領取,歡迎大家關注,二維碼文末可以掃。
在雲端計算時代,虛擬機器和容器已經成為標配。它們背後的網路管理都離不開一樣東西,就是虛擬網路裝置,或者叫虛擬網絡卡,tap/tun 就是在雲端計算時代非常重要的虛擬網路網絡卡。
tap/tun 是什麼
tap/tun 是 Linux 核心 2.4.x 版本之後實現的虛擬網路裝置,不同於物理網絡卡靠硬體網路板卡實現,tap/tun 虛擬網絡卡完全由軟體來實現,功能和硬體實現完全沒有差別,它們都屬於網路裝置,都可以配置 IP,都歸 Linux 網路裝置管理模組統一管理。
作為網路裝置,tap/tun 也需要配套相應的驅動程式才能工作。tap/tun 驅動程式包括兩個部分,一個是字元裝置驅動,一個是網絡卡驅動。這兩部分驅動程式分工不太一樣,字元驅動負責資料包在核心空間和使用者空間的傳送,網絡卡驅動負責資料包在 TCP/IP 網路協議棧上的傳輸和處理。
使用者空間與核心空間的資料傳輸
在 Linux 中,使用者空間和核心空間的資料傳輸有多種方式,字元裝置就是其中的一種。tap/tun 通過驅動程式和一個與之關聯的字元裝置,來實現使用者空間和核心空間的通訊介面。
在 Linux 核心 2.6.x 之後的版本中,tap/tun 對應的字元裝置檔案分別為:
- tap:/dev/tap0
- tun:/dev/net/tun
裝置檔案即充當了使用者空間和核心空間通訊的介面。當應用程式開啟裝置檔案時,驅動程式就會建立並註冊相應的虛擬裝置介面,一般以 tunX
或 tapX
命名。當應用程式關閉檔案時,驅動也會自動刪除 tunX
和 tapX
裝置,還會刪除已經建立起來的路由等資訊。
tap/tun 裝置檔案就像一個管道,一端連線著使用者空間,一端連線著核心空間。當用戶程式向檔案 /dev/net/tun
或 /dev/tap0
寫資料時,核心就可以從對應的 tunX
或 tapX
介面讀到資料,反之,核心可以通過相反的方式向用戶程式傳送資料。
tap/tun 和網路協議棧的資料傳輸
tap/tun 通過實現相應的網絡卡驅動程式來和網路協議棧通訊。一般的流程和物理網絡卡和協議棧的互動流程是一樣的,不同的是物理網絡卡一端是連線物理網路,而 tap/tun 虛擬網絡卡一般連線到使用者空間。
如下圖的示意圖,我們有兩個應用程式 A、B,物理網絡卡 eth0
和虛擬網絡卡 tun0
分別配置 IP: 10.1.1.11
和 192.168.1.11
,程式 A 希望構造資料包發往 192.168.1.0/24
網段的主機 192.168.1.1
。
基於上圖,我們看看資料包的流程:
- 應用程式 A 構造資料包,目的 IP 是
192.168.1.1
,通過socket A
將這個資料包發給協議棧。 - 協議棧根據資料包的目的 IP 地址,匹配路由規則,發現要從
tun0
出去。 -
tun0
發現自己的另一端被應用程式 B 打開了,於是將資料發給程式 B. - 程式 B 收到資料後,做一些跟業務相關的操作,然後構造一個新的資料包,源 IP 是
eth0
的 IP,目的 IP 是10.1.1.0/24
的閘道器10.1.1.1
,封裝原來的資料的資料包,重新發給協議棧。 - 協議棧再根據本地路由,將這個資料包從
eth0
發出。
後續步驟,當 10.1.1.1
收到資料包後,會進行解封裝,讀取裡面的原始資料包,繼而轉發給本地的主機 192.168.1.1
。當接收回包時,也遵循同樣的流程。
在這個流程中,應用程式 B 的作用其實是利用 tun0
對資料包做了一層隧道封裝。其實 tun
裝置的最大用途就是用於隧道通訊的。
tap/tun 的區別
看到這裡,你可能還不大明白 tap/tun 的區別。
tap 和 tun 雖然都是虛擬網路裝置,但它們的工作層次還不太一樣。
- tap 是一個二層裝置(或者乙太網裝置),只能處理二層的乙太網幀;
- tun 是一個點對點的三層裝置(或網路層裝置),只能處理三層的 IP 資料包。
tap/tun 的應用
從上面的資料流程中可以看到, tun
裝置充當了一層隧道,所以,tap/tun 最常見的應用也就是用於隧道通訊,比如 VPN,包括 tunnel 和應用層的 IPsec 等,其中比較有名的兩個開源專案是 openvpn 和 VTun 。
總結
tun/tap 虛擬網絡卡,對應於物理網絡卡,如 eth0。
tun/tap 驅動包括字元裝置驅動和網絡卡驅動。
tun/tap 常用於隧道通訊。
我的公眾號 CloudDeveloper(ID: cloud_dev) ,號內有大量書籍和視訊資源,後臺回覆 「1024」 即可領取,分享的內容包括但不限於雲端計算虛擬化、容器、OpenStack、K8S、霧計算、網路、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++程式設計技術等內容,歡迎大家關注。