【转】TUN/TAP虚拟网络设备
轉(zhuǎn): 原文:https://www.cnblogs.com/wyzhou/p/9286864.html
-------------------------------------------------------
TUN/TAP虛擬網(wǎng)絡(luò)設(shè)備為用戶空間程序提供了網(wǎng)絡(luò)數(shù)據(jù)包的發(fā)送和接收能力。他既可以當(dāng)做點(diǎn)對(duì)點(diǎn)設(shè)備(TUN),也可以當(dāng)做以太網(wǎng)設(shè)備(TAP)。
TUN/TAP虛擬網(wǎng)絡(luò)設(shè)備的原理:
在Linux內(nèi)核中添加了一個(gè)TUN/TAP虛擬網(wǎng)絡(luò)設(shè)備的驅(qū)動(dòng)程序和一個(gè)與之相關(guān)連的字符設(shè)備/dev/net/tun,字符設(shè)備tun作為用戶空間和內(nèi)核空間交換數(shù)據(jù)的接口。當(dāng)內(nèi)核將數(shù)據(jù)包發(fā)送到虛擬網(wǎng)絡(luò)設(shè)備時(shí),數(shù)據(jù)包被保存在設(shè)備相關(guān)的一個(gè)隊(duì)列中,直到用戶空間程序通過(guò)打開的字符設(shè)備tun的描述符讀取時(shí),它才會(huì)被拷貝到用戶空間的緩沖區(qū)中,其效果就相當(dāng)于,數(shù)據(jù)包直接發(fā)送到了用戶空間。通過(guò)系統(tǒng)調(diào)用write發(fā)送數(shù)據(jù)包時(shí)其原理與此類似。
1、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è)備是如何工作的:
圖中的eth0是主機(jī)已有的真實(shí)的網(wǎng)卡接口 (interface)。
網(wǎng)卡接口eth0所代表的真實(shí)網(wǎng)卡通過(guò)網(wǎng)線(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é)議??梢赃x擇轉(zhuǎn)發(fā);
而對(duì)于確實(shí)是傳遞給本機(jī)的數(shù)據(jù)包,而且該數(shù)據(jù)包確實(shí)被上層的應(yīng)用所需要,協(xié)議棧會(huì)通過(guò)Socket API告知上層正在等待的應(yīng)用程序。
下面看看TUN的工作方式:
我們知道,普通的網(wǎng)卡是通過(guò)網(wǎng)線來(lái)收發(fā)數(shù)據(jù)包的話,而TUN設(shè)備比較特殊,它通過(guò)一個(gè)設(shè)備文件(/dev/tunX)收發(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之類的系統(tǒng)調(diào)用將數(shù)據(jù)寫入該文件,這些數(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之類的系統(tǒng)調(diào)用,經(jīng)由文件/dev/tunX讀取到協(xié)議棧向tunX傳遞的所有數(shù)據(jù)包。
協(xié)議棧可以像操縱普通網(wǎng)卡一樣來(lái)操縱tunX所代表的虛擬網(wǎng)卡:
比如,給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地址沒有任何意義。
如果是tapX的話,在協(xié)議棧的眼中,tapX和真是網(wǎng)卡沒有任何區(qū)別?。。?!
示例:
Tun/Tap都是虛擬網(wǎng)卡,沒有直接映射到物理網(wǎng)卡,是一種純軟件的實(shí)現(xiàn)。Tun是三層虛擬設(shè)備,能夠處理三層即IP包,Tap是二層設(shè)備,能處理鏈路層網(wǎng)絡(luò)包如以太網(wǎng)包。使用虛擬網(wǎng)絡(luò)設(shè)備,可以實(shí)現(xiàn)隧道,如OpenVPN的實(shí)現(xiàn)。
上面的圖中,左右兩邊分別為兩臺(tái)機(jī)器。一臺(tái)有一塊物理網(wǎng)卡配置了IP:172.16.1.11,這臺(tái)機(jī)器的系統(tǒng)里有一個(gè)Tun(以Tun為例,不講Tap了)設(shè)備,配置了IP:192.168.1.11; 另一臺(tái)的一塊物理網(wǎng)卡配置了IP:172.16.1.12,系統(tǒng)里有一個(gè)Tun設(shè)備并配置了IP:192.168.1.12。
左邊Linux系統(tǒng)里有一個(gè)Application,綁定到端口地址為: 192.168.1.11:5000,右邊Linux也有一個(gè)Application,綁定到端口地址為:192.168.1.12:5000,顯然它們綁定的都是Tun設(shè)備的IP,接著它們就通過(guò)這兩個(gè)地址通信了。
假設(shè)左邊的Application要給右邊的Application發(fā)送一個(gè)數(shù)據(jù)包,流程是這樣的:
左邊的Application并不知道什么虛擬網(wǎng)絡(luò)設(shè)備,它只知道往"192.168.1.12:5000"這個(gè)地址發(fā)送,左邊主機(jī)系統(tǒng)首先按正常的發(fā)包過(guò)程處理,比如判斷目的主機(jī)是不是位于同一網(wǎng)段等等,然后數(shù)據(jù)包就在Linux的網(wǎng)絡(luò)協(xié)議棧中穿行。Tun設(shè)備并不是真實(shí)的物理網(wǎng)卡,它不知道把數(shù)據(jù)包往哪里送,但是這些經(jīng)過(guò)了Linux網(wǎng)絡(luò)協(xié)議棧的數(shù)據(jù)可以從Tun設(shè)備的文件描述符中讀取到,圖中的“User Program”就是監(jiān)聽這個(gè)描述符等待讀取數(shù)據(jù)的。這個(gè)“User Program”程序綁定的端口地址是:172.16.1.11:6000,每當(dāng)它從Tun設(shè)備讀到數(shù)據(jù)的時(shí)候,就把這些數(shù)據(jù)從物理網(wǎng)卡發(fā)送出去,目標(biāo)地址是右邊的:172.168.1.12:6000。
數(shù)據(jù)到達(dá)右邊的系統(tǒng),經(jīng)過(guò)網(wǎng)絡(luò)協(xié)議棧之后到達(dá)“User Program”應(yīng)用進(jìn)程,“User Program”將接收到的數(shù)據(jù)往Tun設(shè)備對(duì)應(yīng)的文件描述符寫入。對(duì)于Tun設(shè)備來(lái)說(shuō),“寫入”就像是物理網(wǎng)卡接受到數(shù)據(jù)包一樣,因此這些接收到的數(shù)據(jù)又進(jìn)入了Linux的網(wǎng)絡(luò)協(xié)議棧,最終到達(dá)右邊的Application。
這里的Application是指各種各樣的用戶程序,如ping工具。“User Program”是用來(lái)輔助Tun設(shè)備來(lái)實(shí)現(xiàn)隧道功能的,可以想象成是OpenVPN進(jìn)程,沒有它隧道就廢了?。。?!
2、TAP設(shè)備
如圖所示,當(dāng)備一個(gè) TAP 設(shè)被創(chuàng)建時(shí),在 Linux 設(shè)備文件目錄下將會(huì)生成一個(gè)對(duì)應(yīng) char 設(shè)備,用戶程序可以像打開普通文件一樣打開這個(gè)文件進(jìn)行讀寫。
當(dāng)執(zhí)行write()操作時(shí),數(shù)據(jù)進(jìn)入 TAP 設(shè)備,此時(shí)對(duì)于 Linux 網(wǎng)絡(luò)層來(lái)說(shuō),相當(dāng)于 TAP 設(shè)備收到了一包數(shù)據(jù),請(qǐng)求內(nèi)核接受它,如同普通的物理網(wǎng)卡從外界收到一包數(shù)據(jù)一樣,不同的是其實(shí)數(shù)據(jù)來(lái)自 Linux 上的一個(gè)用戶程序。Linux 收到此數(shù)據(jù)后將根據(jù)網(wǎng)絡(luò)配置進(jìn)行后續(xù)處理,從而完成了用戶程序向 Linux 內(nèi)核網(wǎng)絡(luò)層注入數(shù)據(jù)的功能。
當(dāng)用戶程序執(zhí)行read()請(qǐng)求時(shí),相當(dāng)于向內(nèi)核查詢 TAP 設(shè)備上是否有需要被發(fā)送出去的數(shù)據(jù),有的話取出到用戶程序里,完成 TAP 設(shè)備的發(fā)送數(shù)據(jù)功能。
針對(duì) TAP 設(shè)備的一個(gè)形象的比喻是:
使用 TAP 設(shè)備的應(yīng)用程序相當(dāng)于另外一臺(tái)計(jì)算機(jī),TAP 設(shè)備是本機(jī)的一個(gè)網(wǎng)卡,他們之間相互連接。應(yīng)用程序通過(guò) read()/write()操作,和本機(jī)網(wǎng)絡(luò)核心進(jìn)行通訊。
TAP設(shè)備與TUN設(shè)備工作方式完全相同,區(qū)別在于:
1)TUN設(shè)備是點(diǎn)對(duì)點(diǎn)的三層設(shè)備,處理IP分組,它只模擬到了IP層,即網(wǎng)絡(luò)層 我們可以通過(guò)/dev/tunX文件收發(fā)IP層數(shù)據(jù)包,它無(wú)法與物理網(wǎng)卡做bridge,但是可以通過(guò)三層交換(如ip_forward)與物理網(wǎng)卡連通??梢允褂胕fconfig等命令給該設(shè)備設(shè)定IP地址。
2)TAP設(shè)備是一個(gè)二層虛擬以太網(wǎng)設(shè)備,處理以太網(wǎng)幀,它比TUN更加深入,通過(guò)/dev/tapX文件可以收發(fā)MAC層數(shù)據(jù)包,即數(shù)據(jù)鏈路層,擁有MAC層功能,可以與物理網(wǎng)卡做bridge,支持MAC層廣播。同樣的,我們也可以通過(guò)ifconfig等命令給該設(shè)備設(shè)定IP地址,還可以給它設(shè)定MAC地址。
3)
TAP:子網(wǎng)掩碼是/24,255.255.255.0,對(duì)應(yīng)以太網(wǎng)設(shè)備
TUN:子網(wǎng)掩碼是/30,255.255.255.252,點(diǎn)對(duì)點(diǎn)設(shè)備。
4)設(shè)備節(jié)點(diǎn)號(hào)不同:
2.4的核:TUN 設(shè)備號(hào)是36 16+,文件節(jié)點(diǎn):/dev/tun0
2.6的核:TUN 設(shè)備號(hào)是10 200,文件節(jié)點(diǎn):/dev/net/tun
OSI模型中的七層:
第一層是物理層
第二層是數(shù)據(jù)鏈路層(tap設(shè)備)
第三層是網(wǎng)絡(luò)層(tun設(shè)備)
第四層是傳輸層
第五層是會(huì)話層
第六層是表示層
第七層是應(yīng)用層
3、VETH
VETH 設(shè)備出現(xiàn)較早,它的作用是反轉(zhuǎn)通訊數(shù)據(jù)的方向,需要發(fā)送的數(shù)據(jù)會(huì)被轉(zhuǎn)換成需要收到的數(shù)據(jù),重新送入內(nèi)核網(wǎng)絡(luò)層進(jìn)行處理,從而間接的完成數(shù)據(jù)的注入。
VETH 設(shè)備總是成對(duì)出現(xiàn),送到一端請(qǐng)求發(fā)送的數(shù)據(jù)總是從另一端以請(qǐng)求接受的形式出現(xiàn)。
該設(shè)備不能被用戶程序直接操作,但使用起來(lái)比較簡(jiǎn)單。創(chuàng)建并配置正確后,向其一端輸入數(shù)據(jù),VETH 會(huì)改變數(shù)據(jù)的方向并將其送入內(nèi)核網(wǎng)絡(luò)核心,完成數(shù)據(jù)的注入。在另一端能讀到此數(shù)據(jù)
veth、tun、tap比對(duì)
總結(jié)
以上是生活随笔為你收集整理的【转】TUN/TAP虚拟网络设备的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 游戏中的过程生成——元胞自动机 Cell
- 下一篇: Qt之生成pdf(转)