NAT穿透技術簡介和實現方案分析

1. NAT和NAT穿透

  NAT的出現是爲了解決IPV4地址稀缺的問題,同時起到了防火牆的作用保護了內網的信息安全,但是對於P2P下載來說無疑是很大的阻礙。本文先簡單介紹了NAT和NAT穿透的分類,然後就常用的STUN/TURN/ICE進行介紹,最後分析現有的一些ICE開源項目。

1.1 NAT類型介紹

  根據RFC3235規定,NAT類型主要有Full Cone NAT(全錐型), Restricted NAT(限制型錐型), Port Restricted NAT(端口限制型錐型), Symmetric NAT(對稱型)四種。四種類型的主要區別在於對外界訪問內部IP的控制力度。爲方便解釋,我們使用如下的用語來說明四種NAT類型的不同之處。

  • 內部Tuple:內部主機發送報文的源地址、端口所構成的二元組
  • 外部Tuple:指內部Tuple經過NAT的源地址/端口轉換之後,所獲得的外部地址、端口所構成的二元組
  • 目標Tuple:指外部主機的地址、端口所構成的二元組

  具體類型的特性如下:

(1)Full Cone NAT:所有來自同一個內部Tuple X的請求均被NAT轉換至同一個外部Tuple Y。當X-Y的轉換關係建立之後,任意外部主機均可隨時將Y中的地址和端口作爲目標地址和目標端口,向內部主機發送UDP報文。

(2)Restricted Cone NAT:所有來自同一個內部Tuple X的請求均被NAT轉換至同一個外部Tuple Y,由內部發出給某個目標Tuple Z後,Z.ip發出的報文均可被接收,端口不限。如果沒有向某個Tuple T發送數據包,則T無法主動發送給X。

(3)Port Restricted Cone NAT:在(2)的基礎上,加上對端口的限制。即只有Tuple Z的報文可以發送給X,假設Z.ip + 另一個端口,也會失敗。

(4)Symmetric NAT:Tuple X不再和(1)-(3)一樣建立穩定的轉換關係至某個外部Tuple Y,而是隨着目的地址和端口的不同動態分配IP/Port,使得關係較爲複雜。

1.2 NAT穿透介紹

  NAT穿透的常見實現方式主要包括兩種:

(1) 通過路由器支持端口映射從而實現P2P通信,該類包括upnp和nat-pmp,優點在於易於實現、延遲小、對服務器無負擔,缺點在於需要路由器支持並打開相應功能。

(2) STUN/TURN/ICE協議簇,通過服務器的協調作用實現P2P通信。優點在於穩定可靠,缺點在於需要多次通信,在最壞情況需要依靠中繼完成通信,對於遊戲服務器來說會有一定的負擔。

  本文重點在於分析ICE架構的實現方式、當前的ICE開源項目以及可能的實現方式。

2. STUN介紹

  STUN最早在RFC3489中定義爲NAT穿透工具:STUN - Simple Traversal of UDP Through NATs,之後在RFC5389中更名爲Session Traversal Utilities for NAT (STUN)。

  由其名字的變化可以看到,STUN設計初衷是作爲NAT穿透的工具,但是隨着後續TURN和ICE的出現,其功能被細化,明確規定爲實現NAT穿透功能中的一部分工具。其主要功能在於根據NAT不同類型的特點,對客戶端進行檢測和類型判斷,並將其判斷結果傳給客戶端以及NAT穿透工具實現穿透。下圖爲RFC文檔中描述的整個檢測流程圖。
在這裏插入圖片描述
  假設客戶端爲A,STUN服務器爲S,這裏要求S至少提供兩個IP和端口。

(1)STEP1判斷客戶端是否在NAT後

  A向S的IP1:pot1端口發送一個UDP 包。S收到這個包後,會把它收到包的源IP和port寫到UDP包中,然後把此包通過IP1和port1發還給A。這個IP和port也就是NAT的外網 IP和port。當A收到此UDP後,把此UDP中的IP和自己的IP做比較,如果是一樣的,就說明自己是在公網,再檢測是否有防火牆。如果不一樣,說明有NAT的存在,系統進行STEP2的操作。

(2)STEP2是否是Full Cone NAT

  A向S的IP1發送一個UDP包,請求S通過另外一個IP2和PORT向A返回一個UDP數據包。如果A收到了這個數據包,說明NAT不對數據包進行任何過濾,即full cone NAT。如果沒收到,那麼系統進行STEP3的操作。

(3)STEP3是否是Symmetric NAT

  A向S的IP2:port2發送一個數據包,S收到數據包後,把它收到包的源IP和port寫到UDP包中,然後通過自己的IP2和port2把此包發還給A。如果這個port和step1中的port一樣,那麼可以肯定這個NAT是個CONE NAT,繼續執行STEP4,否則是Symmetric NAT。

(4)STEP4判斷是Restrict Cone NAT還是Port Restrict NAT

  A向S的IP2的一個端口發送一個數據請求包,要求S用IP2和不同的端口返回一個數據包給A。如果A收到了,那也就意味着只要IP相同,即使port不同,NAT也允許UDP包通過。顯然這是Restrict Cone NAT。如果沒收到,則是Port Restrict NAT.

3. TURN介紹

  TURN,在RFC5766中定義爲使用中繼的NAT穿透方案:STUN的中繼擴展 Traversal Using Relays around NAT(TURN):Relay Extensions to Session Traversal Utilities for NAT(STUN)。簡單的說,TURN與STUN的共同點都是通過修改應用層中的私網地址達到NAT穿透的效果,異同點是TURN是通過兩方通訊的“中間人”方式實現穿透。
  下圖所示爲客戶端發出建立和A的通道請求,通過之後和A互相通信的過程。注意在這時候通道僅對A生效,B是無法發送給客戶端的。

在這裏插入圖片描述

  TURN作爲中繼傳輸消息的方式和已有的遊戲服務器功能上其實是一致的,用其作爲下載中繼對服務端負荷過高,因此單獨使用TURN沒有價值。

4. ICE介紹

  ICE在RFC5245中的定義爲 Interactive Connectivity Establishment (ICE) : A Protocol for Network Address Translator (NAT) Traversal for Offer/Answer Protocols,由IETF的MMUSIC工作組開發。ICE跟STUN和TURN不一樣,ICE不是一種協議,而是一個框架(Framework),它整合了STUN和TURN使各種NAT穿透技術可以實現統一。

  當客戶端和ICE服務器通信時,首先會執行STUN的過程檢測該客戶端的類型,然後根據客戶端的類型判斷如何進行通信。如下所示爲兩個客戶端A和B通過ICE服務器建立連接的過程。這裏爲了方便說明假設B在公網或者已經成功打洞,目標是和A建立連接。首先是STUN檢測A的NAT類型。

  如果A處於公網或者Full Cone Nat下,STUN不做其他的了,因爲客戶端B可以直接和A進行通信。
在這裏插入圖片描述
  如果A處於Restrict Cone或者Port Restrict NAT下,STUN協調TURN進行NAT打洞。STUN首先回復A其NAT類型以及外部IP:Port,然後調用TURN作爲中繼協調A/B告知對方的IP:Port,然後AB在互發一次消息打洞之後既可以成功的建立雙向連接。
在這裏插入圖片描述
  如果A處於對稱NAT下,那麼點對點連接下,ICE判斷NAT無法進行打洞。所以爲了通信,只能採取最後的手段轉成C/S架構,以TURN爲中繼進行A和B的通信。
在這裏插入圖片描述

5. ICE開源項目介紹

通過搜索發現,目前評價較好的開源ICE實現主要有pjsip和libnice。下表是在官網實際下載、編譯過程的總結

pjsip libnice
源碼包大小 45.8M 4.7M
依賴庫 DirectX SDK(必備)SDL(必備)ffmpeg(可選)OpenH264(可選)MSYS2(可選) glib(必備)zlib(必備)gettext(必備)
官方參考手冊 編譯和API指引都很詳細 編譯無指引,API詳細
編譯體驗 (1) 有編譯指引、依賴包、頭文件說明,有sln可以直接使用。支持vs2008和vs2012(2) 依賴庫衆多,依賴庫版本升降也會產生影響,各個依賴庫編譯也很有難度。 (1) 未提供編譯指引,僅說明需要的依賴庫。最新版未提供sln,舊版有。查閱網上資料發現使用vs2008及之前版本有人成功過,之後版本沒有發現成功只有一堆失敗的提問。官方傾向於只管理Linux/Mac,未解決Windows下的問題。(2) 依賴庫較容易配置
提供的功能 支持SIP, SDP, RTP, STUN, TURN, and ICE,功能強大,主要實現了多媒體通信框架以及NAT穿透兩部分功能。 1. ICE Library,提供了NiceAgent作爲主對象,NiceAddress用於管理IP地址,NiceCandidate管理候選路徑。2. STUN Library,供ICE庫調用,也可以單獨使用 3. Pseudo TCP Socket,基於UDP的可靠UDP實現。

綜上,總結如下:

  • pjsip優點在於支持全平臺、功能齊全、指引詳細,缺點在於本身體量較大有冗餘功能、依賴庫衆多而且實際操作複雜。
  • ibnice優點在於精簡、功能滿足需求,缺點在於缺乏指引,對windows支持不佳。

6. 總結

  ICE框架可以實現除了對稱性NAT以外客戶端的NAT穿透,在一定程度上提高了P2P下載中的客戶端羣,對於採取DHT方式獲取節點進行BT下載有較好的提高,可以作爲對不支持upnp/nat-pmp的用戶採取的穿透方案。
  對於對稱型NAT,如果爲了節約服務器成本,我們可以拒絕連接不加入BT下載中的節點中。該部分其實還可以採取端口猜測的方式使得NAT穿透成功率達到100%,可以納入後續優化之中繼續深入研究和提高。

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