1. 程式人生 > >NAT與NAT穿透(一)

NAT與NAT穿透(一)

1. NAT簡介
前面的文章說到了針對IP不足的許多技術,但這些技術基本都不會增加可用的IP地址數.NAT(Network Address Translation)又稱"網路地址轉換",它是一種把內部私有網路地址翻譯成合法網路IP地址的技術,個人認為該技術是解決IP地址不足最有效的方法.它是一個IETF(Internet Engineering Task Force,Internet工程任務組)標準.
簡單地說,NAT就是在區域網內部使用私有地址(前面文章說到過每類IP地址都有私有地址),而當內部節點要與外部網路進行通訊時,就在閘道器(可以理解為出口)處將內部地址替換成公用地址,從而在公網(internet)上正常使用.通過這種方法,您可以只申請一個合法IP地址,就把整個區域網中的計算機接入Internet中.

2. NAT型別
NAT有三種類型:靜態NAT(Static NAT),動態地址NAT(Pooled NAT),網路地址埠轉換NAPT.

其中靜態NAT設定起來最為簡單和最容易實現的一種,內部網路中的每個主機都被永久對映成外部網路中的某個合法的地址.而動態地址NAT則是在外部網路中定 義了一系列的合法地址,採用動態分配的方法對映到內部網路.NAPT則是把內部地址對映到外部網路的一個IP地址的不同埠上.

網路地址埠轉換NAPT(Network Address Port Translation)是人們比較熟悉的一種轉換方式,NAPT普遍應用於接入裝置中,它可以將中小型的網路隱藏在一個合法的IP地址後面.這個優點在小型辦公室內非常實用,通過從ISP處申請的一個IP地址,將多個連線通過NAPT接入Internet.

2.1 NAPT型別:
NAPT主要分兩大類:錐形NAT和對稱NAT.
2.1.1 錐形NAT(Cone NAT):
Cone NAT的特點或者它區別與Symmetric NAT的特性是,通過地址轉換可以確保Client使用埠的"同一性",即這個Client只使用這個埠.
           Server S1                                     Server S2
        18.181.0.31:1235                              138.76.29.7:1235
               |                                             |
               |                                             |
               +----------------------+----------------------+
                                      |
          ^  Session 1 (A-S1)  ^      |      ^  Session 2 (A-S2)  ^
          |  18.181.0.31:1235  |      |      |  138.76.29.7:1235  |
          v 155.99.25.11:62000 v      |      v 155.99.25.11:62000 v
                                      |
                                   Cone NAT
                                 155.99.25.11
                                      |
          ^  Session 1 (A-S1)  ^      |      ^  Session 2 (A-S2)  ^
          |  18.181.0.31:1235  |      |      |  138.76.29.7:1235  |
          v   10.0.0.1:1234    v      |      v   10.0.0.1:1234    v
                                      |
                                   Client A
                                10.0.0.1:1234
                               
如上圖,假設Client A通過一個錐形NAT同時發起兩個外出的連線,它使用同一個內部埠(10.0.0.1:1234)給公網的兩臺不同的伺服器S1和S2.錐形NAT只分配一個公網IP和埠(155.99.25.11:62000)給這個兩個會話.


2.1.2 對稱NAT(Symmetric NAT):
對稱NAT,與Cone NAT是大不相同的,並不對會話進行埠繫結,而是分配一個全新的公網埠給每一個新的會話.
     Server S1                                     Server S2
        18.181.0.31:1235                              138.76.29.7:1235
               |                                             |
               |                                             |
               +----------------------+----------------------+
                                      |
          ^  Session 1 (A-S1)  ^      |      ^  Session 2 (A-S2)  ^
          |  18.181.0.31:1235  |      |      |  138.76.29.7:1235  |
          v 155.99.25.11:62000 v      |      v 155.99.25.11:62001 v
                                      |
                                 Symmetric NAT
                                 155.99.25.11
                                      |
          ^  Session 1 (A-S1)  ^      |      ^  Session 2 (A-S2)  ^
          |  18.181.0.31:1235  |      |      |  138.76.29.7:1235  |
          v   10.0.0.1:1234    v      |      v   10.0.0.1:1234    v
                                      |
                                   Client A
                                10.0.0.1:1234
如上圖,如果Client A同時發起兩個會話到S1和S2,對稱NAT會分配公共地址155.99.25.11:62000給Session1,然後分配另一個不同的公共地址155.99.25.11:62001給Session2.對稱NAT能夠區別兩個不同的會話並進行地址轉換,應用程式每發出一個會話都會使用一個新的埠.

2.2 錐形NAT型別:
錐形NAT在根據如何能建立端到端有效連線上有更多的分類.這個分類一般應用在Udp通訊(而不是Tcp通訊上),因為NATs和防火牆阻止了試圖無條件傳入的TCP連線,除非明確設定NAT不這樣做.這些分類如下:

完全錐形(Full Cone):
在一個完全錐形NAT中,任務主機A都可以通過主機B對映在NAT上的外部地址發包給內部主機B.(A可在公網也可在內網,以下也是).
受限錐形(Restricted Cone):
在一個受限錐形NAT,只有內部主機B向其傳送過包的主機A才可以對這個內部主機B發包(通過主機B對映在NAT上的外部地址).
埠受限錐形(Port Restricted Cone):
埠受限錐形NAT與受限錐形NAT類似,但是增加了對埠的限制,如內部主機B向一個埠為q的主機A傳送過包,那麼只有從這個主機A的埠q發出的包才能被髮送到內部主機B上去。


3. NAPT具體型別介紹:
Full Cone NAT:
內網主機建立一個UDP socket(LocalIP:LocalPort),第一次使用這個socket給外部主機發送資料時NAT會給其分配一個公網(PublicIP:PublicPort),以後用這個socket向外面任何主機發送資料都將使用這對(PublicIP:PublicPort).此外,任何主機只要知道這個(PublicIP:PublicPort)就可以傳送資料給(PublicIP:PublicPort),內網的主機就能收到這個資料包

Restricted Cone NAT:
內網主機建立一個UDP socket(LocalIP:LocalPort),第一次使用這個socket給外部主機發送資料時NAT會給其分配一個公網(PublicIP:PublicPort),以後用這個socket向外面任何主機發送資料都將使用這對(PublicIP:PublicPort).此外,如果任何外部主機想要傳送資料給這個內網主機,只要知道這個(PublicIP:PublicPort)並且內網主機之前用這個socket曾向這個外部主機IP傳送過資料.只要滿足這兩個條件,這個外部主機就可以用自己的(IP,任何埠)傳送資料給(PublicIP:PublicPort),內網的主機就能收到這個資料包.

Port Restricted Cone NAT:

內網主機建立一個UDP socket(LocalIP:LocalPort),第一次使用這個socket給外部主機發送資料時NAT會給其分配一個公網(PublicIP:PublicPort),以後用這個socket向外面任何主機發送資料都將使用這對(PublicIP:PublicPort).此外,如果任何外部主機想要傳送資料給這個內網主機,只要知道這個(PublicIP:PublicPort)並且內網主機之前用這個socket曾向這個外部主機(IP,Port)傳送過資料.只要滿足這兩個條件,這個外部主機就可以用自己的(IP,Port)傳送資料給(PublicIP:PublicPort),內網的主機就能收到這個資料包.

Symmetric NAT:

內網主機建立一個UDP socket(LocalIP,LocalPort),當用這個socket第一次發資料給外部主機1時,NAT為其對映一個(PublicIP-1,Port-1),以後內網主機發送給外部主機1的所有資料都是用這個(PublicIP-1,Port-1),如果內網主機同時用這個socket給外部主機2傳送資料,第一次傳送時,NAT會為其分配一個(PublicIP-2,Port-2),以後內網主機發送給外部主機2的所有資料都是用這個(PublicIP-2,Port-2).此外,如果任何外部主機A想要傳送資料給這個內網主機B,只要知道B向A傳送資料時NAT為其對映的(PublicIP:PublicPort),並且B之前用這個socket曾向這個外部主機A傳送過資料.滿足這兩個條件,這個外部主機A就可以用自己的(IP,任何埠)傳送資料給(PublicIP:PublicPort),內網的主機就能收到這個資料包.這種NAT無法實現UDP-P2P通訊,這個以後會介紹到.


4. NAPT具體型別檢測
前提條件:有一個公網的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是否是Symmetric NAT還是Cone 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通訊(檢測停止).否則是Cone NAT,具體Cone NAT型別有待進一步檢測(繼續).

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

客戶端建立UDP socket然後用這個socket向伺服器的(IP-1,Port-1)傳送資料包要求伺服器用另一對(IP-2,Port-2)響應客戶端的請求往回發一個數據包,客戶端傳送請求後立即開始接受資料包,要設定socket Timeout(300ms),防止無限堵塞. 重複這個過程若干次.如果能夠接受到伺服器從(IP-2,Port-2)返回的應答UDP包,則說明客戶端是一個Full Cone NAT.(檢測停止).如果每次都超時,無法接受到伺服器的迴應,則說明客戶端的NAT不是一個Full 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.