natp資料

引言
近年來,隨着Internet的迅猛發展,連入Internet的主機數量成倍增加。因爲最初設計Internet的時候並無考慮到須要支持這麼大的規 模,於是Internet使用的Ipv4協議中IP地址的長度選擇了32位,它可使IP包的格式很好地對齊;可是,目前IP地址的短缺已經成爲 Internet面臨的最大問題之一。
爲了解決IP地址短缺的問題,人們提出了許多解決方案,Internet可以支持到新一代IP協議Ipv6的出臺。在衆多的解決方案中,網絡地址轉換 NAT(Network Address Translation)技術提供了一種徹底將私有網和公共網隔離的方法,從而獲得了普遍的應用。圖1 NAT工做原理示意圖1 NAT技術
NAT技術的基本功能就是,用1個或幾個IP地址來實現1個私有網中的全部主機和公共網中主機的IP通訊。NAT技術可爲TCP、UDP以及ICMP數據包提供透明轉發。
1.1 NAT工做原理
NAT的基本工做原理是,當私有網主機和公共網主機通訊的IP包通過NAT網關時,將IP包中的源IP或目的IP在私有IP和NAT的公共IP之間進行轉換。

如圖1所示,NAT網關有2個網絡端口,其中公共網絡端口的IP地址是統一分配的公共IP,爲202.204.65.2;私有網絡端口的IP地址是保留地 址,爲192.168.1.1。私有網中的主機192.168.1.2向公共網中的主機166.111.80.200發送了1個IP包 (Des=166.111.80.200,Src=192.168.1.2)。當IP包通過NAT網關時,NAT會將IP包的源IP轉換爲NAT的公共 IP並轉發到公共網,此時IP包(Des=166.111.80.200,Src=202.204.65.2)中已經不含任何私有網IP的信息。因爲IP 包的源IP已經被轉換成NAT的公共IP,響應的IP包(Des=202.204.65.2,Src=166.111.80.200)將被髮送到NAT。 這時,NAT會將IP包的目的IP轉換成私有網中主機的IP,而後將IP包(Des=192.168.1.2,Src=166.111.80.200)轉 發到私有網。對於通訊雙方而言,這種地址的轉換過程是徹底透明的。
1.2 NAPT技術
因爲NAT實現是私有IP和NAT的公共IP之間的轉換,那麼,私有網中同時與公共網進行通訊的主機數量就受到NAT的公共IP地址數量的限制。爲了克服 這種限制,NAT被進一步擴展到在進行IP地址轉換的同時進行Port的轉換,這就是網絡地址端口轉換NAPT(Network Address Port Translation)技術。
    NAPT與NAT的區別在於,NAPT不只轉換IP包中的IP地址,還對IP包中TCP和UDP的Port進行轉換。這使得多臺私有網主機利用1個NAT公共IP就能夠同時和公共網進行通訊。

如圖2所示,私有網主機192.168.1.2要訪問公共網中的Http服務器166.111.80.200。首先,要創建TCP鏈接,假設分配的TCP Port是1010,發送了1個IP包(Des=166.111.80.200:80,Src=192.168.1.2:1010),當IP包通過NAT 網關時,NAT會將IP包的源IP轉換爲NAT的公共IP,同時將源Port轉換爲NAT動態分配的1個Port。而後,轉發到公共網,此時IP包 (Des=166.111.80.200:80,Src=202.204.65.2:2010)已經不含任何私有網IP和Port的信息。因爲IP包的源 IP和Port已經被轉換成NAT的公共IP和Port,響應的IP包 (Des=202.204.65.2:,Src=2010166.111.80.200:80)將被髮送到NAT。這時NAT會將IP包的目的IP轉換成 私有網主機的IP,同時將目的Port轉換爲私有網主機的Port,而後將IP包 (Des=192.168.1.2:1010,Src=166.111.80.200:80)轉發到私網。對於通訊雙方而言,這種IP地址和Port的轉 換是徹底透明的。數據庫

NAPTNetwork Address Port Translation)即網絡端口地址轉換,就是將多個內部地址映射爲一個合法公網地址,但以不一樣的協議端口號與不一樣的內部地址相對應。也就是<內部地址+內部端口><外部地址+外部端口>之間的轉換。NAPT廣泛用於接入設備中,它能夠將中小型的網絡隱藏在一個合法的IP地址後面。服務器

NAPT使得一組主機能夠共享惟一的外部地址,當位於內部網絡中的主機經過NAT設備向外部主機發起會話請求時,NAT設備就會查詢NAT表,看是否有相關會話記錄,若是有相關記錄,就會將內部IP地址及端口同時進行轉換,再轉發出去;若是沒有相關記錄,進行IP地址和端口轉換的同時,還會在NAT表增長一條該會話的記錄。外部主機接收到數據包後,用接受到的合法公網地址及端口做爲目的IP地址及端口來響應,NAT設備接收到外部回來的數據包,再根據NAT表中的記錄把目的地址及端口轉換成對應的內部IP地址及端口,轉發給該內部主機。網絡

如下給出了一個實例(如圖1-2),NAPT的基本過程與NAT相似,所不一樣的是:NAPT中內部端口與內部地址都進行了轉換,而NAT中僅僅只對內部地址進行轉換。數據結構

1-2 網絡端口地址轉換(NAPT)的基本過程測試

1-2中,4個帶有內部地址的數據包到達HiPER,其中數據包12來自同一個內部地址但有不一樣的源端口號,數據包34來自不一樣的內部地址但具備相同的源端口號。經過NAPT4個數據包都被轉換到同一個外部地址,但每一個數據包都賦予了不一樣的源端口號,所以區分了這4個數據包。當回覆數據包到達時,NAPT就能根據回覆數據包的目的地址和端口來區分該數據包應轉發到的內部主機。spa

Internet中使用NAPT時,全部不一樣的TCPUDP信息流看起來好像來源於同一個IP地址。這種方式經常使用於撥號上網,經過從ISP處申請的一個IP地址,將多個鏈接經過NAPT接入Internet。在實際使用中能夠把NAPT和基本NAT結合起來,即將一組外部地址和端口轉換結合起來。設計

NAPT爲每個Session分配一個NAPT本身的端口號,依據此端口號來判斷將收到的公網IP主機返回的TCP/IP數據包轉發給那臺內網IP地址的計算機。 在這裏Session是虛擬的,UDP通信並不須要創建鏈接,可是對於NAPT而言,的確要有一個Session的概念存在。NAPT對於UDP協議包的 透明傳輸面臨的一個重要的問題就是如何處理這個虛擬的Session。咱們都知道TCP鏈接的Session以SYN包開始,以FIN包結束,NAPT可 以很容易的獲取到TCP Session的生命週期,並進行處理。可是對於UDP而言,就麻煩了,NAPT並不知道轉發出去的UDP協議包是否到達了目的主機,也沒有辦法知道。而 且鑑於UDP協議的特色,可靠不好,所以NAPT必須強制維持Session的存在,以便等待將外部送回來的數據並轉發給曾經發起請求的內網IP地址的計 算機。NAPT具體如何處理UDP Session的超時呢?不一樣的廠商提供的設備對於NAPT的實現不近相同,也許幾分鐘,也許幾個小時,些NAPT的實現還會根據設備的忙碌狀態進行智能 計算超時時間的長短。blog

                  [192.168.0.6:1827]
                            | UDP Packet[src ip:192.168.0.6 src port:1827 dst ip:61.51.76.102 dst port 8098]
                            v
        [pub ip: 61.51.99.86]NAT[priv ip: 192.168.0.1]
                            | UDP Packet[src ip:61.51.99.86 src port:9881 dst ip:61.51.76.102 dst port 8098]
                            v                  
                  [61.51.76.102:8098]
                 
                                    圖四: NAPT 將內部發出的UDP協議包的源地址和源端口改變傳輸給公網IP主機。
                                   
                                   
                  [192.168.0.6:1827]
                            ^
                            | UDP Packet[src ip:61.51.76.102 src port:8098 dst ip:192.168.0.6 dst port 1827]
        [pub ip: 61.51.99.86]NAT[priv ip: 192.168.0.1]
                            ^  
                            | UDP Packet[src ip:61.51.76.102 src port:8098 dst ip:61.51.99.86 dst port 9881]   
                  [61.51.76.102:8098]
                 
                                    圖五: NAPT 將收到的公網IP主機返回的UDP協議包的目的地址和目的端口改變傳輸給內網IP計算機。                               
如今咱們大概明白了NAPT如何實現內網計算機和外網主機間的透明通信。如今來看一下咱們最關心的問題,就是NAPT是依據什麼策略來判斷是否要爲一個請求發出的UDP數據包創建Session的呢?主要有一下幾個策略:索引

A. 源地址(內網IP地址)不一樣,忽略其它因素, 在NAPT上確定對應不一樣的Session
B. 源地址(內網IP地址)相同,源端口不一樣,忽略其它的因素,則在NAPT上也確定對應不一樣的Session
C. 源地址(內網IP地址)相同,源端口相同,目的地址(公網IP地址)相同,目的端口不一樣,則在NAPT上確定對應同一個Session
D. 源地址(內網IP地址)相同,源端口相同,目的地址(公網IP地址)不一樣,忽略目的端口,則在NAPT上是如何處理Session的呢?生命週期

D的狀況正式咱們關心和要討論的問題。依據目的地址(公網IP地址)對於Session的創建的決定方式咱們將NAPT設備劃分爲兩大類:

Symmetric NAPT:
對於到同一個IP地址,任意端口的鏈接分配使用同一個Session; 對於到不一樣的IP地址, 任意端口的鏈接使用不一樣的Session.
咱們稱此種NAPT爲 Symmetric NAPT. 也就是隻要本地綁定的UDP端口相同, 發出的目的IP地址不一樣,則會創建不一樣的Session.

        [202.223.98.78:9696] [202.223.98.78:9696] [202.223.98.78:9696]
                ^               ^                       ^
                |               |                       |
                v               v                       v
               9883            9882                    9881
                                 |
                             [NAT] /
                                 ^
                                 |
                                 v                       
                          [192.168.0.6:1827]
                         
                          圖六: Symmetric 的英文意思是對稱。多個端口對應多個主機,平行的,對稱的!
                 
Cone NAPT:
對於到同一個IP地址,任意端口的鏈接分配使用同一個Session; 對於到不一樣的IP地址,任意端口的鏈接也使用同一個Session.
咱們稱此種NAPT爲 Cone NAPT. 也就是隻要本地綁定的UDP端口相同, 發出的目的地址不論是否相同, 都使用同一個Session.

        [202.223.98.78:9696] [202.223.98.78:9696] [202.223.98.78:9696]

                        ^          ^         ^
                                  |        /
                          v        v       v
                                 9881
                                 [NAT]
                                   ^
                                   |
                                   v                     
                          [192.168.0.6:1827]
                         
                          圖七: Cone 的英文意思是錐。一個端口對應多個主機,是否是像個錐子?

如今絕大多數的NAPT屬於後者,即Cone NAT。本人在測試的過程當中,只好使用了一臺日本的Symmetric NAT。還好不是本身的買的,我從不買日貨, 但願看這篇文章的朋友也自覺的不要購買日本的東西。Win9x/2K/XP/2003系統自帶的NAPT也是屬於 Cone NAT的。這是值的慶幸的,由於咱們要作的UDP穿透只能在Cone NAT間進行,只要有一臺不是Cone NAT,對不起,UDP穿透沒有但願了,服務器轉發吧。後面會作詳細分析!

下面咱們再來分析一下NAPT 工做時的一些數據結構,在這裏咱們將真正說明UDP能夠穿透Cone NAT的依據。這裏描述的數據結構只是爲了說明原理,不具備實際參考價值,真正感興趣能夠閱讀Linux的中關於NAT實現部分的源碼。真正的NAT實現 也沒有利用數據庫的,呵呵,爲了速度!

Symmetric NAPT 工做時的端口映射數據結構以下:

內網信息表:

[NAPT 分配端口] [ 內網IP地址 ] [ 內網端口 ] [ 外網IP地址 ] [ SessionTime 開始時間 ]

PRIMARY KEY( [NAPT 分配端口] ) -> 表示依據[NAPT 分配端口]創建主鍵,必須惟一且創建索引,加快查找.
UNIQUE( [ 內網IP地址 ], [ 內網端口 ] ) -> 表示這兩個字段聯合起來不能重複.
UNIQUE( [ 內網IP地址 ], [ 內網端口 ], [ 外網IP地址 ] ) -> 表示這三個字段聯合起來不能重複.

映射表:

[NAPT 分配端口] [ 外網端口 ]

UNIQUE( [NAPT 分配端口], [ 外網端口 ] ) -> 表示這兩個字段聯合起來不能重複.

Cone NAPT 工做時的端口映射數據結構以下:

內網信息表:

[NAPT 分配端口] [ 內網IP地址 ] [ 內網端口 ] [ SessionTime 開始時間 ]

PRIMARY KEY( [NAPT 分配端口] ) -> 表示依據[NAPT 分配端口]創建主鍵,必須惟一且創建索引,加快查找.
UNIQUE( [ 內網IP地址 ], [ 內網端口 ] ) -> 表示這兩個字段聯合起來不能重複.

外網信息表:

[ wid 主鍵標識 ] [ 外網IP地址 ] [ 外網端口 ]

PRIMARY KEY( [ wid 主鍵標識 ] ) -> 表示依據[ wid 主鍵標識 ]創建主鍵,必須惟一且創建索引,加快查找.
UNIQUE( [ 外網IP地址 ], [ 外網端口 ] ) -> 表示這兩個字段聯合起來不能重複.

映射表: 實現一對多,的

[NAPT 分配端口] [ wid 主鍵標識 ]

UNIQUE( [NAPT 分配端口], [ wid 主鍵標識 ] ) -> 表示這兩個字段聯合起來不能重複.
UNIQUE( [ wid 主鍵標識 ] ) -> 標識此字段不能重複.

看完了上面的數據結構是更明白了仍是更暈了? 呵呵! 多想一下子就會明白了。經過NAT,內網計算機計算機向外連結是很容易的,NAPT會自動處理,咱們的應用程序根本沒必要關心它是如何處理的。那麼外部的計算機想訪問內網中的計算機如何實現呢?咱們來看一下下面的流程:

c 是一臺在NAPT後面的內網計算機,s是一臺有外網IP地址的計算機。c 主動向 s 發起鏈接請求,NAPT依據上面描述的規則在本身的數據結構中記錄下來,創建一個Session. 而後 c 和 s 之間就能夠實現雙向的透明的數據傳輸了。以下面所示:

   c[192.168.0.6:1827] <-> [priv ip: 192.168.0.1]NAPT[pub ip: 61.51.99.86:9881] <-> s[61.51.76.102:8098]

因而可知,一臺外網IP地址的計算機想和NAPT後面的內網計算機通信的條件就是要求NAPT後面的內網計算機主動向外網IP地址的計算機發起一個 UDP數據包。外網IP地址的計算機利用收到的UDP數據包獲取到NAPT的外網IP地址和映射的端口,之後就能夠和內網IP的計算機透明的進行通信了。
   
如今咱們再來分析一下咱們最關心的兩個NAPT後面的內網計算機如何實現直接通信呢? 二者都沒法主動發出鏈接請求,誰也不知道對方的NAPT的公網IP地址和NAPT上面映射的端口號。因此咱們要靠一個公網IP地址的服務器幫助二者來創建 鏈接。當兩個NAPT後面的內網計算機分別鏈接了公網IP地址的服務器後,服務器能夠從收到的UDP數據包中獲取到這兩個NAPT設備的公網IP地址和這 兩個鏈接創建的Session的映射端口。兩個內網計算機能夠從服務器上獲取到對方的NAPT設備公網IP地址和映射的端口了。

咱們假設兩個內網計算機分別爲A和B,對應的NAPT分別爲AN和BN, 若是A在獲取到B對應的BN的IP地址和映射的端口後,迫不急待的向這個IP
地址和映射的端口發送了個UDP數據包,會有什麼狀況發生呢?依據上面的原理和數據結構咱們會知道,AN會在本身的數據結構中生成一條記錄,標識一個新 Session的存在。BN在收到數據包後,從本身的數據結構中查詢,沒有找到相關記錄,所以將包丟棄。B是個慢性子,此時才慢吞吞的向着AN的IP地址 和映射的端口發送了一個UDP數據包,結果如何呢?固然是咱們指望的結構了,AN在收到數據包後,從本身的數據結構中查找到了記錄,因此將數據包進行處理 發送給了A。A 再次向B發送數據包時,一切都時暢通無阻了。

PS:

端口映射的原理 內網的一臺電腦要上因特網,就須要端口映射 端口映射分爲動態與靜態 動態端口映射: 內網中的一臺電腦要訪問新浪網,會向NAPT網關發送數據包,包頭中包括對方 (新浪網)IP,端口和本機IP,端口,NAPT網關會把本機IP,端口替換成本身的公網一個 未使用的端口,而且會記下這個映射關係,爲之後轉發數據包使用。而後再把數據發判斷 給新浪網,新浪網收到數據後作出反應,發送數據到NAPT網關的那個未使用的端口, 而後NAPT網關將數據轉發給內網中的那臺電腦,實現內網和公網的通信,當鏈接 關閉時,NAPT網關會釋放分配給這條鏈接的端口,以便之後的鏈接能夠繼續使用。 NAPT網關的工做方式,由網關自動添加NAPT記錄,一個映射關係 靜態端口映射: 就是在NAPT網關上開放一個固定的端口,而後設定此端口收到的數據要轉發給 內網的哪一個IP和端口,無論有沒有鏈接,這個映射關係都會一直存在。就能夠 讓公網主動訪問網的一個電腦。

相關文章
相關標籤/搜索