尹會明
YIN Hui-ming
(南京信息職業(yè)技術學院,南京 210046)
人們生活水平的提高和信息技術的飛速發(fā)展,數(shù)字化、智能化且遠程可監(jiān)控的嵌入式設備將飽受青睞。由于被控對象、測控裝置等設備的地域分散性,以及監(jiān)控任務的實時性要求,基于Intemet遠程信息處理和控制是一個很好的解決方案。嵌入式系統(tǒng)(Embedded Systems)是根據(jù)應用的要求,將操作系統(tǒng)和功能軟件集成于計算機硬件系統(tǒng)之中,從而實現(xiàn)軟件與硬件一體化的計算機系統(tǒng)。
IPv4地址匿乏和中國IT起步較晚等歷史原因,使我國的私網(wǎng)IP遠多于公網(wǎng)IP。大部分主機的工作環(huán)境都是在局域網(wǎng),NAT網(wǎng)絡地址轉(zhuǎn)換技術為局域網(wǎng)內(nèi)的主機訪問Intemet提供服務。NAT技術對于局域網(wǎng)內(nèi)的主機是透明的,但當外網(wǎng)主機要主動連接局域網(wǎng)內(nèi)的主機時就得設計穿透技術。遠程監(jiān)控嵌入式系統(tǒng)的絕大部分工作環(huán)境都是局域網(wǎng),因此設計NAT穿透技術就成為必須的工作。
網(wǎng)絡的快速發(fā)展極大地增加了對IP地址的需求。解決IP地址匿乏問題可以通過在下一階段部署IPv6予以解決,而在當前IPv4的環(huán)境下,應著重考慮通過網(wǎng)絡地址轉(zhuǎn)換Network Address Translator,NAT)技術來解決。NAT支持私有地址在內(nèi)部網(wǎng)絡中的應用。由于內(nèi)網(wǎng)用戶眾多,但大量的都是進行內(nèi)部通信,因此可能使用只能在內(nèi)部使用的私有地址。由于公網(wǎng)中的路由器無法識別此類地址,將視其為非法地址。當內(nèi)網(wǎng)用戶要和外界通信時,可以由網(wǎng)關為其動態(tài)分配一個合法的公網(wǎng)地址,網(wǎng)關負責該私有地址和公網(wǎng)地址的映射,這就是NAT的功能。因為內(nèi)網(wǎng)之間不會通過私有地址直接通信,所以不同的內(nèi)網(wǎng)之間可以重用兩樣的私有地址空間,這樣就可以解決大量用戶對IP地址的需求。按照地址轉(zhuǎn)換方式,可以分為以下兩類:
基礎NAT將私有地址轉(zhuǎn)換成公網(wǎng)地址,但并不將TCP用DP端口信息進行轉(zhuǎn)換,它將公網(wǎng)地址與內(nèi)部主機進行綁定,使得外部可以用公網(wǎng)IP地址訪問內(nèi)部主機。如果私有地址和公網(wǎng)地址為一一對應的映射關系,則稱為靜態(tài)綁定;如果公網(wǎng)地址是在主機訪問外網(wǎng)時臨時分配的,則稱為動態(tài)綁定。動態(tài)綁定僅在一定時間內(nèi)有效,需要定時刷新。該類NAT的主要目的并非地址擴展,而是配合防火墻隔離私有網(wǎng)絡,并對內(nèi)部主機訪問外部實施控制。
這類方式比較普遍,網(wǎng)絡地址/端口轉(zhuǎn)換器檢查、修改包的IP地址和TCP/UDP端口信息,這樣,更多的內(nèi)部主機就可以同時使用一個公網(wǎng)IP地址。該類NAT的主要目的是實現(xiàn)地址擴展。由于NAT,穿越的端口號將改變,它給許多應用帶來影響。按照地址映射的實現(xiàn)方式,可以分為以下四類:
1)全錐形(Full Cone)NAT
當內(nèi)部主機發(fā)起一個至外網(wǎng)的會話時,NAT為其建立一個私有
2)地址受限錐形(Address Restrieted Cone)NAT
和全錐形NAT相同,當內(nèi)部主機發(fā)起一個至外網(wǎng)的會話時,NAT為其分配一個公有 的數(shù)據(jù)包才能與主機 3)端口受限錐形(Port Restricted Cone)NAT 和地址受限NAT類似,只是限制范圍從IP地址擴展到 4)對稱形(Synunetric)NAT 和錐形NAT不同,它的地址綁定只能用于指定的內(nèi)網(wǎng) 嵌入式系統(tǒng)的工作性質(zhì)決定了它與外網(wǎng)主機通信都是由對方發(fā)起連接,同時考慮到局域網(wǎng)大部分應用是錐形NAT,本研究局主要為域網(wǎng)外的主機穿透錐形NAT,和嵌入式設備通信的技術。 局域網(wǎng)外的主機分為兩種:擁有公網(wǎng)IP或擁有私網(wǎng)IP。 擁有公網(wǎng)IP的主機因為無法知道嵌入式設備在NAT,上映射的公網(wǎng)IP地址和端口,它無法向嵌入式設備發(fā)送任何數(shù)據(jù)包,這得提供第三方的幫助才能讓彼此建立連接。工作在局域網(wǎng)的嵌入式系統(tǒng) 針對地址或端口受限的錐形NAT,需要局域網(wǎng)內(nèi)的嵌入式系統(tǒng)X打一個“洞”,這個“洞”的方向是 主要過程為:公網(wǎng)IP主機圭動連接局域網(wǎng)內(nèi)嵌入式設備的過程,首先,主機C向服務器S獲取嵌入式系統(tǒng)X的外網(wǎng)地址和端口,同時請求服務器S向嵌入式系統(tǒng)X發(fā)送打洞命令,當主機C收到嵌入式系統(tǒng)X的數(shù)據(jù)包時,NAT穿透成功,主機C和嵌入式系統(tǒng)X建立聯(lián)系。 相比公網(wǎng)IP主機而言,私網(wǎng)IP主機連接局域網(wǎng)內(nèi)的嵌入式系統(tǒng)就要復雜一些,因為都不知道對方的公網(wǎng)IP和端口,誰也無法主動發(fā)出連接請求。借助于第三服務器的幫助,首先嵌入式系統(tǒng)X通過NATA時分配公網(wǎng)IP和端口對并與服務器S建立連接,同樣主機C通過NAT B時分配公網(wǎng)IP和端口對 這時嵌入式系統(tǒng)X和主機C都可以與服務器S進行通信,主機C不能通過服務器S獲取X的公網(wǎng)地址和端口對而直接向x發(fā)送數(shù)據(jù)包,因為從X到 步驟1:主機C先從服務器S獲取X的公網(wǎng)地址和端口對,同時請求服務器S向嵌入式系統(tǒng)x發(fā)送打“洞”命令;步驟2:服務器S向嵌入式系統(tǒng)X發(fā)送主機C的公網(wǎng)地址和端口對 局域網(wǎng)外的主機主動連接嵌入式系統(tǒng)考慮了兩種情形:主機擁有公網(wǎng)IP或擁有私網(wǎng)IP。實現(xiàn)上述的通信,首先得找一臺擁有公網(wǎng)IP地址的第三方充當服務器的角色,并且在服務器和客戶機上得安裝相應的NAT,穿透軟件。如何讓嵌入式系統(tǒng)完成NAT穿透技術中的工作?工作在局域網(wǎng)內(nèi)的嵌入式系統(tǒng)需要處理的是三個任務:定時刷新與服務器通信的端口以保持會話;接收并解析服務器的命令;打一個方向為特定地址和端口的“洞”。 當嵌入式系統(tǒng)向擁有公網(wǎng)IP地址的服務器登錄時,網(wǎng)關會在NAT轉(zhuǎn)換時給其分配公網(wǎng)IP地址和端口,只要此UDP會話有效,服務器都可以通過此公網(wǎng)IP地址和端口和嵌入式系統(tǒng)通信。問題是,這個UDP會話能保持多久呢?這得依具體情況而定。因此,為了保持和服務器通信,嵌入式系統(tǒng)得定時刷新這個公網(wǎng)地址和端口。 本研究采取的辦法是每隔一分鐘向服務器發(fā)送一個保持激活的數(shù)據(jù)包,以維持這個公網(wǎng)IP地址和端口對的有效性。具體實施的方法是:復用了定時器2,它在UDP數(shù)據(jù)包的發(fā)送過程中己經(jīng)被使用,復用可以提高效率節(jié)省硬件資源。在定時器2的中斷服務程序中,定義一個記錄分鐘的變量,每當一分鐘時間到就將發(fā)送保持激活數(shù)據(jù)包的信號量置1,然后退出中斷服務程序。在程序的主循環(huán)中查詢發(fā)送保持激活數(shù)據(jù)包的信號量是否為1,如果使能就向服務器發(fā)送保持激活數(shù)據(jù)包,否則繼續(xù)執(zhí)行其它的任務,這部分的邏輯處理如圖1所示。 圖1 Timer2中斷服務程序和主循環(huán)處理 發(fā)送給服務器的保持激活數(shù)據(jù)包的格式措施為:封裝好一個UDP包,其中填寫服務器的端口號和IP地址,然后調(diào)用發(fā)送此UDP包的函數(shù)即可。 接收并解析服務器的命令是依賴于接收判別數(shù)據(jù)包的函數(shù),系統(tǒng)接收到來自服務器的特定SOCKET的數(shù)據(jù)包,服務器的命令數(shù)據(jù)包會調(diào)用解析函數(shù)來處理,解析函數(shù)首先檢查UDP有效負載中的前2個字節(jié)是否為命令字(自定義為:0xAA,0x55),如果是則繼續(xù)從UDP中的有效負載中分離出想連接嵌入式系統(tǒng)的主機的公網(wǎng)IP地址和端口號;否則退出解析過程。 現(xiàn)在有了該主機的公網(wǎng)IP(它可能是該主機自己的IP,也可能是其網(wǎng)關在NAT時分配的IP)和端口信息,這個UDP數(shù)據(jù)包就很容易封裝,跟發(fā)送保持激活數(shù)據(jù)包相似,最后調(diào)用發(fā)送數(shù)據(jù)包函數(shù)將包發(fā)送出去。這樣嵌入式系統(tǒng)向想連接嵌入式系統(tǒng)的主機就可以發(fā)送打“洞”的UDP數(shù)據(jù)包。 考慮到嵌入式系統(tǒng)絕大部分工作是局域網(wǎng)且由外網(wǎng)主機主動發(fā)起連接,本研究關注了NAT穿透技術的實現(xiàn)。首先,對NAT的原理和分類進行了詳細的闡述;然后,分析了針對分別擁有公網(wǎng)IP和私網(wǎng)IP的主機的NAT穿透技術;最后,講述了本嵌入式系統(tǒng)具體實現(xiàn)方法。 在NAT穿透技術的實現(xiàn)當中,缺少對symmetric(對稱形)NAT洞穿技術的研究,它在某些場合下也會有應用;安全性能不強,應用層協(xié)議的設計缺乏基于加密的握手協(xié)議,這給一些未經(jīng)授權的主機非法操作本嵌入式系統(tǒng)提供了機會。 [1]田澤.嵌入式系統(tǒng)開發(fā)與應用教程[M].北京:北京航空航天大學出版社,2005,3.1-3. [2]李兵建.基于嵌入式Intemet的遠程電網(wǎng)參數(shù)實時檢測系統(tǒng)的設計[D].江蘇:江蘇大學,2008:23-39. [3]Deitel,GoldBerg.Intemet&Worrld Wide Web How to Program.3th Edition.Prentice Hall,2004.321-330. [4]楊恢先,等編著.單片機原理及應用[M].長沙:國防科技大學出版社,2003:253-259. [5]Simon,D.E,著,陳西群,等譯.嵌入式系統(tǒng)軟件教程.[M]北京:機械工業(yè)出版社,2005,09:120-128. [6]StuartRBallPE.嵌入式微處理器系統(tǒng)設計實例[M].北京:電子工業(yè)出版2004:136-144. [7]John Catsoulis.Designing Embedded Hardware[M].OReilly-Media Inc.2002:97-113. [8]沈紅衛(wèi).單片機應用系統(tǒng)設計實例與分析[M].北京:北京航空航天大學出版社,2003:258-262.2 實用高效的NAT穿透技術的設計
2.1 公網(wǎng)主機與局域網(wǎng)嵌入式設備通訊方法
保持會話,當公網(wǎng)主機C想和嵌入式系統(tǒng)X連接時,它先從服務器S獲取x的公網(wǎng)地址和端口對。此時主機C能否通過直接向嵌入式系統(tǒng)x發(fā)送數(shù)據(jù)包呢?如果是Full Cone是可以的,但Address/Port Restricted Cone會丟棄這種數(shù)據(jù)包。2.2 私網(wǎng)主機與局域網(wǎng)嵌入式設備通訊方法
3 嵌入式系統(tǒng)實現(xiàn)NAT穿透技術
3.1 保持和服務器通信技術
3.2 解析服務器技術
3.3 UDP數(shù)據(jù)包發(fā)送
4 結(jié)論及建議