1. 程式人生 > >UDP打洞NAT大致分為下面四類 P2P

UDP打洞NAT大致分為下面四類 P2P


NAT大致分為下面四類
1) Full Cone
這種NAT內部的機器A連線過外網機器C後,NAT會開啟一個埠.然後外網的任何發到這個開啟的埠的UDP資料報都可以到達A.不管是不是C發過來的.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
任何傳送到 NAT(202.100.100.100:8000)的資料都可以到達A(192.168.8.100:5000)

2) Restricted Cone
這種NAT內部的機器A連線過外網的機器C後,NAT開啟一個埠.然後C可以用任何埠和A通訊.其他的外網機器不行.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
任何從C傳送到 NAT(202.100.100.100:8000)的資料都可以到達A(192.168.8.100:5000)

3) Port Restricted Cone
這種NAT內部的機器A連線過外網的機器C後,NAT開啟一個埠.然後C可以用原來的埠和A通訊.其他的外網機器不行.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
C(202.88.88.88:2000)傳送到 NAT(202.100.100.100:8000)的資料都可以到達A(192.168.8.100:5000)
以上三種NAT通稱Cone NAT.我們只能用這種NAT進行UDP打洞.

4) Symmetic
對於這種NAT.連線不同的外部目標.原來NAT開啟的埠會變化.而Cone NAT不會.雖然可以用埠猜測.但是成功的概率很小.因此放棄這種NAT的UDP打洞.

我們看看不同NAT之間的NAT打洞。NAT打洞需要Server配合,需要2種Server: 1. 類似WebRTC中的信令伺服器,作用是幫助客戶機溝通IP和PORT資訊; 2. STUN Server,用來讓客戶機判斷自己所在的NAT環境。 現在假設客戶端和Server的通訊都沒問題,客戶端知道自己所處環境,並且將自己的資訊通過伺服器傳送給了另一方客戶端,它們可能的打洞情況如下: 1. Full Cone NAT 與 Full Cone NAT:通訊很容易,各自通過STUN Server獲取外部IP和Port後,通過信令伺服器通知另一方,即可通訊。 2. Full Cone NAT 與 Restricted Cone NAT或Port Restricted Cone NAT在互相告知IP和Port後,如果由Full Cone NAT端先發送資料包,會失敗,必須由Restricted Cone NAT或Port Restricted Cone NAT端先發送資料包給Full Cone NAT,之後雙方即可互相通訊。
3. Full Cone NAT 與 Symmetric NAT通訊時,必須先由Symmetric NAT端傳送資料包給Full Cone NAT端,Full Cone NAT端通過發來的資料包獲得目標的新埠號,之後通過這個新埠號完成互相通訊。 4. Restricted Cone NAT 與 Restricted Cone NAT、Restricted Cone NAT 與 Port Restricted Cone NAT、Port Restricted Cone NAT 與 Port Restricted Cone NAT之間通訊時,先發送資料包的一方會失敗,之後另一方傳送資料包成功後,可互相通訊。 5. Restricted Cone NAT 與 Symmetric NAT通訊時,先由Restricted Cone NAT傳送資料包給Symmetric NAT,傳送資料會失敗,只是為了下次能接收從Symmetric NAT端傳送過來的資料包。然後由Symmetric NAT傳送資料包到Restricted Cone NAT端,Restricted Cone NAT端會收到資料包,並且將新的埠號記下,使用新的埠號可與Symmetric NAT端通訊。 6. Port Restricted Cone NAT 與 Symmetric NAT通訊時,由於Port Restricted Cone NAT會對IP:PORT對進行限制,所以當Symmetric NAT端使用新PORT發來資料包時,Port Restricted Cone NAT端收不到,它們之間無法通訊。 7. Symmetric NAT 與 Symmetric NAT也無法通訊 。

NAT型別定義
1. Full Cone NAT
:所有來自同一 個內部Tuple X的請求均被NAT轉換至同一個外部Tuple Y,而不管這些請求是不是屬於同一個應用或者是多個應用的。除此之外,當X-Y的轉換關係建立之後,任意外部主機均可隨時將Y中的地址和埠作為目標地址 和目標埠,向內部主機發送UDP報文,由於對外部請求的來源無任何限制,因此這種方式雖然足夠簡單,但卻不那麼安全

2. Restricted Cone NAT
: 它是Full Cone的受限版本:所有來自同一個內部Tuple X的請求均被NAT轉換至同一個外部Tuple Y,這與Full Cone相同,但不同的是,只有當內部主機曾經發送過報文給外部主機(假設其IP地址為Z)後,外部主機才能以Y中的資訊作為目標地址和目標埠,向內部 主機發送UDP請求報文,這意味著,NAT裝置只向內轉發(目標地址/埠轉換)那些來自於當前已知的外部主機的UDP報文,從而保障了外部請求來源的安 全性

3. Port Restricted Cone NAT
:它是Restricted Cone NAT的進一步受限版。只有當內部主機曾經發送過報文給外部主機(假設其IP地址為Z且埠為P)之後,外部主機才能以Y中的資訊作為目標地址和目標端 口,向內部主機發送UDP報文,同時,其請求報文的源埠必須為P,這一要求進一步強化了對外部報文請求來源的限制,從而較Restrictd Cone更具安全性

4. Symmetric NAT
:這是一種比所有Cone NAT都要更為靈活的轉換方式:在Cone NAT中,內部主機的內部Tuple與外部Tuple的轉換對映關係是獨立於內部主機所發出的UDP報文中的目標地址及埠的,即與目標Tuple無關; 在Symmetric NAT中,目標Tuple則成為了NAT裝置建立轉換關係的一個重要考量:只有來自於同一個內部Tuple 、且針對同一目標Tuple的請求才被NAT轉換至同一個外部Tuple,否則的話,NAT將為之分配一個新的外部Tuple;打個比方,當內部主機以相 同的內部Tuple對2個不同的目標Tuple傳送UDP報文時,此時NAT將會為內部主機分配兩個不同的外部Tuple,並且建立起兩個不同的內、外部 Tuple轉換關係。與此同時,只有接收到了內部主機所傳送的資料包的外部主機才能向內部主機返回UDP報文,這裡對外部返回報文來源的限制是與Port Restricted Cone一致的。不難看出,如果說Full Cone是要求最寬鬆NAT UDP轉換方式,那麼,Symmetric NAT則是要求最嚴格的NAT方式,其不僅體現在轉換關係的建立上,而且還體現在對外部報文來源的限制方面。

NAT型別檢測

    前提條件:有一個公網的Server並且綁定了兩個公網IP(IP-1,IP-2)。這個Server做UDP監聽(IP-1,Port-1),(IP-2,Port-2)並根據客戶端的要求進行應答。

第一步:檢測客戶端是否有能力進行UDP通訊以及客戶端是否位於NAT後?

    客戶端建立UDP socket然後用這個socket向伺服器的(IP-1,Port-1)傳送資料包要求伺服器返回客戶端的IP和Port, 客戶端傳送請求後立即開始接受資料包,要設定socket Timeout(300ms),防止無限堵塞. 重複這個過程若干次。如果每次都超時,無法接受到伺服器的迴應,則說明客戶端無法進行UDP通訊,可能是防火牆或NAT阻止UDP通訊,這樣的客戶端也就 不能P2P了(檢測停止)。 
    當客戶端能夠接收到伺服器的迴應時,需要把伺服器返回的客戶端(IP,Port)和這個客戶端socket的 (LocalIP,LocalPort)比較。如果完全相同則客戶端不在NAT後,這樣的客戶端具有公網IP可以直接監聽UDP埠接收資料進行通訊(檢 測停止)。否則客戶端在NAT後要做進一步的NAT型別檢測(繼續)。

第二步:檢測客戶端NAT是否是Full Cone NAT?

    客戶端建立UDP socket然後用這個socket向伺服器的(IP-1,Port-1)傳送資料包要求伺服器用另一對(IP-2,Port-2)響應客戶端的請求往回 發一個數據包,客戶端傳送請求後立即開始接受資料包,要設定socket Timeout(300ms),防止無限堵塞. 重複這個過程若干次。如果每次都超時,無法接受到伺服器的迴應,則說明客戶端的NAT不是一個Full Cone NAT,具體型別有待下一步檢測(繼續)。如果能夠接受到伺服器從(IP-2,Port-2)返回的應答UDP包,則說明客戶端是一個Full Cone NAT,這樣的客戶端能夠進行UDP-P2P通訊(檢測停止)。

第三步:檢測客戶端NAT是否是Symmetric NAT?

    客戶端建立UDP socket然後用這個socket向伺服器的(IP-1,Port-1)傳送資料包要求伺服器返回客戶端的IP和Port, 客戶端傳送請求後立即開始接受資料包,要設定socket Timeout(300ms),防止無限堵塞. 重複這個過程直到收到迴應(一定能夠收到,因為第一步保證了這個客戶端可以進行UDP通訊)。 
用同樣的方法用一個socket向伺服器的(IP-2,Port-2)傳送資料包要求伺服器返回客戶端的IP和Port。 
比 較上面兩個過程從伺服器返回的客戶端(IP,Port),如果兩個過程返回的(IP,Port)有一對不同則說明客戶端為Symmetric NAT,這樣的客戶端無法進行UDP-P2P通訊(檢測停止)。否則是Restricted Cone NAT,是否為Port Restricted Cone NAT有待檢測(繼續)。

第四步:檢測客戶端NAT是否是Restricted Cone NAT還是Port Restricted Cone NAT?

    客戶端建立UDP socket然後用這個socket向伺服器的(IP-1,Port-1)傳送資料包要求伺服器用IP-1和一個不同於Port-1的埠傳送一個UDP 資料包響應客戶端, 客戶端傳送請求後立即開始接受資料包,要設定socket Timeout(300ms),防止無限堵塞. 重複這個過程若干次。如果每次都超時,無法接受到伺服器的迴應,則說明客戶端是一個Port Restricted Cone NAT,如果能夠收到伺服器的響應則說明客戶端是一個Restricted Cone NAT。以上兩種NAT都可以進行UDP-P2P通訊。

:以上檢測過程中只說明瞭可否進行UDP-P2P的打洞通訊,具體怎麼通訊一般要藉助於Rendezvous Server。另外對於Symmetric NAT不是說完全不能進行UDP-P2P達洞通訊,可以進行埠預測打洞,不過不能保證成功。