TUN/TAP设备浅析(一) -- 原理浅析
TUN/TAP設(shè)備淺析
TUN設(shè)備
TUN 設(shè)備是一種虛擬網(wǎng)絡(luò)設(shè)備,通過(guò)此設(shè)備,程序可以方便地模擬網(wǎng)絡(luò)行為。TUN 模擬的是一個(gè)三層設(shè)備,也就是說(shuō),通過(guò)它可以處理來(lái)自網(wǎng)絡(luò)層的數(shù)據(jù),更通俗一點(diǎn)的說(shuō),通過(guò)它,我們可以處理 IP 數(shù)據(jù)包。
先來(lái)看看物理設(shè)備是如何工作的:
tun設(shè)備
上圖中的 eth0 表示我們主機(jī)已有的真實(shí)的網(wǎng)卡接口 (interface)。
網(wǎng)卡接口 eth0 所代表的真實(shí)網(wǎng)卡通過(guò)網(wǎng)線(xiàn)(wire)和外部網(wǎng)絡(luò)相連,該物理網(wǎng)卡收到的數(shù)據(jù)包會(huì)經(jīng)由接口 eth0 傳遞給內(nèi)核的網(wǎng)絡(luò)協(xié)議棧(Network Stack)。然后協(xié)議棧對(duì)這些數(shù)據(jù)包進(jìn)行進(jìn)一步的處理。
對(duì)于一些錯(cuò)誤的數(shù)據(jù)包,協(xié)議棧可以選擇丟棄;對(duì)于不屬于本機(jī)的數(shù)據(jù)包,協(xié)議棧可以選擇轉(zhuǎn)發(fā);而對(duì)于確實(shí)是傳遞給本機(jī)的數(shù)據(jù)包,而且該數(shù)據(jù)包確實(shí)被上層的應(yīng)用所需要,協(xié)議棧會(huì)通過(guò) Socket API 告知上層正在等待的應(yīng)用程序。
下面看看 TUN 的工作方式:
數(shù)據(jù)包處理過(guò)程
01_UDP_VPN.png
我們知道,普通的網(wǎng)卡是通過(guò)網(wǎng)線(xiàn)來(lái)收發(fā)數(shù)據(jù)包的話(huà),而 TUN 設(shè)備比較特殊,它通過(guò)一個(gè)文件收發(fā)數(shù)據(jù)包。
如上圖所示,tunX 和上面的 eth0 在邏輯上面是等價(jià)的, tunX 也代表了一個(gè)網(wǎng)絡(luò)接口,雖然這個(gè)接口是系統(tǒng)通過(guò)軟件所模擬出來(lái)的.
網(wǎng)卡接口 tunX 所代表的虛擬網(wǎng)卡通過(guò)文件 /dev/tunX 與我們的應(yīng)用程序(App) 相連,應(yīng)用程序每次使用 write 之類(lèi)的系統(tǒng)調(diào)用將數(shù)據(jù)寫(xiě)入該文件,這些數(shù)據(jù)會(huì)以網(wǎng)絡(luò)層數(shù)據(jù)包的形式,通過(guò)該虛擬網(wǎng)卡,經(jīng)由網(wǎng)絡(luò)接口 tunX 傳遞給網(wǎng)絡(luò)協(xié)議棧,同時(shí)該應(yīng)用程序也可以通過(guò) read 之類(lèi)的系統(tǒng)調(diào)用,經(jīng)由文件 /dev/tunX 讀取到協(xié)議棧向 tunX 傳遞的所有數(shù)據(jù)包。
此外,協(xié)議棧可以像操縱普通網(wǎng)卡一樣來(lái)操縱 tunX 所代表的虛擬網(wǎng)卡。比如說(shuō),給 tunX 設(shè)定 IP 地址,設(shè)置路由,總之,在協(xié)議棧看來(lái),tunX 所代表的網(wǎng)卡和其他普通的網(wǎng)卡區(qū)別不大,當(dāng)然,硬要說(shuō)區(qū)別,那還是有的,那就是 tunX 設(shè)備不存在 MAC 地址,這個(gè)很好理解,tunX 只模擬到了網(wǎng)絡(luò)層,要 MAC地址沒(méi)有任何意義。當(dāng)然,如果是 tapX 的話(huà),在協(xié)議棧的眼中,tapX 和真是網(wǎng)卡沒(méi)有任何區(qū)別。
如果我們使用 TUN 設(shè)備搭建一個(gè)基于 UDP 的 VPN ,那么整個(gè)處理過(guò)程可能是這幅樣子:
udp vpn
首先,我們的應(yīng)用程序通過(guò) eth0 和遠(yuǎn)程的 UDP 程序相連,對(duì)方傳遞過(guò)來(lái)的 UDP 數(shù)據(jù)包經(jīng)由左邊的協(xié)議棧傳遞給了應(yīng)用程序,UDP 數(shù)據(jù)包的內(nèi)容其實(shí)是一個(gè)網(wǎng)絡(luò)層的數(shù)據(jù)包,比如說(shuō) IP 數(shù)據(jù)報(bào),應(yīng)用程序接收到該數(shù)據(jù)包的數(shù)據(jù)(剝除了各種頭部之后的 UDP 數(shù)據(jù))之后,然后進(jìn)行一定的處理,處理完成后將處理后的數(shù)據(jù)寫(xiě)入文件 /dev/tunX,這樣,數(shù)據(jù)會(huì)第二次到達(dá)協(xié)議棧。需要注意的是,上圖中繪制的兩個(gè)協(xié)議棧其實(shí)是同一個(gè)協(xié)議棧,之所以這么畫(huà)是為了敘述的方便。
TAP設(shè)備
TAP 設(shè)備與 TUN 設(shè)備工作方式完全相同,區(qū)別在于:
最后,關(guān)于文章中出現(xiàn)的二層,三層,我這里說(shuō)明一下,第一層是物理層,第二層是數(shù)據(jù)鏈路層,第三層是網(wǎng)絡(luò)層,第四層是傳輸層。
參考文章:
[1]. https://blog.kghost.info/2013/03/27/linux-network-tun/
?
總結(jié)
以上是生活随笔為你收集整理的TUN/TAP设备浅析(一) -- 原理浅析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一步步编写操作系统 79 在c代码中内联
- 下一篇: 全球唯一一款!谷歌Pixel 4被科学家