TUN/TAP設備淺析(一) -- 原理淺析

TUN/TAP設備淺析
TUN設備
TUN 設備是一種虛擬網絡設備,通過此設備,程序可以方便地模擬網絡行爲。TUN 模擬的是一個三層設備,也就是說,通過它可以處理來自網絡層的數據,更通俗一點的說,通過它,我們可以處理 IP 數據包。

先來看看物理設備是如何工作的:

上圖中的 eth0 表示我們主機已有的真實的網卡接口 (interface)。

網卡接口 eth0 所代表的真實網卡通過網線(wire)和外部網絡相連,該物理網卡收到的數據包會經由接口 eth0 傳遞給內核的網絡協議棧(Network Stack)。然後協議棧對這些數據包進行進一步的處理。

對於一些錯誤的數據包,協議棧可以選擇丟棄;對於不屬於本機的數據包,協議棧可以選擇轉發;而對於確實是傳遞給本機的數據包,而且該數據包確實被上層的應用所需要,協議棧會通過 Socket API 告知上層正在等待的應用程序。

下面看看 TUN 的工作方式:

我們知道,普通的網卡是通過網線來收發數據包的話,而 TUN 設備比較特殊,它通過一個文件收發數據包。

如上圖所示,tunX 和上面的 eth0 在邏輯上面是等價的, tunX 也代表了一個網絡接口,雖然這個接口是系統通過軟件所模擬出來的.

網卡接口 tunX 所代表的虛擬網卡通過文件 /dev/tunX 與我們的應用程序(App) 相連,應用程序每次使用 write 之類的系統調用將數據寫入該文件,這些數據會以網絡層數據包的形式,通過該虛擬網卡,經由網絡接口 tunX 傳遞給網絡協議棧,同時該應用程序也可以通過 read 之類的系統調用,經由文件 /dev/tunX 讀取到協議棧向 tunX 傳遞的所有數據包。

此外,協議棧可以像操縱普通網卡一樣來操縱 tunX 所代表的虛擬網卡。比如說,給 tunX 設定 IP 地址,設置路由,總之,在協議棧看來,tunX 所代表的網卡和其他普通的網卡區別不大,當然,硬要說區別,那還是有的,那就是 tunX 設備不存在 MAC 地址,這個很好理解,tunX 只模擬到了網絡層,要 MAC地址沒有任何意義。當然,如果是 tapX 的話,在協議棧的眼中,tapX 和真是網卡沒有任何區別。

如果我們使用 TUN 設備搭建一個基於 UDP 的 VPN ,那麼整個處理過程可能是這幅樣子:

首先,我們的應用程序通過 eth0 和遠程的 UDP 程序相連,對方傳遞過來的 UDP 數據包經由左邊的協議棧傳遞給了應用程序,UDP 數據包的內容其實是一個網絡層的數據包,比如說 IP 數據報,應用程序接收到該數據包的數據(剝除了各種頭部之後的 UDP 數據)之後,然後進行一定的處理,處理完成後將處理後的數據寫入文件 /dev/tunX,這樣,數據會第二次到達協議棧。需要注意的是,上圖中繪製的兩個協議棧其實是同一個協議棧,之所以這麼畫是爲了敘述的方便。

TAP設備
TAP 設備與 TUN 設備工作方式完全相同,區別在於:

TUN 設備是一個三層設備,它只模擬到了 IP 層,即網絡層 我們可以通過 /dev/tunX 文件收發 IP 層數據包,它無法與物理網卡做 bridge,但是可以通過三層交換(如 ip_forward)與物理網卡連通。可以使用ifconfig之類的命令給該設備設定 IP 地址。
TAP 設備是一個二層設備,它比 TUN 更加深入,通過 /dev/tapX 文件可以收發 MAC 層數據包,即數據鏈路層,擁有 MAC 層功能,可以與物理網卡做 bridge,支持 MAC 層廣播。同樣的,我們也可以通過ifconfig之類的命令給該設備設定 IP 地址,你如果願意,我們可以給它設定 MAC 地址。
最後,關於文章中出現的二層,三層,我這裏說明一下,第一層是物理層,第二層是數據鏈路層,第三層是網絡層,第四層是傳輸層。

參考文章: 
[1]. https://blog.kghost.info/2013/03/27/linux-network-tun/
--------------------- 
作者:lishuhuakai 
來源:CSDN 
原文:https://blog.csdn.net/lishuhuakai/article/details/73136442 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章