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

TUN/TAP設(shè)備淺析

TUN設(shè)備

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

先來看看物理設(shè)備是如何工作的:

tun設(shè)備

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

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

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

下面看看 TUN 的工作方式:

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

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

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

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

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

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

udp vpn

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

TAP設(shè)備

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

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

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

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

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容