NAT穿透技術原理淺談

NAT穿透技術原理淺談  原創:wildlee

今天我們來看看NAT方面的技術,提起NAT技術,我們大家可能並不陌生,就真實的存在我們身邊,只不過我們很少關注它.NAT是一種網絡地址翻譯技術,將內部私有IP地址改變成可以在公網上使用的:公網IP.其出現背景就是因爲我們國家公網IP地址太少了不夠用,才使NAT技術興起.這裏我就不具體和大家細說NAT是怎麼轉換IP地址了,技術原理不太難.NAT技術的使用從技術角度講是有利也有弊的.我們可以同時讓多個計算機同時聯網,同時也隱藏了內部地址,NAT對來自外部的數據查看其NAT映射記錄,對沒有相應記錄的數據包進行拒絕,無非提高了網絡的安全性.從另一個方面來看,NAT設備對數據包進行編輯修改操作,降低了發送數據的數率.由於技術的複雜性,排錯也變的困難了,我們在內部對外發佈一個服務器,還得考慮這個端口映射問題等.這也到罷了,網絡盛行的今天,各種應用不斷,其協議應用也各有不同,有的根本無法通過NAT.這是最爲頭疼的事.目前爲了解決這些問題,已多現多種穿透技術.一會我們細談.

NAT三種實現方式

靜態地址轉換:一個公網IP對應一個內部IP,一對一轉換

動態地址轉換:N個公網IP對應M個內部Ip,不固定的一對一IP轉換關係.同一時間,有M-N個主機無法聯網.

端口多路複用:對外只有一個公網IP,通過端口來區別不同內部IP主機的數據.

IP轉換策略

對於靜態與動態地址轉換;其數據包出站的時候,進行源地址轉換.我們稱之爲SNAT[SOURCE ADDRESS].其內部源IP變公網源IP.數據包入站的時候,進行目標地址轉換DNAT[DESTINATION ADDRESS],其外部公網宿IP變內部宿IP.靜態與動態不進行端口轉換.而端口多路複用技術.不但要轉換其IP地址,還要進行其傳輸層的端口轉換.通過這唯一的端口號來區別不同的內部數據[在通信過程中會建立一張內部到外部映射表].我們稱之NATP[NAT PORT]技術.在我們家用網絡中,大部分用的是端口多路複用技術.在端口多路複用技術中,對數據的處理還分這麼兩類:錐形NAT與對稱型NAT.錐形NAT又分完全錐形NAT[FULL CONE]|受限錐形NAT[RESTRICTED CONE]|端口受限錐形NAT[PORT RESTRICTED CONE].

全完錐形NAT:將來自內部同一個IP地址同一個端口號的主機監聽/請求,映射到公網IP某個端口的監聽.任意外部IP地址與端口對其自己公網的IP這個映射後的端口訪問,都將重新定位到內部這個主機.個人認爲在內部發布服務器到外網,此技術原理完全否合該技術原理,當然某些P2P中也可能利用該技術.該技術中,基於C/S架構的應用可以在任何一端發起連接.

受限錐形NAT:與完全NAT不同的是,在公網映射端口後,並不允許所有IP進行對於該端口的訪問,要想通信必需內部主機對某個外部IP主機發起過連接,然後這個外部IP主機就可以與該內部主機通信了.但端口不做限制.如出站源IP爲A端口爲B,對於外部IP回覆,宿IP爲A宿端口可以是任意.NAPT設備都將成功轉發到內部主機.NAPT設備根據映射記錄做出判斷.該技術中只能內部主機先發起連接通信纔可成功.

端口受限錐形NAT:該技術與受限錐形NAT相比更爲嚴格.除具有受限錐形NAT特性.對於回覆主機的源端口也有要求.哪我用端口B訪問你,對於外部主機的回覆信宿端口也只能是B.否折通信失敗.該技術中只能內部主機先發起連接通信纔可成功.

對稱型NAT:內部主機用同一IP與同一端口與外部多IP通信.NAPT設備爲每個會話轉換了不同的源端口.不在轉換成相同的源端口.對於回覆的數據包,只有信宿IP地址與端口完全吻合纔可進入.當然源IP也是要檢測的,不可能隨意外部IP都能進入的.

NAT穿透技術

爲何會出現NAT穿透技術?我們知道在NAPT技術應用中,要想實現通信,端口是必需的.IP地址修改是必需的.現在是殘酷的.FTP應用協議分控制端口與數據端口,悲劇的是數據端口不是固定的,協商成功後告知對方數據端口內容是承載於應用層之中.NAT設備無法對其進行分析,做出相應的映射,從而導致通信失敗.VPN協議中的PPTP協議,在數據連接中協議部分根本沒有端口這一概念.要NAT如何做出決策?ipsec安全協議本身就是保證數據的安全並認證通信源而發明,對其網絡層進行IP效驗,對傳輸入層進行加密,對數據進行加密.對於NAT來說讓其通信這更是無稽之談.當然無法穿過NAT的還有很多,如語音VOIP中的H.323與SIP協議.爲了能讓這些協議成功應用,出現了五花八門的穿透NAT技術.其技術有UPNP技術.ALG[應用層網關識別技術]SBC[會話邊界控制]ICE[交互式連接建立]MIDCOM[中間盒技術]TURN[中繼NAT穿越]STUN技術.TCP/UDP hole punching[TCP/UDP打洞技術]NAT-T技術…總之很多,原理各不相同,我也沒有時間一個一個學習和分析.在此說幾個應用比較多點的例子.

ALG技術:傳統的NAT技術只能檢測網絡層與傳輸層地址,你FTP不是在應用層傳送端口地址嗎?所以ALG技術就是一種應用層地址識別技術,根據不同的協議進行檢測,然後將發現的地址時行修改並通知NAT做相應的映射記錄,從而實現成功通信.對於該技術,對於互聯網每一種新的協議支持都要更新其設備要不無法識別.擴展性差.對於個別協議該技術無法解決問題,如IPSEC協議.

STUN技術:通過STUN協議與第三方服務器建立連接,推測出客戶端的NAT類型.進而通信.RFC3489/STUN協議過程[摘自cr0_3百度空間].STUN協議定義了三類測試過程來檢測NAT類型,如下所述:

Test1:STUN Client通過端口{IP-c1:Port-c1}向STUN Server{IP-s1:Port-s1}發送一個Binding Request(沒有設置任何屬性)。STUN Server收到該請求後,通過端口{IP-s1:Port-s1}把它所看到的STUN Client的IP和端口{IP-m1,Port-m1}作爲Binding Response的內容回送給STUN Client。

Test1#2:STUN Client通過端口{IP-c1:Port-c1}向STUN Server{IP-s2:Port-s2}發送一個Binding Request(沒有設置任何屬性)。STUN Server收到該請求後,通過端口{IP-s2:Port-s2}把它所看到的STUN Client的IP和端口{IP-m1#2,Port-m1#2}作爲Binding Response的內容回送給STUN Client。

Test2:STUN Client通過端口{IP-c1:Port-c1}向STUN Server{IP-s1:Port-s1}發送一個Binding Request(設置了Change IP和Change Port屬性)。STUN Server收到該請求後,通過端口{IP-s2:Port-s2}把它所看到的STUN Client的IP和端口{IP-m2,Port-m2}作爲Binding Response的內容回送給STUN Client。

Test3:STUN Client通過端口{IP-c1:Port-c1}向STUN Server{IP-s1:Port-s1}發送一個Binding Request(設置了Change Port屬性)。STUN Server收到該請求後,通過端口{IP-s1:Port-s2}把它所看到的STUN Client的IP和端口{IP-m3,Port-m3}作爲Binding Response的內容回送給STUN Client。

NAT類型檢測過程如下

1. 進行Test1。如果STUN Client不能夠收到STUN Server的應答(重複多次確認),那麼說明該STUN Client是UDP Blocked類型(也有可能是STUN Server不可到達,這裏不考慮這種情形);否則,STUN Client把返回的{IP-m1,Port-m1}和本地的{IP-c1:Port-c1}進行比較(只需要比較IP即可),如果相同,說明本機直接連接於公網,否則本機位於NAT之後,但還需要進一步判斷具體類型。

1.1. 如果本機直接連接於公網,進行Test2。如果STUN Client不能夠收到STUN Server的應答(重複多次確認),那麼說明該STUN Client是Symmetric Firewall類型;否則,該STUN Client是Open Internet類型。

1.2. 如果本機位於NAT之後,進行Test2。如果STUN Client能夠收到STUN Server的應答,那麼說明該STUN Client是Full Cone NAT;否則,需要進一步進行測試。

1.2.1. 進行Test1#2。STUN Client比較IP-m1和IP-m1#2是否相同,如果不相同,那麼說明該STUN Client是Symmetric NAT類型;否則,需要進一步進行測試。

1.2.1.1 進行Test3。如果STUN Client能夠收到STUN Server的應答,那麼說明該STUN Client是Restricted Cone NAT類型;否則,該STUN Client是Port Restricted Cone NAT類型。

該技術大部分是針對P2P應用環境中.

NAT-T技術:其思想就是在ESP隧道模式下,在外IP包頭與ESP報頭中間加入8個字節的UDP報關,使其NAT成功映射.

IPSec提供了端到端的IP通信的安全性,但在NAT環境下對IPSec的支持有限,AH協議是肯定不能進行NAT的了,這和AH設計的理念是相違背的;ESP協議在NAT環境下最多只能有一個VPN主機能建立VPN通道,無法實現多臺機器同時在NAT環境下進行ESP通信。

NAT穿越(NAT Traversal,NAT-T)就是爲解決這個問題而提出的,RFC3947,3948中定義,在RFC4306中也加入了NAT-T的說明,但並沒廢除RFC3947,3948,只是不區分階段1和階段2。該方法將ESP協議包封裝到UDP包中(在原ESP協議的IP包頭外添加新的IP頭和UDP頭),使之可以在NAT環境下使用的一種方法,這樣在NAT的內部網中可以有多個IPSec主機建立VPN通道進行通信。

 AH封裝:AH封裝的校驗從IP頭開始,如果NAT將IP的頭部改動,AH的校驗就會失敗,因此我們得出結論,AH是無法與NAT共存的。ESP封裝的傳輸模式:對於NAT來說,ESP封裝比AH的優勢在於,無論是加密還是完整性的校驗,IP頭部都沒有被包括進去。但是還是有新的問題,對於ESP的傳輸模式,NAT 無法更新上層校驗和。TCP 和 UDP 報頭包含一個校驗和,它整合了源和目標 IP 地址和端口號的值。當 NAT 改變了某個包的 IP 地址和(或)端口號時,它通常要更新 TCP 或 UDP 校驗和。當 TCP 或 UDP 校驗和使用了 ESP 來加密時,它就無法更新這個校驗和。由於地址或端口已經被 NAT 更改,目的地的校驗和檢驗就會失敗。雖然 UDP 校驗和是可選的,但是 TCP 校驗和卻是必需的。

  ESP封裝的隧道模式:從ESP隧道模式的封裝中,我們可以發現,ESP隧道模式將整個原始的IP包整個進行了加密,且在ESP的頭部外面新加了一層IP頭部,所以NAT如果只改變最前面的IP地址對後面受到保護的部分是不會有影響的。因此,IPsec只有採用ESP的隧道模式來封裝數據時才能與NAT共存。ESP的傳輸模式,因爲TCP部分被加密,NAT無法對TCP校驗和進行修改,不兼容。ESP的隧道模式,由於NAT改動外部的IP而不能改動被加密的原始IP,使得只有這種情況下才能與NAT共存。

至於UDP打洞穿透技術請參看:http://www.wildlee.org/2010_02_152.html

其它技術就不說了,看不過來了東西太多了.文中有兩個細節部分感覺寫的非常好,我就沒有自己在去寫拿來用了.也不知道原作者是誰對不住了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章