P2P技術(一):NAT

尹瑞星發表於2021-04-30

1、NAT由來

NAT是一項神奇的技術,說它神奇在於它的出現幾乎使IPv4起死回生。在IPv4已經被認為行將結束歷史使命之後近20年時間裡,人們幾乎忘了IPv4的地址空間即將耗盡這樣一個事實——在新技術日新月異的時代,20年可算一段漫長的歷史。更不用說,在NAT產生以後,網路終端的數量呈加速上升趨勢,對IP地址的需求劇烈增加。

說它神奇,更因為NAT給IP網路模型帶來了深遠影響,其身影遍佈網路每個角落。根據一份最近的研究報告,70%的P2P使用者位於NAT閘道器以內。

2、NAT的工作特點

NAT通常部署在一個組織的網路出口位置,通過將內部網路IP地址替換為出口的IP地址提供公網可達性和上層協議的連線能力。對於有Internet訪問需求而內部又使用私有地址的網路,就要在組織的出口位置部署NAT閘道器,在報文離開私網進入Internet時,將源IP替換為公網地址,通常是出口裝置的介面地址。

RFC1918規定l了三個保留的地址段落:10.0.0.0-10.0.0.0-10.255.255.255;172.16.0.0-172.31.255.255;192.168.0.0-192.168.255.255,分別處於A/B/C類地址,作為內部網路IP

截圖2021-04-29 下午4.05.38

NAT處理報文的幾個關鍵特點:

  • NAT閘道器設定在私網到公網的路由出口位置,雙向流量必須都要經過NAT閘道器
  • 網路訪問只能先由私網側發起,公網無法主動訪問私網主機
  • NAT閘道器在兩個訪問方向上完成兩次地址的轉換和翻譯,出方向做源資訊替換,入方向做目的資訊替換
  • NAT閘道器的存在對通訊雙方是保持透明的
  • NAT閘道器為了實現雙向翻譯的功能,需要維護一張表,把回話資訊儲存下來

其中第二個特點打破了IP協議架構中所有節點在通訊中的對等地位,這是NAT最大的弊端,為對等通訊帶來了諸多問題,當然相應的克服手段也應運而生。事實上,第四點是NAT致力於達到的目標,但在很多情況下,NAT並沒有做到,因為除了IP首部,上層通訊協議經常在內部攜帶IP地址資訊。

3、NAT的實現方式

NAT工作模型有一對一的NAT、一對多的NAT。其中一對一表示一個內部主機佔用一個公網IP,這種方式對節約公網IP沒有多大意義,主要實現一下特殊需求比如:使用者希望隱藏內部主機的真實IP。

NAT工作模型最常用的就是一對多。在一對多模型中,按照埠轉換的工作方式不同,又可以更進一步的劃分。

3.1、靜態NAT

即一對一的NAT,這裡只進行IP轉換,沒有進行埠的轉換

通俗易懂:快速理解P2P技術中的NAT穿透原理_11.png

3.2、NAPT

埠多路複用技術。與靜態NAT的差別是,NAPT不但要轉換IP地址,還要進行傳輸層的埠轉換。具體的表現形式就是,對外只有一個公網IP,通過埠來區別不同私有IP主機的資料。

通俗易懂:快速理解P2P技術中的NAT穿透原理_22.png

3.3、NAPT的四種NAT型別

  • 完全錐形NAT(Full Cone NAT)

    特點:IP和埠都不受限

    表現形式:將來自內部同一個IP地址同一個埠號(IP_IN_A : PORT_IN_A)的主機監聽/請求,對映到公網IP某個埠(IP_OUT_B : PORT_OUT_B)的監聽。任意外部IP地址與埠對其自己公網的IP這個對映後的埠訪問(IP_OUT_B : PORT_OUT_B),都將重新定位到內部這個主機(IP_IN_A : PORT_IN_A)。簡單來說就是隻要客戶端由內到外建立一個對映後,其他外部主機的IP和埠都可以使用這個洞給客戶端傳送資料。

    通俗易懂:快速理解P2P技術中的NAT穿透原理_2.png

  • 受限錐形NAT(Restricted Cone NAT)

    特點:IP受限,埠不受限

    表現形式:與完全錐形NAT不同的是,在公網對映埠後,並不允許所有IP進行對於該埠的訪問,要想通訊必需內部主機對某個外部IP主機發起過連線,然後這個外部IP主機就可以與該內部主機通訊了,但埠不做限制。

    通俗易懂:快速理解P2P技術中的NAT穿透原理_4.png

  • 埠受限型NAT(Port Restricted Cone NAT)

    特點:IP和埠都受限

    表現形式:該技術與受限錐形NAT相比更為嚴格。除具有受限錐形NAT特性,對於回覆主機的埠也有要求。假設內部主機傳送過報文給A主機P1埠,那外部主機向內部主機傳送UDP報文時候必須要求報文IP是A,埠是P1。這一要求進一步強化了對外部報文請求來源的限制,從而較Restrictd Cone更具安全性。

    通俗易懂:快速理解P2P技術中的NAT穿透原理_5.png

  • 對稱型NAT(Symmetric NAT)

    特點:對每個外部主機或埠的會話都會對映為不同的埠(洞)

    表現形式:同一個客戶端和不同的目標IP:PORT通訊,經過NAT對映後的公網IP:PORT是不同的。此時,如果B想要和客戶端通訊,也只能通過NatIP:NatPortB(也就是紫色的洞洞)來進行,而不能通過NatIP:NatPortA(也就是黃色的洞洞)。

    通俗易懂:快速理解P2P技術中的NAT穿透原理_6.png

    以上四種型別對NAT的限制是越來越大。

4、NAT的限制與解決方案

IP協議的一個重要貢獻就是把世界變得平等,我們熟知的CS體系結構是在應用層協議上的角色區分,而在網路層和傳輸層沒有差異,一個IP地址的主機既可以是客戶機,也可以是伺服器。

與此同時,很多應用也是把客戶端和伺服器的角色組合起來來完成功能。而在P2P應用中,一個使用者的主機既為下載的客戶,同時也向其他客戶提供資料,是一種C/S混合的模型。上層應用之所以能這樣設計,是因為IP協議棧定義了這樣的能力。試想一下,如果IP提供的能力不對等,那麼每個通訊會話都只能是單方向發起的,這會極大限制通訊的能力。

**而NAT最大的弊端正在於此——破壞了IP端到端通訊的能力!其次NAT裝置會對資料包進行編輯修改,這樣就降低了傳送資料的效率;此外,各種協議的應用各有不同,有的協議是無法通過NAT的(不能通過NAT的協議還是蠻多的),這就需要通過穿透技術來解決

4.1、NAT弊端

  • NAT使IP會話的保持時效變短。由於IP和埠資源有限,所以在會話結束後需要回收資源,即老化操作。基於UDP通訊協議很難確定何時通訊結束,所以NAT閘道器主要依賴超時機制回收外部的埠,但是如果應用需要維持連線的時間大於NAT閘道器的設定,通訊就會意外中斷。因為閘道器回收相關轉換表資源以後,新的資料到達時就找不到相關的轉換資訊,必須建立新的連線。當這個新資料是由公網側向私網側傳送時,就會發生無法觸發新連線建立,也不能通知到私網側的主機去重建連線的情況。這時候通訊就會中斷,不能自動恢復。即使新資料是從私網側發向公網側,因為重建的會話表往往使用不同於之前的公網IP和埠地址,公網側主機也無法對應到之前的通訊上,導致使用者可感知的連線中斷。很多應用協議的設計者已經考慮到了這種情況,所以一般會設定一個連線保活的機制,即在一段時間沒有資料需要傳送時,主動傳送一個NAT能感知到而又沒有實際資料的保活訊息,這麼做的主要目的就是重置NAT的會話定時器。
  • NAT在實現上將多個內部主機發出的連線複用到一個IP上,這就是依賴IP進行主機跟蹤的機制都失效了。一個IP被很多使用者共享,如果存在惡意的使用者行為,很難定位到發起連線的那個主機。
  • NAT工作機制依賴於修改IP包頭的資訊,這會妨礙一些安全協議的工作。因為NAT篡改了IP地址、傳輸層埠號和校驗和,這會導致認證協議徹底不能工作,因為認證目的就是要保證這些資訊在傳輸過程中沒有變化。IP分片機制是在資訊源端或網路路徑上,需要傳送的IP報文尺寸大於路徑實際能承載最大尺寸時,IP協議層會將一個報文分成多個片斷髮送,然後在接收端重組這些片斷恢復原始報文。IP這樣的分片機制會導致傳輸層的資訊只包括在第一個分片中,NAT難以識別後續分片與關聯表的對應關係,因此需要特殊處理。

4.2、NAT路由型別判斷

根據上面的介紹,我們可以瞭解到,在實際的網路情況中,各個裝置所處的網路環境是不同的。那麼,如果這些裝置想要進行通訊,首先判斷出裝置所處的網路型別就是非常重要的一步。

舉個例子來說:對於IM中的實時音視訊功能和VoIP軟體,對位於不同NAT內部的主機通訊需要靠伺服器來轉發完成,這樣就會增加伺服器的負擔。為了解決這種問題,要儘量使位於不同NAT內部的主機建立直接通訊,其中,最重要的一點就是要判斷出NAT的型別,然後才能根據NAT的型別,設計出直接通訊方案。不然的話,兩個都在NAT的終端怎麼通訊呢?我們不知道對方的內網IP,即使把訊息發到對方的閘道器,然後呢?閘道器怎麼知道這條訊息給誰,而且誰允許閘道器這麼做了?

為了解決這個問題,也就是處於內網的主機之間能夠穿越它們之間的NAT建立直接通訊,已經提出了許多方法,STUN(Session Traversal Utilities for NAT,NAT會話穿越應用程式)技術就是其中比較重要的一種解決方法,並得到了廣泛的應用。

參考連結:

http://www.52im.net/thread-50-1-1.html

http://www.360doc.com/content/14/0305/17/8285430_357987074.shtml

http://www.52im.net/thread-1055-1-1.html

《計算機網路自頂向下方法》

相關文章