1. 程式人生 > >NAT閘道器和NAT穿越原理

NAT閘道器和NAT穿越原理

轉自:https://blog.csdn.net/chance_yin/article/details/37913963


一、原理圖

1、背景資訊:

 (1)我們模擬的情形是位於網路A下的內網主機UserA 想要和位於網路B下的內網主機UserB進行點對點通訊,剛開始的時候UserA和UserB都不知道對方的公網和內網IP地址及埠號,所以必須要再公網上搭建一個伺服器C,伺服器C主要的任務就是維護一張使用者名稱到(主機的公網IP+埠號)的對映表,這樣使用者就可以從伺服器C上獲取UserB的公網IP和地址

 (2)UserA在區域網內發的IP包源地址是192.168.1.100:3000,該IP包經過路由器A後會被路由器A修改成能夠在公網傳輸的公網IP地址和公網埠號:125.71.229.217:4001。UserB向公網傳送報文路由器B也會對它做同樣處理。


2、NAT穿越:

 STEP1:  假設UserA想要給UserB傳送訊息,那麼UserA就會讓伺服器C通知UserB先進行打洞操作。

 STEP2: UserB收到打洞通知後,就傳送IP包(目地址:125.71.229.217:4001,源地址:202.108.22.5:6002)給路由器A。路由器A收到該IP包後會檢視源地址(202.108.22.5:6002),路由器發現區域網之前沒有請求過該源地址,所以路由器會過濾掉此包。(這一步就相當於打了個洞)

STEP3: 現在到了最後UserA給UserB傳送訊息的一步,UserA通過路由器A發出IP資料包(目地址:202.108.22.5:6002,源地址:125.71.229.217:4001)給路由器B,同樣路由器B要檢視該IP包的源地址(125.71.229.217:4001),因為在STEP2中路由器B給路由器A傳送過對此地址的請求(最後被丟掉的那個包),所以路由器B不會丟掉該包。接下來路由器B會讀取IP包的目的地址202.108.22.5:6002,然後通過對映錶轉換成內網IP地址和埠號:192.168.1.100:3000,這樣就可以傳送報文給主機UserB了。


3、其他:

(1)對稱路由器和非對稱路由器

實際上上面的NAT穿越技術只適合錐形路由器(非對稱路由器),說道這就要講一下什麼是對稱路由器和非對稱路由器了:

非對稱路由器:將同一內網IP  (比如:192.168.1.100:3000) 訪問不同外網地址比如百度和谷歌時對映成的公網IP和公網埠是相同的(比如都是:202.108.22.5:6002)。

反之,對稱路由器就是:將同一內網IP(比如192.168.1.100:3000)訪問不同網路地址比如百度和谷歌時對映成的公網IP和公網埠是不同的(比如訪問百度時對映成:202.108.22.5:6002,訪問谷歌時對映成:125.71.229.217:4001)


回到2中講的NAT穿越技術,顯然,UserA想給UserB傳送訊息,前提是:UserB 給UserA傳送訊息(打洞操作)和UserB給伺服器C傳送訊息(註冊自己的公網IP)用的公網IP地址和埠號是相同的。所以NAT穿越只適合非對稱路由器。


(2)不能用TCP做NAT穿越,只能用UDP做NAT穿越。


因為:tcp是基於連線的通訊,而路由器會把來自同一主機的同一埠號上的不同tcp連線對映成不同的公網埠號。反之,UDP不是基於連線的傳輸協議,所以使用UDP就可以將不同的網路請求對映成同一公網源地址和公網埠號。體現到實際程式設計中就是:同一檔案描述符通過路由器可以對映成同一公網IP地址和埠號。不同檔案描述符通過路由器要被對映成同一公網地址和不同的公網埠號。


UserA 和 伺服器C通訊(註冊自己的公網IP)時,需要建立一個檔案描述符 fd1;UserA  和 UserB通訊時還要再建立一個描述符 fd2。 路由器對不同描述符做對映時,會把不同的描述符對映到不同的公網埠號上。

比如:UserA  的檔案描述符fd1 繫結到了埠3000上,檔案描述符 fd 通過埠複用也繫結到了埠3000上;但路由器在做對映時,會將這兩個檔案描述符代表的tcp連線對映成如下格式(eg:) 192.168.1.100:3000 <->202.108.22.5:6002;   192.168.1.100:3000 <-> 202.108.22.5:6003

使用UDP可以完成NAT穿越:

因為UserA 通過檔案描述符fd1 和 伺服器C通訊,然後UserA可以繼續用此fd1和UserB通訊,這樣路由器就會把同一內網地址上的同一埠號發出的請求對映成同一公網地址。
---------------------
作者:向淺
來源:CSDN
原文:https://blog.csdn.net/chance_yin/article/details/37913963
版權宣告:本文為博主原創文章,轉載請附上博文連結!