




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
0018-0018-使?tun虛擬?絡(luò)接?建?IP隧道的實例-WrittenbyPAGEPAGE10/使?tun虛擬?絡(luò)接?建?IPWrittenby通常的socket編程,?對的都是物理?卡,Linux下其實很容易創(chuàng)建虛擬?卡;本?簡單介紹?下Linux?卡的概念,并以tun設(shè)備為例在客?端和服務(wù)器端分別建??個實際的虛擬?卡,最終實現(xiàn)?個從客?端服務(wù)器的簡單的IP隧道,希望本?能對理解虛擬?卡和IP隧道有所幫助,本?將提供完整的源程序;閱讀本?需要具備在Linux下使?C語?進(jìn)?IPv4下socket編程的基本能?,本?對?絡(luò)編程的初學(xué)者難度較?Linux下的虛擬?卡TAP等同于?個以太?設(shè)備,它操作OSI模型的第?層(數(shù)據(jù)鏈路層)數(shù)據(jù)包,通常我們所使?的?絡(luò)就是以?數(shù)據(jù)幀,所以要使?TAP設(shè)備,就需要??構(gòu)建以太?報頭、IP報頭、TCP/UDP報頭Linux通過TUN/TAP設(shè)備向綁定該設(shè)備的??空間的應(yīng)?程序發(fā)送數(shù)據(jù);同樣,??空間的應(yīng)?程序也可以像操作硬件?絡(luò)設(shè)備那樣,通過TUN/TAP設(shè)備發(fā)送數(shù)據(jù);在后?這種情況下,TUN/TAP設(shè)備向Linux的?棧提交數(shù)據(jù)包,從?模擬從外部接收數(shù)據(jù)的過程;構(gòu)建?個TUN上?節(jié)的描述顯然過于枯燥,可能會對初次接觸虛擬?卡的讀者感到困惑,不知所云,本節(jié)將實際建tun設(shè)備,幫助你?構(gòu)建?個基本的tun設(shè)備,只需要兩個intintfd=open("/dev/net/tun",向Linux內(nèi)核注冊?個tun設(shè)備名稱,本例中為\h(structifreq)定義在頭?件<linux/if.h>中,在我的很多?章中都有介紹,?如?章《如\h?rawsocket發(fā)送UDP報?》,如果需要,可以參考structstructifreqifr;memset(&ifr,0,sizeof(ifr));ifr.ifr_flags=IFF_TUN|IFF_NO_PI;strcpy(ifr.ifr_name,"tun0");ioctl(fd,TUNSETIFF,(void編寫處理tun0接收/發(fā)送數(shù)charcharwhile(1)read(fd,buffer,//}為設(shè)備分配IP地址(本例中為tun0分配的IP為sudosudoifconfigtun0netmask\h這段程序在進(jìn)?循環(huán)前增加了system("ifconfigtun0/24up",為tun0分配了IP地址gcc-Walltun-01.c-otun-該程序需要root權(quán)限運(yùn)?,主要是因為其中使?了ioctl,運(yùn)?sudo./tun-運(yùn)?該程序,會構(gòu)建?個tun設(shè)備,打開?個新的終端,使
將可以看到系統(tǒng)中多了?個虛擬route-絡(luò)接?tun0,使 查看路由也會看到增加了?條關(guān)于tun0設(shè)備的路route-圖1:構(gòu)建?個tun設(shè)備盡管建?起了虛擬?卡tun0,但因為程序過于簡單,所以這樣建?的設(shè)備什么事情都做不了,必序,才能讓這個設(shè)備真正地發(fā)揮作?;tun設(shè)備是?個第三層(?絡(luò)層)的設(shè)備,在這個設(shè)備上只能收到IP報頭,收不到以太?報頭,所以Linux有為tun設(shè)備分配MAC地址;后?將以本節(jié)的程序為基礎(chǔ),不斷改進(jìn),最終寫出?個簡單的IP使?tun設(shè)備的基本數(shù)據(jù)流設(shè)備建?起來以后,程序員關(guān)?的是我們?nèi)绾螐倪@個設(shè)備上收發(fā)報?,如何處理這些報?對于?個物理?絡(luò)接???,接??端連接著?絡(luò)協(xié)議棧,另?端連接著物理?絡(luò);?對于?個虛擬????,接?的?端仍然連接著?絡(luò)協(xié)議棧,但是另?端連接著?個應(yīng)?程序,也就是我們前?下載的那程序\htun-01.),我們把這個程序稱為application-tu;可以和?個物理?絡(luò)接??較來說明虛擬?絡(luò)接?的數(shù)據(jù)流向,在物理接?上要發(fā)送到物理?絡(luò)上去?,相對于虛擬接?將被發(fā)送到應(yīng)?程序application-tun上route-當(dāng)我們使?socket發(fā)送報?時,報?被提交給Linux的?絡(luò)協(xié)議棧,協(xié)議棧為報?封裝各個協(xié)議層的報頭根據(jù)路由表將報?交給相應(yīng)設(shè)備的驅(qū)動程序,?如enp0s3的驅(qū)動程序,然后由驅(qū)動程序?qū)?發(fā)送到物理?絡(luò)上(物理設(shè)備),或者發(fā)送給應(yīng)?程序application-tun(虛擬設(shè)備);route-在上?節(jié)中,我們使
已經(jīng)看到了關(guān)于tun0設(shè)備的路由內(nèi)????標(biāo)躍引使接00U000U00U00路由表明,當(dāng)?的IP地址為10.0.0.x時,報?將被送到虛擬設(shè)備tun0的驅(qū)動程序上去,該設(shè)備綁定的IP還有?條路由,當(dāng)?的IP地址為192.168.2.x時,報?將被送到物理設(shè)備enp0s3的驅(qū)動程序上去的IP為14;發(fā)送報?到物理/虛擬接?綁定的IP地址當(dāng)我們發(fā)送?個UDP報?到14:567(也就是本機(jī)物理設(shè)備enp0s3的IP)時,根據(jù)路由,報被送給enp0s3的驅(qū)動程序,驅(qū)動程序并不會把這個報?發(fā)送到物理?絡(luò)上,因為enp0s3的驅(qū)動程序已經(jīng)是這個報?最終的?的地,所以enp0s3的驅(qū)動程序會將這個報?發(fā)到?個正在監(jiān)聽14:5678的??程序上,如果我們沒有編寫這個程序,報?將被丟棄,這樣我們就收不到這個報?;當(dāng)我們發(fā)送?個UDP報?到:567(也就是本機(jī)虛擬設(shè)備tun0的IP)時,根據(jù)路由,報?被送給tun0的驅(qū)動程序,驅(qū)動程序并不會把這個報?發(fā)送到application-tun上,因為tun0的驅(qū)動程序已經(jīng)是這個報?的最終?的地,所以tun0的驅(qū)動程序會將這個報?發(fā)到?個正在監(jiān)聽:5678的??上,和物理設(shè)備?樣,如果我們沒有編寫這個程序,報?將被丟棄,我們收不到這個報?;圖2:發(fā)送報?到tun0的IP發(fā)送報?到符合路由的其他IP地址當(dāng)我們發(fā)送?個UDP報?12:5678時,根據(jù)路由報?會被送給enp0s3的驅(qū)動程序,驅(qū)動當(dāng)我們發(fā)送?個UDP報?到:5678時,根據(jù)路由報?會被送給報?被送給tun0的驅(qū)動動程序會把這個報?發(fā)送到應(yīng)?程序application-tun上;圖3:發(fā)送報?到符合tun0路由的其他IP對上述說明可以做?個打開終端,運(yùn)?前?的程序:tun-sudosudo./tun-打開另?個終端,使?下?命令分別向:5678發(fā)送數(shù)據(jù),在運(yùn)?tun-01的終端上并不會到數(shù)據(jù);echoecho"hello">使?下?命令分別向:5678發(fā)送數(shù)據(jù),在運(yùn)?tun-01的終端上會顯?收到數(shù)echoecho"hello">源IP當(dāng)我們在電腦系統(tǒng)上運(yùn)
sudo./tun-時,我們的系統(tǒng)就有了兩個IP地址,?個是物理?sudo./tun-為14,另?個是虛擬?卡的,IP為當(dāng)我們在做上?的測試時,我們
echo我們并沒有指定源IP地址,那么發(fā)出的消息的源IP地址是什么呢?14還是echo\hgcc-Walltun-02.c-otun-02下?我們做個測試,向:5678發(fā)送?條UDP消息,我們看看源IP地址是什么?sudosudo./tun-打開另?個終端,向發(fā)echoecho"hello">在運(yùn)?tun-02的終端上顯?出源IP地址為圖4:Linux在多?卡環(huán)境下選擇源當(dāng)使?sendmsg()發(fā)送數(shù)據(jù)時,是可以顯式地指定源IP路由表中有?個src字段,當(dāng)沒有指定源IP地址時,將使?選定路由的src字段作為源IP地址,使可以看到src字段圖5:iproute命令顯?路由表中src使?tun設(shè)備搭建?個簡單的IPIP報?其實是指:IP報頭+TCP/UDP報頭+數(shù)所謂IP隧道是指把?個IP報?作為數(shù)據(jù)再封裝?個TCP頭和IP頭,所以整個報?變成:IP報+TCP報+?于IP隧道的意義、應(yīng)?場景之類的,本?不予討論,可以??去百個度或者?個歌查?下,本?將致?于?個簡單的IP先看?張?有兩臺電腦,ComputerA和ComputerBComputer物理?卡為enp0s3,綁定ComputerB:物理?卡為enp0s3,綁定內(nèi)????標(biāo)躍引使接00U000U00U00照路由,這條報?會被送到tun0的驅(qū)動程序上去,因為并不是computerA的虛擬?卡tun0綁定的地如何處理這個報?使其發(fā)送到computerB的appD上去呢?通常的?法就是在computerA和computerB的當(dāng)computerA啟動applition-tun時,主動發(fā)起向computerB的連接,端?號定為5678,computerB在啟動applition-tun時,主動偵聽在端?5678上,并等待computerA的連接請求,?旦連接建?,這個隧道就建了;computerA的application-tun收到發(fā)往的報?時,要在整個IP報?上再包裝上?個IP報頭+TCP報頭,TCP報頭中指定?的端?號為5678,IP報頭中指定?的IP為14,源IP為12,然把這個新報?從建?的隧道中發(fā)出;computerB上偵聽在5678端?上的應(yīng)?程序appC會收到這個報?,appC去掉IP報頭和TCP報頭,把數(shù)據(jù)部分作為?個完整的報?重新從socket發(fā)出,這個報?的內(nèi)容正是computerA發(fā)出的原始報?,computerB的在客?端(computerA)需要編寫?個程序,程序?件名:app-client.c,這個程序應(yīng)遵循以下/dev/net/tun?件,返回tun_fd,在內(nèi)核注冊創(chuàng)建socket,sock_fd,在這個sock_fd上連接服務(wù)器端(computerB)的5678端?,建?IP使?select檢查tun_fd和sock_fd,并分別處理在這兩個fd上收到的數(shù)在tun_fd上收到數(shù)將收到的包括IP報頭在內(nèi)的報?作為數(shù)據(jù)從sock_fd上發(fā)在sock_fd上收到數(shù)把收到的數(shù)據(jù)作為?個IP報?顯?報頭及內(nèi)在服務(wù)器端(computerB)編寫?個程序,?件名為:app-server.c,這個程序應(yīng)遵循以下/dev/net/tun?件,返回tun_fd,在內(nèi)核注冊創(chuàng)建socket,fd為sock_fd,在這個sock_fd上偵聽5678端?,等待客?端連接以建?IP接受客?端的連接請求,為新連接創(chuàng)建socket,fd為使?select檢查tun_fd和net_fd,并分別處理在這兩個fd上收到的數(shù)在tun_fd上收到數(shù)將收到的包括IP報頭在內(nèi)的報?作為數(shù)據(jù)從net_fd上發(fā)在net_fd上收到數(shù)\h客?端gccWallapp-client.coapp-服務(wù)器端程序:\happ-server.c(點(diǎn)擊?件名下載源程序服務(wù)器端gccWallapp-server.coapp-daemon(0,為了運(yùn)??便,也可以將這兩個程序?qū)懗墒刈o(hù)進(jìn)程,將程序中注釋請根據(jù)實際情況調(diào)整程序中的宏定義,SERVER_IP和TUN_IP;daemon(0,客?端
放開即可需要打開三個終端窗??先將程序中的SERVER_IP改為本機(jī)的IP地址,然后重新打開第?個終端,運(yùn)?nc-l5678,這個命令將監(jiān)聽本機(jī)的5678端?打開第?個終端,運(yùn)?客?端sudo./app-client,應(yīng)該顯?"Connectedtoserver?此時在第?個終端上應(yīng)該顯?"Receiveddatafromtun",在第?個終端上收到?些亂碼,但其中有"hello"字符串,亂碼是因為我們收到的數(shù)據(jù)包括IP報頭和UDP報頭,這兩部分是?進(jìn)制的數(shù)如果你看到的和上?的描述?致,那么你的客?端下?是截
圖7:測試客?端程序時的第?個終![screenshotof![screenshotof2ndterminalforclient<center><b>圖8:測試客?端程序時的第?個終端服務(wù)器端程序?需獨(dú)?IP需要兩臺機(jī)器,?臺做客?端,另?臺做服務(wù)器在服務(wù)器端和客?端均需要打開兩個終端,下?是測試?法?在服務(wù)器第?個終端上啟動服務(wù)器端
圖9:測試?sudo./app-sudo./app-在服務(wù)器第?個終端上執(zhí)?命令nc-luk1234,這個命令將?直監(jiān)聽在UDP的1234端?上;sudo./app-sudo./app-(服務(wù)器端的tun0綁定的IP)的UDP端?1234發(fā)送?客?端第?個終端上向:1234發(fā)送了?個UDP消息,內(nèi)容是最終在服務(wù)器端的第?個終端上收到了這個信息下?是運(yùn)?截圖10:服務(wù)器端第?個終圖11:客?端第?個終圖12:服務(wù)器端第?個終后
圖13:客?端第?個終我們實現(xiàn)了?個簡單的IP隧道,在這個IP隧道,我們傳送?個UDP報?,我們傳了?個UDP報TCP報?是為了省去connect()的?這樣?個IP隧道并不局限在局域?中,通過互聯(lián)??樣可以建??個IP我們的這個服務(wù)器端的程序僅處理了?個客?端的連接,如果我們允許多個客?端接?并建?多條IP隧道,果連接的多個客?端的tun都綁定在同?個?段上,那么通過服務(wù)器顯然是可以像局域??樣相互通信的,好像多個終端在?個局域???樣,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年全球智能算法行業(yè)概述及主流算法調(diào)研報告
- 膳食營養(yǎng)知識培訓(xùn)課件
- 無人機(jī)裝配知識培訓(xùn)課件
- 員工試用期轉(zhuǎn)正工作總結(jié)
- 銀行合規(guī)風(fēng)險員工工作總結(jié)(4篇)
- 公司職工試用協(xié)議書(7篇)
- 2025年教案設(shè)計:如何讓學(xué)生更好地理解《蜀道難》
- 商標(biāo)事務(wù)所知識培訓(xùn)課件
- DB31∕T 208-2014 小包裝蔬菜加工技術(shù)規(guī)范
- 2025年實驗室創(chuàng)新與五大要素培訓(xùn)實踐
- 三年級數(shù)學(xué)研課標(biāo)說教材課件
- 山西水庫壩坡混凝土施工方案(含冬季施工)
- 國資委建立和完善央企職工代表大會制度指導(dǎo)意見
- ktv地震應(yīng)急疏散預(yù)案
- 課題優(yōu)秀申報書課題申報書范例
- 《金融學(xué)講義》word版
- 給排水管道施工組織設(shè)計
- 2022年四川省瀘州市中考語文試題
- 食物之四氣五味
- GB/T 40529-2021船舶與海洋技術(shù)起貨絞車
- GB/T 14643.2-2009工業(yè)循環(huán)冷卻水中菌藻的測定方法第2部分:土壤菌群的測定平皿計數(shù)法
評論
0/150
提交評論