摘要:該方案是將主機自身的IP地址一同進行封裝,從NAT網關內部發往NAT網關外部的數據包,在經過UDP解封裝后,其源地址更改為原始IP地址,因此目標主機的IP層以上各層會認為通訊對方的IP地址為內部主機原始IP地址,它發送的數據包也將以該原始IP地址為目的地址。利用改進后的UDP封裝方案,實現了IPSec報文對NAT設備的透明穿越。
關鍵詞:網絡地址;封裝;透明穿越
中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2008)35-2403-01
An Improved UDP Encapsulation Method Used in the Conflict between IPSecurity and Network Address Translation
SUN Guang-hui1, WANG Li-juan2
(Hunan University of Arts and Science, Changde 415000, China)
Abstract: If the improved encapsulation method is used, the packet's source address will be changed from a illegal address to an legal address when it is sent out from the host behind the NAT device, and changed back from a legal address to an illegal original address after be striped of the UDP head at the host outside. So the upper protocol layers above the network layer of the host outside will think that they are communicating with a host with that illegal address and the packet it send out will have the destination to that illegal address. By the amelioration, the data can t raverse the NAT Gateway transpar-ently.
Key words: network address; encapsulation; traverse transparently
1 引言
網絡安全協議IPSec是目前適用于所有Internet通信的新一代安全技術標準,它可以“無縫”地為IP引入安全特性,并為數據提供身份認證,完整性檢驗,抗重播攻擊以及加密等機制。網絡地址轉換NAT和IPSec一直都有矛盾,NAT進行地址映射的時候,要對IP包進行修改,然而對于IPSec報文,這些信息無法修改,所以普通的IPSec報文無法穿越NAT設備,這是一個急需解決的問題,也是目前研究的一個難點。
目前幾種解決IPSec與NAT不兼容問題的思路中,UDP封裝法是比較好的一種方案,我們需要一個不用對NAT設備位置進行控制的“主動”的解決方法,用UDP協議封裝IPSec數據包可以滿足這個要求。
2 因特網工程任務組的UDP封裝法草案
UDP封裝方法是一種比較新的建議,由F-Secure、Microsoft、Cisco、Nortel和SSH Communications聯合推出。
2.1 因特網工程任務組UDP封裝格式
UDP封裝的核心思想是把IPSec信包裝入一個UDP/IP分組,然后讓NAT去修改附加的UDP/IP分組。在IETF的一個草案中,提出了一種封裝的方法,并給出了數據包的封裝格式,如圖1所示。其中前8個字節為標準的UDP包頭,源端口與目的端口采用與IKE相同的值,校驗和為0。非IKE標志為全0的8個字節,以與發起者的IKE的cookie保持對齊。
2.2 因特網工程任務組UDP封裝法中存在的問題
經過分析,IETF UDP封裝法方案在解決兼容性方面仍然存在著幾個問題:
1) 在IPSec中,進入的安全關聯SA由三個參數確定,即地址、協議、安全參數索引SPI。若采用NAPT,在外部主機上面會有多個地址相同,SPI不同的SA。在處理進入數據包的時候,可以用SPI值的不同來定位SA,而在處理外出數據包的時候,就不可能從多個有相同地址的外出SA中選擇出正確的SA了。
2) 若NAT網關為NAPT,發往內部各主機數據包的UDP封裝的目的端口號都為500,這樣一來,NAPT就無法分解各個數據包究竟應該發送到內部的哪一臺主機。
3) 從外部主機向NAT網關內的主機發送數據時,需要用該主機的私網IP地址為目的地址來定位SA,因此對于進入外部主機的數據包必須將其源地址恢復成私網的IP地址后傳遞給上層協議。如果不對進入數據包的源地址進行處理,會導致在發送相應數據包時無法正確定位相應的SA。
對于以上缺陷,現在已經有一些解決方案,比如設計NAT-T模塊以及NAT模塊,利用NAT-T模塊進行UDP封裝和解封裝,利用NAT模塊進行私網公網地址的轉換。
3 改進的UDP封裝方法
改進的UDP封裝方法是針對原有UDP封裝方法的缺陷而設計的,它能夠克服原有方案的缺點,更好的解決IPSec與NAT的沖突問題。
3.1 改進UDP封裝方法的封裝格式
為了正確定位安全關聯,改進的UDP封裝方案將主機自身的IP地址一同進行封裝。從NAT網關內部發往NAT網關外部的數據包,在經過UDP解封裝后,其源地址更改為原始IP地址,因此目標主機的IP層以上的各層會認為通訊對方的IP地址為內部主機的原始IP地址,它發送的數據包也將以該原始IP地址為目的地址。然而此原始IP地址為一個非法的IP地址,要想正確發送這個數據包,必須在IPSec處理完成后進行UDP封裝,將其目的地址更改為與此原始IP對應的合法IP地址,并將UDP包頭中的目的端口號設置為與此原始IP地址相對應的端口號。因此需要將這些合法地址以及端口信息添加到安全策略庫中,這個任務可由改進后的IKE來完成。
改進的UDP封裝的格式如圖2所示。
3.2 改進方案中的幾個關鍵問題
1) 用UDP包封裝AH/ESP有助于解決NAPT阻礙AH/ESP的問題,在靜態或者動態NAT存在的情況下,這種封裝有時沒有必要。某些情況下是否用UDP封裝IPSec通信由是否存在NAPT而非NAT來決定,如果AH/ESP可以通過NAT則沒有必要再加一層UDP包頭來浪費帶寬。NAT檢測不僅要確定NAT存在的位置,也要確定NAT的類型,尤其應該能夠區分NAPT。
2) 對于動態NAT和NAPT,地址變換是動態的,這使對方的通信實體識別發生困難。在動態NAT或者NAPT存在時,Keep-alive消息是維持NAT映射表以解決密鑰更新問題所必要的。
3) 經過NAT變換之后,IKE發起放的源地址經過NAT變換會發生變化,而IKE的響應方在IKE第二階段協商之前必須知道IKE發起方經過NAT變換之前的源地址。IPSec交互雙方需要知道雙方的原始地址以重新計算TCP校驗和或者AH ICV。
4) IKE實現必須接受端口號500以外的UDP端口。
4 改進的UDP封裝方法的實現過程
假定所用封裝為ESP傳送模式,NAT網關為NAPT類型,網絡連接狀況如圖3所示。圖3中IP1表示內部主機的IP地址,IP2表示外部主機的IP地址,IPG表示NAT網關的IP地址。
4.1 探測NAT的存在
兩個要進行通信的主機,首先要知道中間是否有NAT的存在。探測由NAT設備后的主機發起,發送IKE探測報文,即NAT-D(NAT Discovery)數據包,確認IPSec通信實體之間是否有NAT隔開,NAT發現載荷包括通信雙方的地址/端口對的哈希值。另一方收到探測載荷后,計算這些哈希值,如果得到相同的結果,則中間沒有NAT設備。如果哈希值不匹配,說明中間有實體進行了地址或端口的轉換,則需要進行NAT穿透,以使IPSec包通過。
4.2 改進的UDP封裝及解封裝
改進方案中數據包穿越NAT在內部主機和外部主機之間進行傳送的實現過程如下。
1) 數據包由內部主機發往外部主機,經過IPSec層,進行封裝,源地址為本機地址,目的地址為外部主機地址。
2) 對數據包進行改進的UDP封裝,并將本機地址、ESP協議值、非IKE標志附加到UDP數據中,源端口和目的端口均為500,IP頭中的協議字段改為UDP。
3) 數據包經過NAT網關到達外部主機,此時數據包源IP地址為NAT網關地址,目的地址為外部主機地址。UDP報頭中的源端口被修改,目的端口為500。
4) 外部主機進行UDP解封裝,去除UDP報頭,并用附帶的IP地址替換掉IP報頭中的源地址,用UDP報頭中的ESP協議值替換IP報頭中的協議值。至此已經成功完成IPSec數據包穿越NAT從內部主機到達外部主機的任務。
5) 數據包送往外部主機的IPSec層進行處理,查進入SA,進行解密以及驗證,去除IPSec報頭,重構IP數據包。
6) 將重構的IP數據包送往外部主機的IP層進行處理。此時和未實現IPSec協議時的處理相同。
7) 數據包經上層協議處理完畢后返回IPSec層,查策略,查SA,進行加密和HASH計算,構成IPSec報文。
8) 對IPSec報文進行UDP封裝,因為此時目的IP地址為對方內部主機地址,所以需檢索策略庫,查找保存在策略庫中與之對應的合法IP地址以及目的端口。UDP封裝以后,源IP地址為外部主機IP地址,目的地址為NAT網關地址,UDP報頭中源端口為500,目的端口地址為原500端口經NAT轉換而得的端口。
9) 數據包從外部主機經NAT網關到達(返回)內部主機,此時經過NAT網關的轉換,目的地址變為內部主機地址,目的端口變為500,據此內部主機得知此數據包為UDP封裝的IPSec數據包。
10) 內部主機對到達的數據包進行解UDP封裝,去除UDP報文,并用ESP協議值替換IP頭中的協議字段值,重構IPSec報文。
11) 將重構的IPSec報文送往IPSec層進行處理,查SA,進行驗證、解密,去除IPSec報頭,重構IP數據包,送往IP層進行處理。至此,一次完整的實施了IPSec安全協議的數據報交換得以完成。
上述通信的完整過程如圖4所示。
4.3 NAT的映射保持
使用存活時間保持包,存活保持包用于IPSec的兩端支持一個活動的UDP路徑,在沒有正常IKE或IPSec流量時提供流量,以使NAT和狀態過濾映射保持存活。存活保持包由NAT后的通信方發送以最小地保持存活流量,此包被IPSec包處理器丟掉。
5 結束語
根據新的UDP封裝方案設計的系統EasySwan不再停留在草案階段,而是將沖突方案真正付諸實施,通過修改Linux系統的網絡協議棧,實現了IPSec報文對NAT設備的透明穿越。EasySwan有效地支持了IPSec 數據流傳輸路徑中的NAT 轉換,并且具有實現簡單、擴展性好等優點,具有很好的應用前景。
參考文獻
[1] 洪帆,陳卓, 等.IPSec安全體制的體系結構及應用研究.小型微型計算機系統,2002,23(8):946-949.
[2] 祝芝梅, 李之棠. IPSec與NAT兼容性問題及解決方案[J].計算機應用,2004,24(3):27-30.
[3] 徐大為, 龔玲, 楊宇航. IPSec穿越NAT的設計與實現[J].計算機工程,2002,28(7):153-155.
[4] 陸建德. 基于IPSec協議的Linux VPN安全網管的研究與設計.小型微型計算機系統,2001,22(7):878-880.
[5] 王浩,楊媛媛,陸際光.基于TCP/IP協議的網絡安全分析[J].中南民族大學學報(自然科學版),2002,21(1):63-66.