摘要:為了使IPv6客戶端能夠通過CDMA無線接入方式訪問遠程的IPv6服務(wù)器,介紹了已有的隧道技術(shù)并分析其不足,如不能適用于CDMA網(wǎng)絡(luò),提出并實現(xiàn)了一種基于NetFilter框架、Libnet和Libipq使得IPv6可以穿越CDMA網(wǎng)絡(luò)的方法。實際應(yīng)用表明,運用這種方法,IPv6主機可以有效地通過CDMA方式接入網(wǎng)絡(luò),并訪問遠程的IPv6服務(wù)器。
關(guān)鍵詞: IPv4; IPv6; 碼分多址; 無線接入; 隧道
中圖分類號:TP302文獻標(biāo)志碼:A
文章編號:1001-3695(2008)04-1199-02
隨著IPv6網(wǎng)絡(luò)和CDMA無線上網(wǎng)方式的普及,出現(xiàn)了將兩者結(jié)合使用的需求。這兩種新興技術(shù)的結(jié)合將會有非常廣闊的應(yīng)用前景,如汽車的遠程故障診斷、移動終端的視頻會議等。但是目前的CDMA網(wǎng)絡(luò)并不支持IPv6協(xié)議,造成IPv6客戶無法穿越CDMA網(wǎng)絡(luò)訪問互聯(lián)網(wǎng)中的IPv6服務(wù)器,嚴重制約了IPv6應(yīng)用在CDMA網(wǎng)絡(luò)中的發(fā)展。針對隧道的各種實現(xiàn)技術(shù),國內(nèi)外都做了大量工作[1~3],但多數(shù)均無法穿越NAT。
1常用的隧道技術(shù)
目前在IPv4網(wǎng)絡(luò)中部署IPv6網(wǎng)絡(luò)的基本技術(shù)主要有三種,即雙協(xié)議棧(RFC 4213[4])、隧道技術(shù)(RFC 4213)和NAT-PT(RFC 2766[5])。由于目前CDMA網(wǎng)絡(luò)并不支持IPv6并且人們要實現(xiàn)的是IPv6客戶端訪問遠程IPv6服務(wù)器,這相當(dāng)于在IPv4的“海洋”中實現(xiàn)IPv6“小島”的互通。鑒于這種情況,只可能使用隧道技術(shù)。目前在實踐中常用的隧道技術(shù)有以下幾種:手工配置隧道、自動配置隧道、Tunnel Broker、6 over 4、6 to 4。由于在CDMA網(wǎng)絡(luò)中經(jīng)常使用NAT技術(shù)和存在基于狀態(tài)的防火墻,使得上述幾種隧道技術(shù)均在CDMA網(wǎng)絡(luò)中失效。鑒于以上原因,本文提出并實現(xiàn)了一種基于NetFilter框架、Libnet和Libipq使得IPv6可以穿越CDMA網(wǎng)絡(luò)的方法。
2實現(xiàn)技術(shù)
1)NetFilter[6]Linux 2.4內(nèi)核中實現(xiàn)數(shù)據(jù)包過濾、處理和NAT等功能的框架。包含以下三部分:
a)為每種網(wǎng)絡(luò)協(xié)議(IPv4、IPv6等)定義一套鉤子函數(shù)(IPv4和IPv6各定義了五個鉤子函數(shù))。這些鉤子函數(shù)在數(shù)據(jù)報流過協(xié)議棧的幾個關(guān)鍵點被調(diào)用。在這幾個點中,協(xié)議棧將把數(shù)據(jù)報及鉤子函數(shù)標(biāo)號作為參數(shù)調(diào)用NetFilter框架。
b)內(nèi)核的任何模塊可以對每種協(xié)議的一個或多個鉤子進行注冊,實現(xiàn)掛接。這樣當(dāng)某個數(shù)據(jù)包被傳遞給NetFilter框架時,內(nèi)核能檢測是否有任何模塊對該協(xié)議和鉤子函數(shù)進行了注冊。若注冊了,則調(diào)用該模塊注冊時使用的回調(diào)函數(shù)。這樣這些模塊就有機會檢查(可能還會修改)該數(shù)據(jù)包、丟棄該數(shù)據(jù)包及指示NetFilter將該數(shù)據(jù)包傳入用戶空間的隊列。
c)那些被傳遞到用戶空間的數(shù)據(jù)包被異步地進行處理。一個用戶進程能檢查數(shù)據(jù)包、修改數(shù)據(jù)包,甚至可以重新將該數(shù)據(jù)包通過離開內(nèi)核的同一個鉤子處而被重新注入到內(nèi)核中。
一個數(shù)據(jù)包按照圖1所示的過程通過NetFilter框架。
從圖中可以看到IPv6共有五個鉤子函數(shù),分別為NF_IP6_PRE_ROUTING、NF_IP6_LOCAL_IN、NF_IP6_FORWARD、NF_IP6_POST_ROUTING、NF_IP6_LOCAL_OUT。數(shù)據(jù)報從左邊進入系統(tǒng),進行IP校驗以后,數(shù)據(jù)報經(jīng)過第一個鉤子函數(shù)NF_IP6_PRE_ROUTING[1]進行處理;然后就進入路由代碼,其決定該數(shù)據(jù)包是需要轉(zhuǎn)發(fā)還是發(fā)給本機。若該數(shù)據(jù)包是發(fā)送本機。則該數(shù)據(jù)經(jīng)過鉤子函數(shù)NF_IP6_LOCAL_IN[2]處理后傳遞給上層協(xié)議;若該數(shù)據(jù)包應(yīng)該被轉(zhuǎn)發(fā)則它被NF_IP6_FORWARD[3]處理。經(jīng)過轉(zhuǎn)發(fā)的數(shù)據(jù)報經(jīng)過最后一個鉤子函數(shù)NF_IP6_POST_ROUTING[4]處理后傳輸?shù)骄W(wǎng)絡(luò)上。本地產(chǎn)生的數(shù)據(jù)經(jīng)過鉤子函數(shù)NF_IP6_LOCAL_OUT [5]處理后進行路由選擇處理;然后經(jīng)過NF_IP6_POST_ROUTING[4]處理后發(fā)送到網(wǎng)絡(luò)上。
內(nèi)核模塊可以對一個或多個這樣的鉤子函數(shù)進行注冊掛接,并且在數(shù)據(jù)報經(jīng)過這些鉤子函數(shù)時被調(diào)用,從而模塊可以修改這些數(shù)據(jù)報,并向NetFilter返回如下值:
NF_ACCEPT——繼續(xù)正常傳輸數(shù)據(jù)報;
NF_DROP——丟棄該數(shù)據(jù)報,不再傳輸;
NF_STOLEN——模塊接管該數(shù)據(jù)報,不要繼續(xù)傳輸該數(shù)據(jù)報;
NF_QUEUE——對該數(shù)據(jù)報進行排隊(通常用于將數(shù)據(jù)報給用戶空間的進程進行處理);
NF_REPEAT——再次調(diào)用該鉤子函數(shù)。
2)Libnet[7]一個小型的接口函數(shù)庫,主要用C語言寫成,提供了低層網(wǎng)絡(luò)數(shù)據(jù)報的構(gòu)造、處理和發(fā)送功能。Libnet的開發(fā)目的是建立一個簡單統(tǒng)一的網(wǎng)絡(luò)編程接口以屏蔽不同操作系統(tǒng)低層網(wǎng)絡(luò)編程的差別,使得程序員將精力集中在解決關(guān)鍵問題上。Libnet允許程序員獲得對數(shù)據(jù)報的絕對控制,并且提供了豐富的數(shù)據(jù)報構(gòu)造函數(shù),可以構(gòu)造TCP/IP協(xié)議族中大多數(shù)協(xié)議的報文。
3)Libipq[8]NetFilter框架的重要組成部分。任何時候在任何NetFilter規(guī)則鏈中,數(shù)據(jù)報均可以被排隊轉(zhuǎn)發(fā)到用戶空間。實際的排隊是由內(nèi)核模塊來完成的(IPv4是ip_queue.o;IPv6是ip6_queue.o)。數(shù)據(jù)報(包括數(shù)據(jù)報的原數(shù)據(jù)如nfmark和mac地址)通過netlink socket被發(fā)送給用戶空間進程,該進程能對數(shù)據(jù)報進行任何處理。處理結(jié)束后,用戶進程可以將該數(shù)據(jù)報重新注入內(nèi)核或者設(shè)置一個對數(shù)據(jù)報的目標(biāo)動作,如丟棄(NF_DROP)等。這是NetFilter的一個關(guān)鍵技術(shù),使用戶進程可以進行復(fù)雜的數(shù)據(jù)報操作,從而減輕了內(nèi)核空間的復(fù)雜度。用戶空間的數(shù)據(jù)報操作進程能很容易地使用Libipq庫進行開發(fā)。
3系統(tǒng)框架和部署
本方法的適用環(huán)境如圖2所示。其中:IPv6客戶端程序的工作過程如圖3所示;網(wǎng)關(guān)程序的工作過程如圖4所示。
IPv6客戶端的具體工作過程如下:
IPv6與IPv6 server建立連接之前,需要先在本地啟動一個IPv4 client,將IPv6數(shù)據(jù)包作為IPv4 client的負載傳輸以便穿越CDMA網(wǎng)絡(luò)。a)IPv6 client發(fā)出的數(shù)據(jù)包的目標(biāo)IP地址為IPv6 server的IPv6地址,源地址為本機的IPv6地址。b)當(dāng)IPv6數(shù)據(jù)包流經(jīng)NetFilter框架下的第五個(NF_IP6_LOCAL_OUT)鉤子時,判斷源IPv6地址是不是本機的IPv6地址。如果是,返回NF_QUEUE;否則返回NF_ACCEPT。c)將數(shù)據(jù)包復(fù)制到用戶空間。d)IPv4 client將整個IPv6數(shù)據(jù)包作為負載發(fā)往gateway server的IPv4 server。該IPv4數(shù)據(jù)包的源IP地址是CDMA的ISP給本機分配的臨時地址,目的地址是gateway server固定的IPv4地址。e)CDMA client收到gateway server返回的IPv4包。f)在IPv4 client程序中讀出負載。該負載包含完整的IPv6和TCP頭部;目標(biāo)地址就是本機的IPv6地址;調(diào)用Libnet庫函數(shù)。g)將完整的IPv6包送入本機的協(xié)議棧中,此時該IPv6包也會經(jīng)過c),但是它的源地址不是本機的IPv6地址,而是IPv6 server的IPv6地址,所以它不會被復(fù)制到用戶空間。h)CDMA IPv6 client收到了IPv6 server的響應(yīng),此時完成了一次通信。
Gateway server端的具體通信過程如下:
首先在本地啟動一個IPv4 server程序。a)IPv4 server程序收到IPv6 client 的IPv4 client發(fā)來的數(shù)據(jù)包;b)從IPv4的socket中讀出負載后調(diào)用Libnet庫函數(shù);c)將負載打包成IPv6包發(fā)往IPv6 server;d)判斷發(fā)出的IPv6包是不是IPv6 client發(fā)給服務(wù)器的,若是,則進入e),否則返回NF_ACCEPT;e)由于IPv6響應(yīng)包目的地址是手工配置的,無法正常路由到gateway server,為解決這種情況本文在NetFilter框架下實現(xiàn)了一個支持IPv6的NAT; f)當(dāng)收到IPv6 server返回的響應(yīng)時,在第一個鉤子處進行反向NAT,然后返回NF_QUEUE,把整個IPv6數(shù)據(jù)包復(fù)制到用戶空間;g)把整個IPv6數(shù)據(jù)包作為IPv4 server程序的負載發(fā)送給IPv6 client的IPv4 client,此時IPv4數(shù)據(jù)包的源地址是gateway server的IPv4地址,目的地址是IPv6 client 的IPv4 client臨時的IPv4地址。
系統(tǒng)部署如圖5所示,IPv6 client和gateway server的操作系統(tǒng)均為Redhat 9.0;內(nèi)核版本是2.4.20;IPv6 client采用CDMA無線方式接入Internet。Libnet的版本是1.1.2.1,IP tables的版本是1.3.4,通信協(xié)議使用TCP。
4結(jié)束語
隨著IPv6網(wǎng)絡(luò)的部署和CDMA無線接入方式的普及,可以想象到將兩者結(jié)合起來不僅會更充分地發(fā)揮它們各自的優(yōu)勢,而且很有可能改變目前人們的工作方式。在目前CDMA網(wǎng)絡(luò)還不支持IPv6協(xié)議的情況下,本方法可以使IPv6客戶端通過CDMA無線接入方式方便高效地訪問遠程IPv6服務(wù)器。本方法具有以下優(yōu)點:實現(xiàn)簡單、穩(wěn)定;部署靈活,可以不受NAT和防火墻的限制;具有很好的工程應(yīng)用價值。
參考文獻:
[1]趙海濱,高紀明,唐鼎,等.IPv6過渡機制分析與6 to 4 Tunnel的實現(xiàn)[J]. 計算機工程,2004,30(9):103-105.
[2]余冬梅,廖永剛,張秋余.IPv4網(wǎng)絡(luò)到IPv6網(wǎng)絡(luò)遷移技術(shù)研究[J].計算機工程與科學(xué),2005,27(7):27-29.
[3]何世明,沈軍.IPv4/IPv6主機之間強制隧道的設(shè)計與實現(xiàn)[J].計算機工程,2006,32(3):143-145.
[4]NORDMARK E,GILLIGAN R E.RFC 4213,Basic transition mechanisms for IPv6 hosts and routers[S]. 2005.
[5]TSIRTSIS G,SRISURESH P.RFC 2766,Network address translation-protocol translation(NAT-PT)[S]. 1998.
[6]WELTE H. Netfilter/IPtables project homepage[EB/OL]. (2006-02-18).[2006-11-20]. http://www.netfilter.org.
[7]SCHIFFMAN M D. The libnet packet construction library [EB/OL].(2006-10-22). [2006-12-06]. http://www. packetfactory. net/ libnet.
[8]MORRIS J. Manpage of Libipq[EB/OL].(2001-10-16). [2006-10-13]. http://www. cs. princeton. edu/~nakao/libipq.htm.
“本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文”