[原創] 詳解雲計算網絡底層技術——虛擬網絡設備 tap/tun 原理解析


本文首發於我的公眾號 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

設備文件即充當了用戶空間和內核空間通信的接口。當應用程序打開設備文件時,驅動程序就會創建並注冊相應的虛擬設備接口,一般以 tunXtapX 命名。當應用程序關閉文件時,驅動也會自動刪除 tunXtapX 設備,還會刪除已經建立起來的路由等信息。

tap/tun 設備文件就像一個管道,一端連接着用戶空間,一端連接着內核空間。當用戶程序向文件 /dev/net/tun/dev/tap0 寫數據時,內核就可以從對應的 tunXtapX 接口讀到數據,反之,內核可以通過相反的方式向用戶程序發送數據。

tap/tun 和網絡協議棧的數據傳輸

tap/tun 通過實現相應的網卡驅動程序來和網絡協議棧通信。一般的流程和物理網卡和協議棧的交互流程是一樣的,不同的是物理網卡一端是連接物理網絡,而 tap/tun 虛擬網卡一般連接到用戶空間。

如下圖的示意圖,我們有兩個應用程序 A、B,物理網卡 eth0 和虛擬網卡 tun0 分別配置 IP:10.1.1.11192.168.1.11,程序 A 希望構造數據包發往 192.168.1.0/24 網段的主機 192.168.1.1

基於上圖,我們看看數據包的流程:

  1. 應用程序 A 構造數據包,目的 IP 是 192.168.1.1,通過 socket A 將這個數據包發給協議棧。
  2. 協議棧根據數據包的目的 IP 地址,匹配路由規則,發現要從 tun0 出去。
  3. tun0 發現自己的另一端被應用程序 B 打開了,於是將數據發給程序 B.
  4. 程序 B 收到數據后,做一些跟業務相關的操作,然后構造一個新的數據包,源 IP 是 eth0 的 IP,目的 IP 是 10.1.1.0/24 的網關 10.1.1.1,封裝原來的數據的數據包,重新發給協議棧。
  5. 協議棧再根據本地路由,將這個數據包從 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 等,其中比較有名的兩個開源項目是 openvpnVTun

總結

tun/tap 虛擬網卡,對應於物理網卡,如 eth0。

tun/tap 驅動包括字符設備驅動和網卡驅動。

tun/tap 常用於隧道通信。


我的公眾號 「Linux雲計算網絡」(id: cloud_dev) ,號內有 10T 書籍和視頻資源,后台回復 「1024」 即可領取,分享的內容包括但不限於 Linux、網絡、雲計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術等內容,歡迎大家關注。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM