NAT打洞原理(轉)

NAT路由器打洞原理

什麼是打洞,爲什麼要打洞

由於Internet的快速發展 IPV4地址不夠用,不能每個主機分到一個公網IP 所以使用NAT地址轉換。

下面是我在網上找到的一副圖

 

一般來說都是由私網內主機(例如上圖中“電腦A-01”)主動發起連接,數據包經過NAT地址轉換後送給公網上的服務器(例如上圖中的“Server”),連接建立以後可雙向傳送數據,NAT設備允許私網內主機主動向公網內主機發送數據,但卻禁止反方向的主動傳遞,但在一些特殊的場合需要不同私網內的主機進行互聯(例如P2P軟件、網絡會議、視頻傳輸等),TCP穿越NAT的問題必須解決。

 

下面是NAT的幾種類型

NAT設備的類型對於TCP穿越NAT,有着十分重要的影響,根據端口映射方式,NAT可分爲如下4類,前3種NAT類型可統稱爲cone類型。
(1)全克隆( Full Cone) : NAT把所有來自相同內部IP地址和端口的請求映射到相同的外部IP地址和端口。任何一個外部主機均可通過該映射發送IP包到該內部主機。
(2)限制性克隆(Restricted Cone) : NAT把所有來自相同內部IP地址和端口的請求映射到相同的外部IP地址和端口。但是,只有當內部主機先給IP地址爲X的外部主機發送IP包,該外部主機才能向該內部主機發送IP包。
(3)端口限制性克隆( Port Restricted Cone) :端口限制性克隆與限制性克隆類似,只是多了端口號的限制,即只有內部主機先向IP地址爲X,端口號爲P的外部主機發送1個IP包,該外部主機才能夠把源端口號爲P的IP包發送給該內部主機。
(4)對稱式NAT ( Symmetric NAT): 對稱式NAT與端口限制性克隆類似,唯一不同的是當同一內部主機使用相同的端口與不同IP地址或端口的外部主機進行通信時, NAT對該內部主機的端口映射會有所不同,這種情況下NAT會針對不同IP地址或端口的外部主機爲內部主機的相同端口分配新的外部端口號。對稱式NAT不保證所有會話中的私有地址端口和公開地址端口之間綁定的一致性。相反,它爲每個新的會話分配一個新的端口號。這種情況下內部主機的“內網IP地址和端口”與“NAT IP地址和端口”之間會形成一對多關係。

 

這是我在網上找到的另一份關於NAT四種類型的解釋,我覺得這個敘述更加清楚明瞭,這裏寫下來作爲補充,請按照順序和上面敘述的四種NAT類型進行對照理解:

從內網主機發出報文訪問外網目標時,可用四元組[源IP,源端口,目標IP,目標端口]來表示會話:
[私有源地址,私有源端口,全局目標地址,全局目標端口]
     ↓NAT
[全局源地址,全局源端口,全局目標地址,全局目標端口]
   NAT在對不同的私有源地址進行轉換的時候,可能轉換成同一全局源地址,也可能轉換成不同的全局源地址(如果NAT地址池配置有多個全局地址)。
   而對於同一私有源地址和端口的轉換情況則分爲以下幾種:
(1)完全Cone NAT 無論目標地址和端口怎樣,每次都把該私有源IP地址/端口映射到同一個全局源地址/端口;外網的任何主機都可以發送報文到該映射的全局地址而訪問到該內部主機。路由器的靜態地址映射就是屬於這種。
(2)限制Cone NAT 地址/端口映射的情況同完全Cone NAT的,但外網的主機要訪問內網主機,該內網主機必須先發送過報文給該外網主機的地址。
(3)端口限制Cone NAT 地址/端口映射情況同完全Cone NAT的,但外網主機要訪問內網主機,該內網主機必須先發送過報文給該外網主機的地址和端口。大多數路由器的NAPT就是屬於這種情況。本文後面論及的Cone NAT也是指這種情況。

(4)Symmetric NAT 對不同的目標地址/端口,源私有地址映射到源全局地址不變,但是映射的全局端口會改變。外網主機必須先收到過內網主機的報文,才能訪問到該內網主機。一些路由器和防火牆產品的NAT就是屬於這種情況。

    Symmetric NAT並不對新會話進行端口綁定,而是分配一個全新的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會分配NAT地址155.99.25.11:62000給Session1,然後分配另一個不同的NAT地址155.99.25.11:62001給Session2.對稱NAT能夠區別兩個不同的會話並進行地址轉換,應用程序每發出一個會話都會使用一個新的端口.

 

下面我們接着來看看對NAT進行打洞的流程與原理

先假設:有一個服務器S在公網上有一個IP,兩個私網分別由NAT-A和NAT-B連接到公網,NAT-A後面有一臺客戶端A,NAT-B後面有一臺客戶端B,現在,我們需要藉助S將A和B建立直接的TCP連接,即由B向A打一個洞,讓A可以沿這個洞直接連接到B主機,就好像NAT-B不存在一樣。

實現過程如下:
1、 S啓動兩個網絡偵聽,一個叫【主連接】偵聽,一個叫【協助打洞】的偵聽。
2、 A和B分別與S的【主連接】保持聯繫。
3、 當A需要和B建立直接的TCP連接時,首先連接S的【協助打洞】端口,併發送協助連接申請。同時在該端口號上啓動偵聽。注意由於要在相同的網絡終端上綁定到不同的套接字上,所以必須爲這些套接字設置 SO_REUSEADDR 屬性(即允許重用),否則偵聽會失敗。
4、 S的【協助打洞】連接收到A的申請後通過【主連接】通知B,並將A經過NAT-A轉換後的公網IP地址和端口等信息告訴B。
5、 B收到S的連接通知後首先與S的【協助打洞】端口連接,隨便發送一些數據後立即斷開,這樣做的目的是讓S能知道B經過NAT-B轉換後的公網IP和端口號。
6、 B嘗試與A的經過NAT-A轉換後的公網IP地址和端口進行connect,根據不同的路由器會有不同的結果,有些路由器在這個操作就能建立連接,大多數路由器對於不請自到的SYN請求包直接丟棄而導致connect失敗,但NAT-B會紀錄此次連接的目標地址和端口號(即A經過NAT-A轉換後的公網IP和端口號),爲接下來真正的連接做好了準備,這就是所謂的打洞,即B向A打了一個洞,下次A就能直接連接到B剛纔使用的端口號了。
7、 客戶端B打洞的同時在相同的端口上啓動偵聽。B在一切準備就緒以後通過與S的【主連接】回覆消息“我已經準備好”,S在收到以後將B經過NAT-B轉換後的公網IP和端口號告訴給A。
8、 A收到S回覆的B的公網IP和端口號等信息以後,開始連接到B公網IP和端口號(此時NAT-A也會紀錄此次連接的目標地址和端口號(即B經過NAT-B轉換後的公網IP和端口號),即A也向B打了一個洞,之後B也能直接連接到A的公網IP和端口號了),由於在步驟6中B曾經嘗試連接過A的公網IP地址和端口,NAT-B紀錄了此次連接的信息,所以當A主動連接B時,NAT-B會認爲是合法的SYN數據,並允許通過,從而直接的TCP連接建立起來了。

 

有了一定的知識補充,接下來開始實現UDP和TCP打洞。因爲沒幹過這個 可能要花一定的時間

 

本文轉自原文:http://www.cnblogs.com/yuanfan/archive/2010/12/17/1909379.html

發佈了6 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章