1. 程式人生 > >NAT 穿越技術(一)

NAT 穿越技術(一)

最近5G-ICN的專案需要考慮NAT穿越的問題,對這方面的技術細節不是很瞭解,故找到相關的內容,以便進行理解,方便知識回顧。

什麼是穿越NAT
這裡寫圖片描述

在上圖中,ICG閘道器後面有兩臺主機分別是有線主機192.168.1.2和無線主機192.168.1.3,現在這兩臺主機都要訪問網站www.tektalk.cn(彎曲評論,域名解析後地址為74.220.215.202),根據專欄第三期介紹,ICG要將內部主機地址進行轉換(NAT),換成閘道器的WAN口地址發起訪問,否則網站資料無法正確返回。
我們先看看問題是怎麼產生的,192.168.1.2和192.168.1.3同時訪問彎曲評論,閘道器NAT後,資料包的源和目的都是一致的([源地址78.145.16.88;目的地址74.220.215.202],為了敘述方便,簡寫為[源地址“ICG閘道器”;目的地址“彎曲評論”]),因此彎曲評論在返回資料時,源和目的也是一致[源地址“彎曲評論”;目的地址“ICG閘道器”],為了聚焦NAT轉換,圖中將保持不變的彎曲評論地址略去。
那麼問題就出現了,ICG同時收到兩份資料(目的地址是ICG閘道器),ICG該如何處理呢?
1. 由於目的地址是ICG閘道器,所以全部由閘道器接收處理;後果是內部主機都無法開啟網頁
2. 由於192.168.1.2訪問彎曲評論,所以全部轉交給192.168.1.2;後果是無線主機無法開啟網頁
3. 由於192.168.1.3訪問彎曲評論,所以全部轉交給192.168.1.3;後果是有線主機無法開啟網頁
4. 智慧地將一個包轉給192.168.1.2,另外一個轉交給192.168.1.3;沒有後果,無線有線主機都能開啟網頁

NAT穿越的原理
要求ICG能夠對兩個源目的地址完全一致的資料包進行智慧的處理,將一個包交給有線主機,另外一個交給無線主機,並且兩個包不能弄混,那麼這兩個包必然攜帶了內部主機資訊,能夠使ICG根據這個資訊作正確的區分。
那麼這個資訊是什麼呢?其實很簡單,也許不少讀者也已經想到了,是埠號,確切地說是TCP/UDP埠號。下面是TCP/UDP埠號在NAT中的轉換原理。

這裡寫圖片描述
從上圖可以發現:
1. 有線主機開啟瀏覽器訪問彎曲評論,為何訪問彎曲評論的時候目的埠是80,源埠卻是1025呢?因為網頁應用是著名TCP應用,使用保留埠範圍[0-1023]中的80,而一般客戶端發起訪問時(除非應用特殊規定),源埠只能採用非保留埠範圍[1024-65535],在該例中,有線主機使用1025埠發起訪問。
2. 當ICG收到該資料包時,首先從閘道器埠池中取一個空閒埠,假設是13023,然後使用“ICG閘道器地址+13023埠”替換“有線主機+1025埠”,替換後還需要更新轉換表項,這個轉換表項就是解答前面問題的關鍵,轉換表項是需要計時的,因為閘道器埠池內可用埠數量有6萬多個(理論上從1024到65535,實際上有可能還會縮減),通常主機開啟新浪的主頁需要佔用埠達到200多個,如果沒有轉換計時機制,埠池的空閒埠很容易消耗掉,沒有空閒埠意味著無法轉換,也就無法訪問應用;通過計時機制,將不活躍的埠重新回收至埠池,以迴圈利用的方式能夠應對大部分網路場景,通常TCP埠轉換計時300s(300s內沒有更新或被引用刪除表項回收埠),UDP則是240s,對於網路應用來說,這個計時已經足夠(TCP通常10s內沒有資料傳遞就需要重傳甚至重新連線)。
3. 彎曲評論收到資料,根據請求中的源地址、源埠進行回覆,可以看到回覆的目的地址是ICG閘道器,目的埠也是埠池中取出的13023。
4. ICG閘道器收到回覆,此時要檢查轉換表中是否有對應的源轉換表項:
a) 抽取資料包的5元組[協議、目的地址、目的埠、源地址、源埠]
b) 逐項匹配轉發表5元組[協議、外部地址、外部埠、目的地址、目的埠]
c) 在上圖中,ICG閘道器順利找到一條表項,如果沒有匹配的表項則會進入3元組匹配(3元組匹配詳見最後一節),如果3元組也無法匹配則丟棄資料包
d) 將然後將資料包的目的地址和目的埠替換成表項中的內部地址、內部埠
e) 在舉例中目的地址從“ICG閘道器”換成“有線主機”,目的埠從13023換成1025後傳送給有線主機。
接下面來再看有線主機和無線主機同時訪問彎曲評論的原理圖。

這裡寫圖片描述
和無線主機。
上述地址埠轉換原理就是通常所說的NATPT(網路地址轉換和埠轉換),是目前應用最廣泛的NAT技術,以至於通常所說的NAT其實指的就是NATPT,單純意義上的地址轉換由於地址利用率低而極少被使用。
那麼還有哪些技術能夠穿越NAT呢?我們把支援內部多臺主機同時訪問同一個外部應用稱為支援,如果同一時刻只能由1臺主機訪問,那麼就不支援NAT穿越。
這裡寫圖片描述
幸運的是,網際網路大部分應用都是TCP應用,TCP和UDP應用合起來佔網際網路應用型別的99%,更幸運的是我們常用的非TCP/UDP應用Ping也是可以穿越NAT的,而GRE隧道和IPSec使用的(ESP、AH)則無法穿越NAT,那麼GRE、IPSec是不是在NAT環境中就無法使用了呢,當然不是。ESP結合UDP後能夠穿越,GRE結合ESP因而也能夠穿越,而AH則因為保護地址而無法穿越(在IPSec詳解時會具體介紹)。
NAT穿越的充要條件
為什麼TCP、UDP、ICMP能夠穿越,而GRE、ESP、AH無法穿越呢,我們來看如下資料包對比(以下資料包截圖採用WireShark解析)。
這裡寫圖片描述


ICMP抓包可以發現源地址+Identifier(請求和應答使用相同的Identifier)可以作為區分內部主機的條件,也可以像TCP/UDP一樣穿越NAT,ICMP的轉換表項例項如下。
這裡寫圖片描述
為什麼ICMP的表項也叫埠呢,ICG為了統一所有協議轉換表項,將ICMP中的Identifier作為埠來處理。
這裡寫圖片描述
上圖是GRE的抓包,可以發現GRE裡頭沒有類似於ICMP的Identifier欄位,因此沒有辦法區分多個內部主機,只能支援1臺內部主機對外建立GRE隧道。
這裡寫圖片描述

從ESP封裝我們似乎發現可以通過安全引數索引來區分內部不同的主機,實際上SPI的確可以區分出不同內部主機;但安全引數索引是源和目的協商出來的,ESP加密、解密、計算校驗使用的金鑰存在一一對應關係,如果ICG閘道器使用自己的安全引數索引進行替代,那麼接收方將找不到正確的金鑰解密,因此NATPT無法支援多個內部主機同時進行ESP通訊,只能支援1臺內部主機。ICG閘道器包括GRE和ESP協議的完整NATPT表項如下表所示。
這裡寫圖片描述

如上所述,能夠進行NAT穿越的應用的必要條件是
1. 除了源IP地址外,還有其餘類似於TCP/UDP埠、ICMP的Identifier的標誌位和內部主機的應用進行繫結
2. 該標誌位和金鑰、認證無關,因為如果和金鑰或認證相關,閘道器修改該標誌位後會導致解密和認證失敗
如上2個條件同時滿足就是NAT穿越的充分條件。

不同NAT閘道器後的內部主機如何互訪(P2P如何穿越NAT)
這裡寫圖片描述
上圖所示場景可以說是NAT穿越的終極場景,目前廣泛使用的P2P就使用大量這種連線提高傳輸效率,如何解決問題大家想到的方法可能如下:
1. 由有線主機或無線主機直接向對端發起訪問,假設是有線主機直接訪問無線主機,那麼訪問哪個地址呢,大家可能會回答訪問161.71.89.3,那麼有線主機怎麼知道訪問161.71.89.3,大家可能也會回答圖上畫的,但實際網際網路應用的時候我們手上並沒有這麼一張圖告訴我們這個主機在這個閘道器之後,那個主機在那個閘道器之後,再者網際網路上主機幾十億臺,完成這張圖簡直是Mission Impossible,即使我們通過打電話、寫信的方式獲得了對方的地址、協議(TCP)、埠(2000),那麼當訪問傳送給161.71.89.3時,會出現什麼狀況呢?

這裡寫圖片描述
為什麼訪問會被丟棄呢,首先2000埠是無線主機的埠,所以ICG閘道器會查詢NAT轉換表項,是否存在[協議TCP;外部地址161.71.89.3;外部埠2000]的3元組表項,但是內部主機是無法指定外部埠的,外部埠是由ICG閘道器動態從埠池中取得,所以即使找到這個2000埠,也未必對應無線主機192.168.1.2,所以該方法被斃。
2. 既然外部埠是動態的,那麼我們使用靜態埠吧,如果使用靜態埠,那麼就是內部伺服器應用了,而不是NAT了,對於P2P這種自動建立大量連線的應用,要手工指定埠對映顯然是不現實的,因為P2P應用使用埠量大,而且埠經常變化。
3. 藉助外部伺服器如彎曲評論的幫忙。

這裡寫圖片描述
首先有線和無線主機都要向伺服器發起註冊,連線中攜帶使用者名稱,這樣伺服器收到連線後就能夠將註冊資訊中攜帶的IP地址、埠和使用者名稱關聯起來,做成一個表,在BT技術中這種表叫做Trace表。

這裡寫圖片描述
假設有線主機向無線主機發起連線,那麼首先去伺服器檢索無線主機的IP地址和埠資訊,檢索到後向對應的IP地址、埠發起連線:
1. 當資料包到達無線閘道器ICG時,資料包5元組是[TCP、無線ICG閘道器、13000、有線ICG閘道器、12001]
2. 在無線閘道器的轉發表項中找不到相匹配的5元組表項
3. 此時會按照3元組[TCP、無線ICG閘道器、13000]匹配,可以找到如下表項

這裡寫圖片描述

  1. 將資料包目的地址“無線ICG閘道器”換成內部地址“無線主機”,再將目的埠13000換成1025
  2. 替換好後傳送給無線主機
    上述介紹的是P2P穿越NAT的原理,實際上的P2P協議要比這個複雜,可能涉及到分散式伺服器、許多埠,但是任何P2P通訊具體到每個資料包時都是之和一個伺服器的一個埠進行通訊,因此依然是符合上述原理的。
    P2P技術除了要解決穿越NAT,另外一個要穿越的是防火牆,因為大部分防火牆不進行3元組匹配,因為3元組匹配使任何外網主機都能夠訪問內網某個埠,在防火牆安全區域理論中,這屬於需要禁止的非信任域主機主動訪問信任域主機,在以後的專欄中會對P2P穿越防火牆進行介紹。