P2P學習(一)NAT的四種類型以及類型探測


一:NAT類型

基於UDP的P2P應用需要考慮NAT的類型,因為不同的NAT組合的穿透的方式並不一致,有的能通, 有的不能通。一般來講, NAT可以分為四種類型,分別是:

1,  全錐型(Full Cone)

2,  受限錐型(Restricted Cone), 或者說是IP受限錐型 3,  端口受限錐型(Port Restricted Cone), 或者說是IP + PORT受限錐型 4,  對稱型(Symmetric)

其中1,2,3屬於同一種類型,都是錐型,區別只是路由器的不同的安全策略。還有些NAT不屬於這四種中的任何一種,就不在本文的討論范圍了。

二:為什么有四種類型的NAT

NAT緩解了IPV4地址不夠用的問題,同時也帶了限制,那就是NAT外部的主機無法主動跟位於NAT內部的主機通信,NAT內部主機想要通信,必須主動和公網的一個IP通信,路由器負責建立一個映射關系,從而實現數據的轉發, 這就是NAT的工作原理

(一)NAT使用案例

公網server1 ip是1.1.1.1, 監聽端口是1111

公網server2 ip是2.2.2.2, 監聽端口是2222

NAT router ip是8.8.8.8

NAT內部client是192.168.0.3

client發送數據的時候,不管是tcp還是udp必須本地綁定一個端口,一般來講,這個過程都是自動的。

假定client(192.168.0.3, 100)給 server(1.1.1.1, 1111)發送報文,報文到達路由器,

路由器在自己的公網ip上開辟一個端口800,從而建立了一個隱射關系(8.8.8.8, 800)<--->(192.168.0.3, 100),  

建立映射關系后,所以(192.168.0.3, 100)和(1.1.1.1, 1111)之間的報文都通過這個映射關系進行轉發。

(二)NAT之間主要的區別分兩種情況討論

1:client(192.168.0.3, 100)和server(1.1.1.1, 1111)在路由器上建立好映射關系后,如果client(192.168.0.3, 100)又給(2.2.2.2, 2222)發送數據,路由器該怎么處理呢?

1,  復用舊的映射關系(8.8.8.8, 800)<--->(192.168.0.3, 100)和(2.2.2.2, 2222)通信, 這就是錐型(Cone) NAT---(分為下面的3個小類) 2,  創建新的映射關系(8.8.8.8, 801)<--->(192.168.0.3, 100)和(2.2.2.2, 2222)通信, 這就是對稱型NAT

注:  (8.8.8.8, 801)只是舉例,到底用什么端口取決於路由器的端口管理策略,總之是另外的一個端口,有的路由器有多個公網IP,不同的IP也會參與到這個映射關系中。

2:client(192.168.0.3, 100)和server(1.1.1.1, 1111)在路由器上建立好映射關系后,如果這個時候路由器(8.8.8.8)在800端口上收到從另外一台server(2.2.2.2, 2222)發來的數據,是不是應該轉發給(192.168.0.3, 100)呢

有四種情況:

1, 無條件轉發給(192.168.0.3, 100), 這就是全錐型(Full Cone)NAT。 2, 如果(192.168.0.3, 100)之前給(2.2.2.2)發送過數據,則轉發, 這就是受限錐型(Restricted Cone)。 3, 如果(192.168.0.3, 100)之前給(2.2.2.2, 2222)發送過數據,則轉發, 這就是端口受限錐型(Port Restricted Cone)。 4, 丟棄報文,拒絕轉發, 這就是對稱型NAT。

從上面也描述也可以看出,安全性系數,  對稱型 > 端口受限錐型 > 受限錐型 > 全錐型

(三)不同NAT的穿透性

對稱nat無法穿透,這個說法不正確,對稱nat與全椎full cone nat、對稱nat 與 ip受限椎型cone,是可以穿透的,對稱nat與 端口受限、對稱nat與對稱nat,不可穿透。
類型:

1、full cone 全椎
2、Restricted Cone ip受限
3、port Restricted Cone 端口受限
4、Symmetric 對稱。

穿透關系:上述4種類型,如果定義他們的值為序列號,N為序列號相加。

則N<=6可穿透。2 和 4 序列相加 = 6 則可穿透。 
3(端口受限)和4(對稱)= 7 不可穿透。

三:p2p網絡中的NAT穿透問題---NAT的原理和類型

(一)完全圓錐型NAT (Full Cane NAT)

完全圓錐型的NAT,將從同一內部IP地址和端口來的所有請求,都映射到相同的外部IP地址和端口。而且,任何外部主機通過向映射的外部地址發送報文,可以實現和內部主機進行通信。

這是一種比較寬松的策略只要建立了內部網絡的IP地址和端口與公網IP地址和端口的映射關系,則所有Internet上的主機都可以訪問該NAT之后的主機!!! 

 

在圖中,NAT會將內網地址{X:y} (x代表內網主機的IP地址,Y代表端口)映射成公網地址{A:b}(A代表映射的公網IP地址,b代表映射的端口)並綁定。任何數據分組都可以通過地址{A:b}送到此內網主機。

(二)受限圓錐型NAT ( Restricted Cone NAT)--IP受限

受限圓錐型NAT也是將從相同的內部IP地址和端口來的所有請求,映射到相同的公網IP地址和端口。

但是與完全圓錐型NAT不同,當且僅當內網主機之前己經向公網主機(假設IP地址為P)發送過數據分組,此公網主機才能夠向內網主機發送數據分組

在圖中,NAT會將內網地址{x:y}映射成公網地址{A:b〕並綁定,只有源地址為P的分組才能和此內網主機通信。

(三)端口受限圓錐型NAT ( Port Restricted Cone NAT)--IP+port受限

類似於受限圓錐型NAT,但更嚴格。端口受限圓錐型NAT增加了端口號的限制,當且僅當內網主機之前已經向公網主機發送了數據分組,公網主機才能和此內網主機通信。

在圖中,NAT會將內網地址{X:y}映射成公網地址{A:b}並綁定,由於內網主機之前己經分別與地址為M,端口為n的公網主機以及地址為P,端口為q的公網主機通信,所以只有來自這兩個公網地址和端口的分組才能到達內網主機

(四)對稱型NAT CSymmetric NAT)----重點理解

對稱型NAT把從同一內網地址和端口相同的地址和端口的所有請求都映射到同一個公網地址和端口

如果同一個內網主機,用相同的內網地址和端口向另一個地址發送數據分組,則會使用不同的映射而且公網主機只有在接收到數據分組后,才能向與發送分組的內網主機進行通信。可見,對稱性NAT是所有NAT類型中限制最為嚴格的。

在圖中,對稱型NAT會將內網地址{X:y}轉換成公網地址{A:b}並綁定為{X:y}|{A:b}<一>{P:q}。這就意味着NAT只允許地址{A:b}接收來自{P:q}的分組,將它轉給{X:y} 。當客戶機請求一個不同的公網地址{M:n}時,NAT會新分配一個外部端口{C:d} 。 

轉載自:https://blog.csdn.net/eydwyz/article/details/87364157

P2P技術詳解(一):NAT詳解——詳細原理、P2P簡介 

四:NAT類型判斷

NAT類型的檢測,查看主機所在的NAT網關(提供真正的外網IP地址,而不是偽外網IP地址)是屬於哪種NAT類型,是否可以打洞成功。

下面就看一下這個整體的判斷邏輯,當然在這之前要有一個限定條件,就是在雲端一定要部署一個STUN服務。這個STUN服務要有兩個IP地址和端口,這兩個IP地址的作用稍后會在邏輯判斷的過程中介紹。

(一)NAT類型判斷流程

1.首先客戶端要發送一個ECHO請求給服務端(提供STUN服務),服務端收到請求之后,通過同樣的IP地址和端口,給我們返回一個信息回來。

2.那在客戶端就要等這個消息回復,那么設置一個超時器,看每個消息是否可以按時回來,那如果我們發送的數據沒有回來,則說明這個UDP是不通的,我們就不要再進行判斷了(網絡不通,不需要判斷)。

3.如果我們收到了服務端的響應,那么就能拿到我們這個客戶端出口的公網的IP地址和端口,這個時候要判斷一下公網的IP地址和本機的IP地址(NAT內部地址!!!是否是一致的,如果是一致的,說明本機沒有在NAT之后而是一個公網地址;

4.接下來要做進一步判斷,就是判斷我們的公網地址是不是一個完全的公網地址,這時我們再發送一個信息到第一個IP地址和端口,那服務端收到這個請求之后呢,它使用第二個IP地址和端口給我們回消息,如果我們真是一個完全的公網IP地址和端口提供一個服務的話,那其他任何公網上的主機都可以向我發送請求和回數據,這時候我都是能收到的,那如果我能收到,那就說明就是一個公網的地址,所以我們就沒有在NAT之后就完全可以接收數據了。

5.那如果我們收不到,那說明我是在一個防火牆之后,而且一個對稱的防火牆。(可以認為與對稱NAT一樣)

6.如果我收到的公網的IP與我本地的IP不一致,那就說明我們確實是在NAT之后,那既然是在NAT之后我們就要對各種類型作判斷了

7.這時我們再發送一個請求到服務端的第一個IP地址和端口,而服務端通過第二個IP地址和端口給我們回消息,那這時候我們要判斷NAT的類型是不是完全錐型,如果我們出去一個請求,在我們的NAT服務和網關上建立了一個內網地址和外網地址的映射表之后,那其他公網上的主機都可以向我這個公網IP地址(含端口)發送消息,並且我可以接收到,那么這個時候可以收到的話,我們就是一個完全錐型NAT

8.那么如果收不到的話,需要做進一步的判斷,這時候需要(客戶端主動發送數據,用來探測對稱型向服務端的第二個IP地址和端口發送數據,那么此時服務端會用同樣的IP地址和端口給我們回數據,那么這時候它也會帶回一個公網的IP地址來,但是如果我們的出口,就是向第二個IP地址發送了請求帶回的外網IP與端口與我們第一發送的請求帶回的IP地址和端口(主要是端口)如果是不一樣的,那就說明是對稱型NAT;---對稱型NAT每次出去都會在映射表上形成不同的外網IP地址和端口!!!!

9.如果一樣(沒有修改映射表,沒有新建一個映射關系,即是說明客戶端的外網IP和端口不變)就說明是限制型的,限制型分為兩種一種是IP限制型,一種是端口限制型,所以還需要做進一步的檢測。這個時候客戶端主動再向服務端第一個IP地址和端口發送一個請求如果服務端回信息時使用的是之前回復消息所使用的同一個IP地址,但是不是同一個的端口號,那么這時候我們就可以判斷是否可以接收到,如果不能接收到,說明是對端口做了限制,所以是端口限制型的NAT如果可以收到就說明是一個IP地址限制型的NAT。

經過這樣一個邏輯判斷之后 ,我就可以知道我們自己這台在內網的主機是什么NAT類型了。

(二)回顧判斷過程

了解了邏輯之后,我們再來看一下檢測過程:

1.首先是我們的客戶端,向服務端的第一IP地址和端口,發送一個請求;之后服務端回送一個響應(包含客戶端的官網IP和端口信息)給客戶端。如果回來這個地址(響應信息中獲取得到的IP地址)和我們之前發送的地址(NAT內網地址)是一致的,那就是公網的。如果不一致說明我們是在NAT之后,這是第一次檢測。----檢測是公網主機還是位於NAT網關后面的內網主機(不用太考慮下圖中的客戶端的端口信息)

2.再接下來就是檢測是對稱型還是限制性NAT。首先,如左圖所示客戶端向服務器第一個IP地址發送了一個請求 ,然后再如右圖所示,客戶端向服務端第二個IP地址發送一個請求。如果兩次回復的響應中的主機公網IP地址和端口與上次回來的公網IP地址與端口是不一樣的,它就是對稱型NAT;如果一樣還需要進一步判斷。

3.接下來檢測是否是完全錐型NAT。是否再接下來就是客戶端向服務端第一個IP地址發送了一個請求 ,然后它通過第二個IP地址給我回一個請求,如果可以接收到,就表示為完全椎型,否則不是完全椎型。(不用太考慮下圖中的客戶端的端口信息)

4.緊接着再發送一個請求到第一個這個地址,那么它用這個地址的第二個端口向我回消息,如果這時候我是能收到的,說明是IP地址限制錐型NAT,如果不能收到說明是端口限制錐型

以上就是我們NAT檢測基本的一個過程。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM