本文首發於我的公眾號 Linux雲計算網絡(id: cloud_dev),專注於干貨分享,號內有 10T 書籍和視頻資源,后台回復「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 常用於隧道通信。
我的公眾號 「Linux雲計算網絡」(id: cloud_dev) ,號內有 10T 書籍和視頻資源,后台回復 「1024」 即可領取,分享的內容包括但不限於 Linux、網絡、雲計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術等內容,歡迎大家關注。