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

TUN/TAP設備淺析

TUN設備

TUN 設備是一種虛擬網(wǎng)絡設備,通過此設備,程序可以方便地模擬網(wǎng)絡行為。TUN 模擬的是一個三層設備,也就是說,通過它可以處理來自網(wǎng)絡層的數(shù)據(jù),更通俗一點的說,通過它,我們可以處理 IP 數(shù)據(jù)包。

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

tun設備

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

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

對于一些錯誤的數(shù)據(jù)包,協(xié)議??梢赃x擇丟棄;對于不屬于本機的數(shù)據(jù)包,協(xié)議??梢赃x擇轉發(fā);而對于確實是傳遞給本機的數(shù)據(jù)包,而且該數(shù)據(jù)包確實被上層的應用所需要,協(xié)議棧會通過 Socket API 告知上層正在等待的應用程序。

下面看看 TUN 的工作方式:

數(shù)據(jù)包處理過程
01_UDP_VPN.png

我們知道,普通的網(wǎng)卡是通過網(wǎng)線來收發(fā)數(shù)據(jù)包的話,而 TUN 設備比較特殊,它通過一個文件收發(fā)數(shù)據(jù)包。

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

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

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

如果我們使用 TUN 設備搭建一個基于 UDPVPN ,那么整個處理過程可能是這幅樣子:

udp vpn

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

TAP設備

TAP 設備與 TUN 設備工作方式完全相同,區(qū)別在于:

  1. TUN 設備是一個三層設備,它只模擬到了 IP 層,即網(wǎng)絡層 我們可以通過 /dev/tunX 文件收發(fā) IP 層數(shù)據(jù)包,它無法與物理網(wǎng)卡做 bridge,但是可以通過三層交換(如 ip_forward)與物理網(wǎng)卡連通??梢允褂?code>ifconfig之類的命令給該設備設定 IP 地址。
  2. TAP 設備是一個二層設備,它比 TUN 更加深入,通過 /dev/tapX 文件可以收發(fā) MAC 層數(shù)據(jù)包,即數(shù)據(jù)鏈路層,擁有 MAC 層功能,可以與物理網(wǎng)卡做 bridge,支持 MAC 層廣播。同樣的,我們也可以通過ifconfig之類的命令給該設備設定 IP 地址,你如果愿意,我們可以給它設定 MAC 地址。

最后,關于文章中出現(xiàn)的二層,三層,我這里說明一下,第一層是物理層,第二層是數(shù)據(jù)鏈路層,第三層是網(wǎng)絡層,第四層是傳輸層。

參考文章:
[1]. https://blog.kghost.info/2013/03/27/linux-network-tun/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容