一種在使用虛擬網(wǎng)卡的Windows主機上綁定源IP的方法
【專利摘要】本發(fā)明公開了一種在使用虛擬網(wǎng)卡的Windows主機上綁定源IP的方法,該方法使用Windows的LSP技術(shù)動態(tài)的截獲發(fā)往虛擬網(wǎng)卡的數(shù)據(jù)包,將其源IP地址設(shè)定為一個非虛擬網(wǎng)卡的IP地址。該方法可以在不修改應(yīng)用程序的情況下為數(shù)據(jù)包綁定源IP地址。
【專利說明】—種在使用虛擬網(wǎng)卡的Windows主機上綁定源IP的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及網(wǎng)絡(luò)數(shù)據(jù)傳輸技術(shù),具體涉及在使用虛擬網(wǎng)卡的Windows主機上綁定源IP的技術(shù)。
【背景技術(shù)】
[0002]諸如Windows這類操作系統(tǒng)在不作路由器使用時,其數(shù)據(jù)包發(fā)送時的行為遵循RFCl 122定義的強主機模式,其具體流程如圖1所示。
[0003]這種方式簡化了用戶的配置,通過系統(tǒng)中的路由表來為IP數(shù)據(jù)報選擇一個源IP地址。
[0004]但強主機發(fā)送行為在和基于虛擬網(wǎng)卡的VPN —起使用時,會使通過VPN隧道的IP數(shù)據(jù)報喪失透明性,即遠(yuǎn)端接收主機收到的IP數(shù)據(jù)報的源IP地址將會是虛擬網(wǎng)卡的IP地址,要做到VPN隧道對用戶數(shù)據(jù)報的透明,遠(yuǎn)端接收主機收到的IP數(shù)據(jù)報的源IP地址必須為發(fā)送端主機在不通過VPN隧道時本來應(yīng)該經(jīng)由的物理網(wǎng)卡的IP地址。
[0005]展現(xiàn)上述這個問題的例子有很多,例如Cisco的VTI技術(shù)、著名的開源VPN實現(xiàn)-OpenVPN等等。
[0006]由此可見如在不修改應(yīng)用程序的情況下為數(shù)據(jù)包綁定源IP地址是本領(lǐng)域亟需解決的問題。
【發(fā)明內(nèi)容】
[0007]本發(fā)明針對現(xiàn)有技術(shù)中使用虛擬網(wǎng)卡的Windows主機在發(fā)送數(shù)據(jù)包時所存在的問題,而提供一種在使用虛擬網(wǎng)卡的Windows主機上綁定源IP的方法。該方法可以在不修改應(yīng)用程序的情況下為數(shù)據(jù)包綁定源IP地址。
[0008]為了達(dá)到上述目的,本發(fā)明采用如下的技術(shù)方案:
[0009]—種在使用虛擬網(wǎng)卡的Windows主機上綁定源IP的方法,所述方法使用Windows的LSP技術(shù)動態(tài)的截獲發(fā)往虛擬網(wǎng)卡的數(shù)據(jù)包,將其源IP地址設(shè)定為一個非虛擬網(wǎng)卡的IP地址。
[0010]在本發(fā)明的優(yōu)選實例中,所述方法通過在LSP中實現(xiàn)socket處理流程、bind處理流程、connect處理流程、sendto處理流程以及closesocket處理流程,以此來完成源IP的綁定;
[0011]所述socket處理流程包括如下步驟:
[0012](1a)在 LSP 中創(chuàng)建 socket ;
[0013](2a)將創(chuàng)建的socket關(guān)聯(lián)到一個socket跟蹤鏈表表項,該鏈表項用于指示一個數(shù)據(jù)包是否需要綁定一個源IP地址;
[0014]所述bind處理流程包括如下步驟:
[0015](1b)在LSP中查詢socket跟蹤鏈表表項;
[0016](2b)查看相應(yīng)的bind地址參數(shù)是否為O ;若為0,轉(zhuǎn)入步驟(4b);若不為0,轉(zhuǎn)入步驟(3b);
[0017](3b)調(diào)用原生bind邏輯;
[0018](4b)更新socket跟蹤鏈表表項,為該socket的后續(xù)數(shù)據(jù)包指示需要綁定源IP地址;
[0019]所述connect處理流程包括如下步驟:
[0020](Ic)查詢socket跟蹤鏈表表項;
[0021](2c)若查找到相應(yīng)的表項,則調(diào)用NeedBind例程,該NeedBind例程的邏輯為判斷是否需要為數(shù)據(jù)包綁定一個源IP地址;
[0022](3c)通過調(diào)用NeedBind例程來判斷數(shù)據(jù)包是否需要綁定源IP地址,若需要,則轉(zhuǎn)入步驟(4c);若不需要,則轉(zhuǎn)入步驟(5c);
[0023](4c)調(diào)用LSP中實現(xiàn)的bind處理流程;
[0024](5c)調(diào)用原生 connect ;
[0025]所述sendto處理流程包括如下步驟:
[0026](Id)查詢socket跟蹤鏈表表項;
[0027](2d)若查找到相應(yīng)的表項,則調(diào)用NeedBind例程,該NeedBind例程的邏輯為判斷是否需要為數(shù)據(jù)包綁定一個源IP地址;
[0028](3d)通過調(diào)用NeedBind例程來判斷數(shù)據(jù)包是否需要綁定源IP地址,若需要,則轉(zhuǎn)入步驟(4d);若不需要,則轉(zhuǎn)入步驟(5d);
[0029](4d)調(diào)用LSP中實現(xiàn)的bind處理流程;
[0030](5d)調(diào)用原生 sendto ;
[0031]所述closesocket處理流程包括如下步驟:
[0032](Ie)查詢socket跟蹤鏈表表項;
[0033](2e)若查找到相應(yīng)的表項,則刪除該socket跟蹤鏈表表項;
[0034](3e)調(diào)用原生 closesocket。
[0035]根據(jù)上述方案形成的技術(shù)方案能夠在不修改應(yīng)用程序的情況下為數(shù)據(jù)包綁定源IP地址;同時能夠靈活實現(xiàn)源地址偽裝。
【專利附圖】
【附圖說明】
[0036]以下結(jié)合附圖和【具體實施方式】來進(jìn)一步說明本發(fā)明。
[0037]圖1為現(xiàn)有Windows這類操作系統(tǒng)在不作路由器使用時數(shù)據(jù)包的發(fā)送流程圖;
[0038]圖2為socket處理流程的示意圖;
[0039]圖3為bind處理流程的示意圖;
[0040]圖4為connect處理流程的示意圖;
[0041]圖5為sendto處理流程的示意圖;
[0042]圖6為closesocket處理流程的示意圖。
【具體實施方式】
[0043]為了使本發(fā)明實現(xiàn)的技術(shù)手段、創(chuàng)作特征、達(dá)成目的與功效易于明白了解,下面結(jié)合具體圖示,進(jìn)一步闡述本發(fā)明。[0044]本發(fā)明提供的在使用虛擬網(wǎng)卡的Windows主機上綁定源IP的方案使用Windows的LSP技術(shù)動態(tài)的截獲發(fā)往虛擬網(wǎng)卡的數(shù)據(jù)包,將其源IP地址設(shè)定為一個非虛擬網(wǎng)卡的IP地址。
[0045]本方案中涉及的虛擬網(wǎng)卡:即用軟件模擬網(wǎng)絡(luò)環(huán)境。軟件模擬的網(wǎng)絡(luò)接口卡不需要硬件芯片的支持,可以將數(shù)據(jù)包導(dǎo)入任意地方。
[0046]涉及的LSP (Layered Service Provider):中文名為分層服務(wù)提供程序,是Windows在Socket實現(xiàn)中提供的一種機制,允許在應(yīng)用程序的Socket調(diào)用和數(shù)據(jù)進(jìn)入?yún)f(xié)議棧之間,插入一個或多個層,對Socket調(diào)用進(jìn)行重載或攔截。LSP的加載不需要應(yīng)用程序參與,由系統(tǒng)自動進(jìn)行。
[0047]基于上述原理,本發(fā)明實現(xiàn)在使用虛擬網(wǎng)卡的Windows主機上綁定源IP的具體流程如下:
[0048]為了能夠在不修改應(yīng)用程序的情況下為IP數(shù)據(jù)報選擇一個位于物理網(wǎng)卡上的源IP地址,首先,在Windows主機上上設(shè)定以下模塊:
[0049]1、策略處理模塊-為LSP設(shè)置策略,指出哪些數(shù)據(jù)包需要被攔截,攔截后進(jìn)入源地址選擇模塊為其選擇一個源地址。
[0050]2、路由查找模塊-針對一個目標(biāo)IP地址查詢系統(tǒng)路由表,得到該數(shù)據(jù)包的路由表項。
[0051]3、源地址選擇模塊-可以根據(jù)配置自動為一個數(shù)據(jù)包綁定一個源IP地址或者手動為其指定一個明確的源 IP地址。
[0052]4、數(shù)據(jù)處理模塊-在數(shù)據(jù)包流經(jīng)SPI的關(guān)鍵點上利用LSP處理數(shù)據(jù)包。
[0053]5、全局的socket跟蹤鏈表表項-保存每一個socket的詳細(xì)信息。
[0054]據(jù)此,本發(fā)明的方案通過在LSP中實現(xiàn)socket處理流程、bind處理流程、connect處理流程、sendto處理流程以及closesocket處理流程,以此來完成源IP的綁定。
[0055]其中,socket處理流程:在LSP實現(xiàn)中,倉Il建socket的時候?qū)ocket關(guān)聯(lián)到一個socket跟蹤鏈表項,該鏈表項用于指示一個數(shù)據(jù)包是否需要綁定一個源IP地址。如圖2所示,該處理流程的實施步驟如下:
[0056](Ia)在 LSP 中創(chuàng)建 socket ;
[0057](2a)判斷是否創(chuàng)建成功,若創(chuàng)建成功轉(zhuǎn)至步驟(4a);若沒有創(chuàng)建成功,轉(zhuǎn)至步驟(3a);
[0058](3a)錯誤返回;
[0059](4a)分配socket跟蹤鏈表節(jié)點并將該socket與之關(guān)聯(lián)后插入socket跟蹤鏈表;
[0060](5a)返回 socket 句柄。
[0061]bind處理流程:在LSP實現(xiàn)中,替換原生的bind邏輯,如果應(yīng)用程序調(diào)用bind的時候傳入O地址參數(shù),意味著應(yīng)用程序不在意bind的地址,此時就需要LSP在后續(xù)的connect調(diào)用或者數(shù)據(jù)真的要發(fā)送的時候為其bind —個非虛擬網(wǎng)卡的IP地址作為數(shù)據(jù)包的源IP地址。如圖3所示,該處理流程的實施步驟如下:
[0062](Ib)在LSP中查詢socket跟蹤鏈表表項;
[0063](2b)判斷是否查詢到,若沒有查詢到,轉(zhuǎn)至步驟(3b);若查詢到轉(zhuǎn)至步驟(4b);
[0064](3b)錯誤返回;[0065](4b)查看相應(yīng)的bind地址參數(shù)是否為O ;若為0,轉(zhuǎn)入步驟(4b);若不為0,轉(zhuǎn)入步驟(3b);
[0066](5b)調(diào)用原生bind邏輯;
[0067](6b)更新socket跟蹤鏈表表項,為該socket的后續(xù)數(shù)據(jù)包指示需要綁定源IP地址;
[0068]( 7b )處理流程結(jié)束,返回。
[0069]connect處理流程:針對TCP應(yīng)用或者一些UDP應(yīng)用,在發(fā)送數(shù)據(jù)包之前需要connect到目標(biāo)地址,在connect調(diào)用的時候可以捕獲到數(shù)據(jù)包的目標(biāo),基于目標(biāo)即可判斷出該數(shù)據(jù)包是否被路由到虛擬網(wǎng)卡。如圖4所示,該處理流程的實施步驟如下:
[0070](Ic)查詢socket跟蹤鏈表表項;
[0071](2c)判斷是否查詢到,若沒有查詢到,轉(zhuǎn)至步驟(3c);若查詢到轉(zhuǎn)至步驟(4c);
[0072](3c)錯誤返回;
[0073](4c)若查找到相應(yīng)的表項,則調(diào)用NeedBind例程,該NeedBind例程的邏輯為判斷是否需要為數(shù)據(jù)包綁定一個源IP地址,即判斷一個socket關(guān)聯(lián)的目標(biāo)IP是否通過虛擬網(wǎng)卡被路由;
[0074](5c)通過調(diào)用NeedBind例程來判斷數(shù)據(jù)包是否需要綁定源IP地址,若需要,則轉(zhuǎn)入步驟(6c);若不需要,則轉(zhuǎn)入步驟(7c);
[0075](6c)調(diào)用LSP中實現(xiàn)的bind處理流程;
[0076](7c)調(diào)用原生 connect。
[0077]sendto處理流程:針對一些UDP應(yīng)用,不調(diào)用connect,直接調(diào)用sendto,那么在第一次調(diào)用sendto的時候即可捕獲到數(shù)據(jù)的目標(biāo)地址,基于目標(biāo)即可判斷出該數(shù)據(jù)包是否被路由到虛擬網(wǎng)卡。如圖5所示,該處理流程的實施步驟如下:
[0078](1d)查詢socket跟蹤鏈表表項;
[0079](2d)判斷是否查詢到,若沒有查詢到,轉(zhuǎn)至步驟(3d);若查詢到轉(zhuǎn)至步驟(4d);
[0080](3d)錯誤返回;
[0081](4d)若查找到相應(yīng)的表項,則調(diào)用NeedBind例程,該NeedBind例程的邏輯為判斷是否需要為數(shù)據(jù)包綁定一個源IP地址;
[0082](5d)通過調(diào)用NeedBind例程來判斷數(shù)據(jù)包是否需要綁定源IP地址,若需要,則轉(zhuǎn)入步驟(6d);若不需要,則轉(zhuǎn)入步驟(7d);
[0083](6d)調(diào)用LSP中實現(xiàn)的bind處理流程;
[0084](7d)調(diào)用原生 sendto。
[0085]closesocket處理流程:在關(guān)閉socket的時候,需要將該socket對應(yīng)的socket跟蹤鏈表的表項刪除之后再調(diào)用原生closesocket。如圖6所示,該處理流程的實施步驟如下:
[0086](1e)查詢socket跟蹤鏈表表項;
[0087](2e)判斷是否查詢到,若沒有查詢到,轉(zhuǎn)至步驟(3e);若查詢到轉(zhuǎn)至步驟(4e);
[0088](3e)錯誤返回;
[0089](4e)若查找到相應(yīng)的表項,則刪除該socket跟蹤鏈表表項;
[0090](5e)調(diào)用原生 closesocket。[0091]通過上述方案可知,本申請使用LSP技術(shù)實現(xiàn)上述關(guān)鍵邏輯即可在不修改應(yīng)用程序的前提下對數(shù)據(jù)包的源IP地址進(jìn)行動態(tài)設(shè)置,使之和虛擬網(wǎng)卡無關(guān)。這種情況下,虛擬網(wǎng)卡僅僅作為一個捕獲數(shù)據(jù)包的邏輯網(wǎng)卡存在,對數(shù)據(jù)包的IP封裝格式毫無影響。
[0092]以上顯示和描述了本發(fā)明的基本原理、主要特征和本發(fā)明的優(yōu)點。本行業(yè)的技術(shù)人員應(yīng)該了解,本發(fā)明不受上述實施例的限制,上述實施例和說明書中描述的只是說明本發(fā)明的原理,在不脫離本發(fā)明精神和范圍的前提下,本發(fā)明還會有各種變化和改進(jìn),這些變化和改進(jìn)都落入要求保護的本發(fā)明范圍內(nèi)。本發(fā)明要求保護范圍由所附的權(quán)利要求書及其等效物界定 。
【權(quán)利要求】
1.一種在使用虛擬網(wǎng)卡的Windows主機上綁定源IP的方法,其特征在于,所述方法使用Windows的LSP技術(shù)動態(tài)的截獲發(fā)往虛擬網(wǎng)卡的數(shù)據(jù)包,將其源IP地址設(shè)定為一個非虛擬網(wǎng)卡的IP地址。
2.根據(jù)權(quán)利要求1所述的一種在使用虛擬網(wǎng)卡的Windows主機上綁定源IP的方法,其特征在于,所述方法通過在LSP中實現(xiàn)socket處理流程、bind處理流程、connect處理流程、sendto處理流程以及closesocket處理流程,以此來完成源IP的綁定; 所述socket處理流程包括如下步驟: (1a)在 LSP 中創(chuàng)建 socket ; (2a)將創(chuàng)建的socket關(guān)聯(lián)到一個socket跟蹤鏈表表項,該鏈表項用于指示一個數(shù)據(jù)包是否需要綁定一個源IP地址; 所述bind處理流程包括如下步驟: (Ib)在LSP中查詢socket跟蹤鏈表表項; (2b)查看相應(yīng)的bind地址參數(shù)是否為O ;若為0,轉(zhuǎn)入步驟(4b);若不為0,轉(zhuǎn)入步驟(3b); (3b)調(diào)用原生bind邏輯; (4b)更新socket跟蹤鏈表表項,為該socket的后續(xù)數(shù)據(jù)包指示需要綁定源IP地址; 所述connect處理流程包括如下步驟: (Ic)查詢socket跟蹤鏈表表項; (2c)若查找到相應(yīng)的表項,則調(diào)用NeedBind例程,該NeedBind例程的邏輯為判斷是否需要為數(shù)據(jù)包綁定一個源IP地址; (3c)通過調(diào)用NeedBind例程來判斷數(shù)據(jù)包是否需要綁定源IP地址,若需要,則轉(zhuǎn)入步驟(4c);若不需要,則轉(zhuǎn)入步驟(5c); (4c)調(diào)用LSP中實現(xiàn)的bind處理流程; (5c)調(diào)用原生connect ; 所述sendto處理流程包括如下步驟: (Id)查詢socket跟蹤鏈表表項; (2d)若查找到相應(yīng)的表項,則調(diào)用NeedBind例程,該NeedBind例程的邏輯為判斷是否需要為數(shù)據(jù)包綁定一個源IP地址; (3d)通過調(diào)用NeedBind例程來判斷數(shù)據(jù)包是否需要綁定源IP地址,若需要,則轉(zhuǎn)入步驟(4d);若不需要,則轉(zhuǎn)入步驟(5d); (4d)調(diào)用LSP中實現(xiàn)的bind處理流程; (5d)調(diào)用原生sendto ; 所述closesocket處理流程包括如下步驟: (Ie)查詢socket跟蹤鏈表表項; (2e)若查找到相應(yīng)的表項,則刪除該socket跟蹤鏈表表項; (3e)調(diào)用原生 closesocket。
【文檔編號】H04L12/70GK103905302SQ201210587692
【公開日】2014年7月2日 申請日期:2012年12月28日 優(yōu)先權(quán)日:2012年12月28日
【發(fā)明者】趙亞, 掌曉愚, 韓洪慧, 葉寒 申請人:上海格爾軟件股份有限公司