1. 程式人生 > >NAT基本原理及應用

NAT基本原理及應用

原文出處:http://www.cnblogs.com/derrick/p/4052401.html?utm_source=tuicool&utm_medium=referral#undefined

原文出處:http://blog.csdn.net/leisure512/article/details/4900191

1 概述

1.1 簡介

1.1.1 名詞解釋

公有IP地址:也叫全域性地址,是指合法的IP地址,它是由NIC(網路資訊中心)或者ISP(網路服務提供商)分配的地址,對外代表一個或多個內部區域性地址,是全球統一的可尋 址的地址。

私有IP地址:也叫內部地址,屬於非註冊地址,專門為組織機構內部使用。因特網分配編號委員會(IANA)保留了3塊IP地址做為私有IP地址:

10.0.0.0 ——— 10.255.255.255

172.16.0.0——— 172.16.255.255

192.168.0.0———192.168.255.255

地址池:地址池是有一些外部地址(全球唯一的IP地址)組合而成,我們稱這樣的一個地址集合為地址池。在內部網路的資料包通過地址轉換到達外部網路時,將會在地址池中選擇某個IP地址作為資料包的源IP地址,這樣可以有效的利用使用者的外部地址,提高訪問外部網路的能力。

1.1.2關於NAT

NAT英文全稱是“Network Address Translation”,中文意思是“網路地址轉換”,它是一個IETF(Internet Engineering Task Force, Internet工程任務組)標準,允許一個整體機構以一個公用IP(Internet Protocol)地址出現在Internet上。顧名思義,它是一種把內部私有網路地址(IP地址)翻譯成合法網路IP地址的技術,如下圖所示。因此我們可以認為,NAT在一定程度上,能夠有效的解決公網地址不足的問題。

clip_image002

簡單地說,NAT就是在區域網內部網路中使用內部地址,而當內部節點要與外部網路進行通訊時,就在閘道器(可以理解為出口,打個比方就像院子的門一樣)處,將內部地址替換成公用地址,從而在外部公網(internet)上正常使用,NAT可以使多臺計算機共享Internet連線,這一功能很好地解決了公共 IP地址緊缺的問題。通過這種方法,可以只申請一個合法IP地址,就把整個區域網中的計算機接入Internet中。這時,NAT遮蔽了內部網路,所有內部網計算機對於公共網路來說是不可見的,而內部網計算機使用者通常不會意識到NAT的存在。如下圖所示。這裡提到的內部地址,是指在內部網路中分配給節點的私有IP地址,這個地址只能在內部網路中使用,不能被路由轉發。

clip_image003

NAT 功能通常被整合到路由器、防火牆、ISDN路由器或者單獨的NAT裝置中。比如Cisco路由器中已經加入這一功能,網路管理員只需在路由器的IOS中設定NAT功能,就可以實現對內部網路的遮蔽。再比如防火牆將WEB Server的內部地址192.168.1.1對映為外部地址202.96.23.11,外部訪問202.96.23.11地址實際上就是訪問訪問 192.168.1.1。此外,對於資金有限的小型企業來說,現在通過軟體也可以實現這一功能。Windows 98 SE、Windows 2000 都包含了這一功能。

1.2 分類

NAT有三種類型:靜態NAT(Static NAT)、動態地址NAT(Pooled NAT)、網路地址埠轉換NAPT(Port-Level NAT)。

clip_image005

1.2.1靜態NAT

通過手動設定,使 Internet 客戶進行的通訊能夠對映到某個特定的私有網路地址和埠。如果想讓連線在 Internet 上的計算機能夠使用某個私有網路上的伺服器(如網站伺服器)以及應用程式(如遊戲),那麼靜態對映是必需的。靜態對映不會從 NAT 轉換表中刪除。
  如果在 NAT 轉換表中存在某個對映,那麼 NAT 只是單向地從 Internet 向私有網路傳送資料。這樣,NAT 就為連線到私有網路部分的計算機提供了某種程度的保護。但是,如果考慮到 Internet 的安全性,NAT 就要配合全功能的防火牆一起使用。

對於以上網路拓撲圖,當內網主機 10.1.1.1如果要與外網的主機201.0.0.11通訊時,主機(IP:10.1.1.1)的資料包經過路由器時,路由器通過查詢NAT table 將IP資料包的源IP地址(10.1.1.1)改成與之對應的全域性IP地址(201.0.0.1),而目標IP地址201.0.0.11保持不變,這樣,資料包就能到達201.0.0.11。而當主機HostB(IP:201.0.0.11) 響應的資料包到達與內網相連線的路由器時,路由器同樣查詢NAT table,將IP資料包的目的IP 地址改成10.1.1.1,這樣內網主機就能接收到外網主機發過來的資料包。在靜態NAT方式中,內部的IP地址與公有IP地址是一種一一對應的對映關係,所以,採用這種方式的前提是,機構能夠申請到足夠多的全域性IP地址。

1.2.2 動態NAT

動態地址NAT只是轉換IP地址,它為每一個內部的IP地址分配一個臨時的外部IP地址,主要應用於撥號,對於頻繁的遠端聯接也可以採用動態NAT。當遠端使用者聯接上之後,動態地址NAT就會分配給他一個IP地址,使用者斷開時,這個IP地址就會被釋放而留待以後使用。

動態NAT方式適合於 當機構申請到的全域性IP地址較少,而內部網路主機較多的情況。內網主機IP與全域性IP地址是多對一的關係。當資料包進出內網時,具有NAT功能的裝置對IP資料包的處理與靜態NAT的一樣,只是NAT table表中的記錄是動態的,若內網主機在一定時間內沒有和外部網路通訊,有關它的IP地址對映關係將會被刪除,並且會把該全域性IP地址分配給新的IP資料包使用,形成新的NAT table對映記錄。

1.2.3網路地址埠轉換NAPT

網路地址埠轉換NAPT(Network Address Port Translation)則是把內部地址對映到外部網路的一個IP地址的不同埠上。它可以將中小型的網路隱藏在一個合法的IP地址後面。NAPT與 動態地址NAT不同,它將內部連線對映到外部網路中的一個單獨的IP地址上,同時在該地址上加上一個由NAT裝置選定的埠號。

NAPT是使用最普遍的一種轉換方式,它又包含兩種轉換方式:SNAT和DNAT。

(1)源NAT(Source NAT,SNAT):修改資料包的源地址。源NAT改變第一個資料包的來源地址,它永遠會在資料包傳送到網路之前完成,資料包偽裝就是一具SNAT的例子。

(2)目的NAT(Destination NAT,DNAT):修改資料包的目的地址。Destination NAT剛好與SNAT相反,它是改變第一個資料包的目的地地址,如平衡負載、埠轉發和透明代理就是屬於DNAT。

源NAT舉例:對於以上網路拓撲圖,內網的主機數量比較多,但是該組織只有一個合法的IP地址,當內網主機(10.1.1.3)往外發送資料包時,則需要修改資料包的IP地址和TCP/UDP埠號,例如將

源IP:10.1.1.3

源port:1493

改成

源IP:201.0.0.1

源port:1492(注意:源埠號可以與原來的一樣也可以不一樣

當外網主機(201.0.0.11)響應內網主機(10.1.1.3)時,應將:

目的IP:201.0.0.1

目的port:1492

改成

目的IP:10.1.1.3

目的port:1493

這樣,通過修改IP地址和埠的方法就可以使內網中所有的主機都能訪問外網,此類NAT適用於組織或機構內只有一個合法的IP地址的情況,也是動態NAT的一種特例。

目的NAT舉例:這種方式適用於內網的某些伺服器需要為外網提供某些服務的情況。

clip_image009

例如以上拓撲結構,內網伺服器群(ip地址分別為:10.1.1.1,10.1.1.2,10.1.1.3等)需要為外網提供WEB 服務,當外網主機HostB訪問內網時,所傳送的資料包的目的IP地址為10.1.1.127,埠號為:80,當該資料包到達內網連線的路由器時,路由器查詢NAT table,路由器通過修改目的IP地址和埠號,將外網的資料包平均傳送到不同的主機上(10.1.1.1,10.1.1.2,10.1.1.3等),這樣就實現了負載均衡。

1.3 NAT實現方式

1.3.1  全錐NAT(Full Cone NAT)

一旦一個內部地址(iAddr:port1)對映到外部地址(eAddr:port2),所有發自iAddr:port1的包都經由eAddr:port2向外傳送。任意外部主機都能通過給eAddr:port2發包到達iAddr:port1。

Full Cone NAT.svg

1.3.2 限制性錐NAT(Address-Restricted Cone NAT)

一旦一個內部地址(iAddr:port1)對映到外部地址(eAddr:port2),所有發自iAddr:port1的包都經由eAddr:port2向外傳送。任意外部主機(hostAddr:any)都能通過給eAddr:port2發包到達iAddr:port1的前提是:iAddr:port1之前傳送過包到hostAddr:any。 "any"也就是說埠不受限制。

Restricted Cone NAT.svg

1.3.3 埠限制性錐NAT(Port Restricted Cone NAT)

埠限制性錐NAT與限制性錐NAT類似,只是多了埠號的限制。

一旦一個內部地址(iAddr:port1)對映到外部地址(eAddr:port2),所有發自iAddr:port1的包都經由eAddr:port2向外傳送。一個外部主機(hostAddr:port3)能夠發包到達iAddr:port1的前提是:iAddr:port1之前傳送過包到hostAddr:port3.

Port Restricted Cone NAT.svg

1.3.4 對稱NAT(Symmetric NAT)

  • 每一個來自相同內部IP與埠,到一個特定目的地地址和埠的請求,都對映到一個獨特的外部IP地址和埠。
    同一內部IP與埠發到不同的目的地和埠的資訊包,都使用不同的對映。
  • 只有曾經收到過內部主機資料包的外部主機,才能夠把資料包發回。
Symmetric NAT.svg

2 NAT原理

2.1 地址轉換

NAT的基本工作原理是,當私有網主機和公共網主機通訊的IP包經過NAT閘道器時,將IP包中的源IP或目的IP在私有IP和NAT的公共IP之間進行轉換。

如下圖所示,NAT閘道器有2個網路埠,其中公共網路埠的IP地址是統一分配的公共 IP,為202.20.65.5;私有網路埠的IP地址是保留地址為192.168.1.1。私有網中的主機192.168.1.2向公共網中的主機202.20.65.4傳送了1個IP包(Dst=202.20.65.4,Src=192.168.1.2)。

clip_image011 當IP包經過NAT閘道器時,NAT Gateway會將IP包的源IP轉換為NAT Gateway的公共IP並轉發到公共網,此時IP包(Dst=202.20.65.4,Src=202.20.65.5)中已經不含任何私有網IP的資訊。由於IP包的源IP已經被轉換成NAT Gateway的公共IP,Web Server發出的響應IP包(Dst= 202.20.65.5,Src=202.20.65.4)將被髮送到NAT Gateway。

這時,NAT Gateway會將IP包的目的IP轉換成私有網中主機的IP,然後將IP包(Des=192.168.1.2,Src=202.20.65.4)轉發到私有網。對於通訊雙方而言,這種地址的轉換過程是完全透明的。轉換示意圖如下。
clip_image013

如果內網主機發出的請求包未經過NAT,那麼當Web Server收到請求包,回覆的響應包中的目的地址就是私有網路IP地址,在Internet上無法正確送達,導致連線失敗。

2.2 連線跟蹤

在上述過程中,NAT Gateway在收到響應包後,就需要判斷將資料包轉發給誰。此時如果子網內僅有少量客戶機,可以用靜態NAT手工指定;但如果內網有多臺客戶機,並且各自訪問不同網站,這時候就需要連線跟蹤(connection track)。如下圖所示:

clip_image015

在NAT Gateway收到客戶機發來的請求包後,做源地址轉換,並且將該連線記錄儲存下來,當NAT Gateway收到伺服器來的響應包後,查詢Track Table,確定轉發目標,做目的地址轉換,轉發給客戶機。

2.3 埠轉換

以上述客戶機訪問伺服器為例,當僅有一臺客戶機訪問伺服器時,NAT Gateway只須更改資料包的源IP或目的IP即可正常通訊。但是如果Client A和Client B同時訪問Web Server,那麼當NAT Gateway收到響應包的時候,就無法判斷將資料包轉發給哪臺客戶機,如下圖所示。

clip_image017 此時,NAT Gateway會在Connection Track中加入埠資訊加以區分。如果兩客戶機訪問同一伺服器的源埠不同,那麼在Track Table里加入埠資訊即可區分,如果源埠正好相同,那麼在實行SNAT和DNAT的同時對源埠也要做相應的轉換,如下圖所示。

clip_image019


3 應用

NAT主要可以實現以下幾個功能:資料包偽裝、平衡負載、埠轉發和透明代理

資料偽裝: 可以將內網資料包中的地址資訊更改成統一的對外地址資訊,不讓內網主機直接暴露在因特網上,保證內網主機的安全。同時,該功能也常用來實現共享上網。例如,內網主機訪問外網時,為了隱藏內網拓撲結構,使用全域性地址替換私有地址。

埠轉發: 當內網主機對外提供服務時,由於使用的是內部私有IP地址,外網無法直接訪問。因此,需要在閘道器上進行埠轉發,將特定服務的資料包轉發給內網主機。例如公司小王在自己的伺服器上架設了一個Web網站,他的IP地址為192.168.0.5,使用預設埠80,現在他想讓區域網外的使用者也能直接訪問他的Web站點。利用NAT即可很輕鬆的解決這個問題,伺服器的IP地址為210.59.120.89,那麼為小王分配一個埠,例如81,即所有訪問210.59.120.89:81的請求都自動轉向192.168.0.5:80,而且這個過程對使用者來說是透明的。

負載平衡:目的地址轉換NAT可以重定向一些伺服器的連線到其他隨機選定的伺服器。例如1.2.3所講的目的NAT的例子。

失效終結:目的地址轉換NAT可以用來提供高可靠性的服務。如果一個系統有一臺通過路由器訪問的關鍵伺服器,一旦路由器檢測到該伺服器當機,它可以使用目的地址轉換NAT透明的把連線轉移到一個備份伺服器上,提高系統的可靠性。

透明代理:例如自己架設的伺服器空間不足,需要將某些連結指向存在另外一臺伺服器的空間;或者某臺計算機上沒有安裝IIS服務,但是卻想讓網友訪問該臺計算機上的內容,這個時候利用IIS的Web站點重定向即可輕鬆的幫助我們搞定。


4 NAT的缺陷

NAT在最開始的時候是非常完美的,但隨著網路的發展,各種新的應用層出不窮,此時NAT也暴露出了缺點。NAT的缺陷主要表現在以下幾方面:

(1) 不能處理嵌入式IP地址或埠

NAT裝置不能翻譯那些嵌入到應用資料部分的IP地址或埠資訊,它只能翻譯那種正常位於IP首部中的地址資訊和位於TCP/UDP首部中的埠資訊。如下圖,由於對方會使用接收到的資料包中應用資料部分嵌入的地址和埠進行通訊(比如FTP協議),這樣就可能產生連線故障,如果通訊雙方都是使用的公網IP,這不會造成什麼問題,但如果那個嵌入式地址和埠是內網的,顯然連線就不可能成功,原因就如開篇所說的一樣。MSN Messenger的部分功能就使用了這種方式來傳遞IP和埠資訊,這樣就導致了NAT裝置後的客戶端網路應用程式出現連線故障。

clip_image020

一些NAT服務為了適應更多的場景,提供了對多種協議的適配,比如支援FTP、SCTP、IMCP、DNS等等,這種技術稱為ALG(Application Level Gateway),即在應用層對IP和埠做一定的抽取工作,並生成NAT對映表記錄。但這些也大大增加了NAT的複雜度,特別是自定義協議的情況下,要考慮較複雜的機制來穿透NAT。

(2) 不能從公網訪問內部網路服務

由於內網是私有IP,所以不能直接從公網訪問內部網路服務,比如WEB服務,對於這個問題,我們可以採用建立靜態對映的方法來解決。比如有一條靜態對映,是把218.70.201.185:80與192.168.0.88:80對映起的,當公網使用者要訪問內部WEB伺服器時,它就首先連線到218.70.201.185:80,然後NAT裝置把請求傳給192.168.0.88:80,192.168.0.88把響應返回NAT裝置,再由NAT裝置傳給公網訪問使用者。

(3) 有一些應用程式雖然是用A埠傳送資料的,但卻要用B埠進行接收,不過NAT裝置翻譯時卻不知道這一點,它仍然建立一條針對A埠的對映,結果對方響應的資料要傳給B埠時,NAT裝置卻找不到相關對映條目而會丟棄資料包。


(4) 一些P2P應用在NAT後無法進行
對於那些沒有中間伺服器的純P2P應用(如電視會議,娛樂等)來說,如果大家都位於NAT裝置之後,雙方是無法建立連線的。因為沒有中間伺服器的中轉,NAT裝置後的P2P程式在NAT裝置上是不會有對映條目的,也就是說對方是不能向你發起一個連線的。現在已經有一種叫做P2P NAT穿越的技術來解決這個問題。

(5) NAT裝置對資料包進行編輯和修改操作,降低了傳送資料的效率;而且由於增加了技術的複雜性,排錯也變得困難了。

5.NAT穿透

NAT不僅實現地址轉換,同時還起到防火牆的作用,隱藏內部網路的拓撲結構,保護內部主機。NAT不僅完美地解決了lP地址不足的問題,而且還能夠有效地避免來自網路外部的攻擊,隱藏並保護網路內部的計算機。這樣對於外部主機來說,內部主機是不可見的。但是,對於P2P 應用來說,卻要求能夠建立端到端的連線,所以如何穿透NAT 也是P2P 技術中的一個關鍵。

5.1 網路拓樸


        Server129.208.12.38 )是公網上的伺服器,NAT-A 和NAT-B 是兩個NAT 裝置(可能是整合NAT 功能的路由器,防火牆等),它們具有若干個合法公網IP ,在NAT-A 阻隔的私有網路中有若干臺主機【ClientA-1 ,ClientA-N 】,在NAT-B 阻隔的私有網路中也有若干臺主機【ClientB-1 ,ClientB-N 】。為了以後說明問題方便,只討論主機ClientA-1 和ClientB-1 。

       假設主機ClientA-1 和主機ClientB-1 都和伺服器Server 建立了“連線”,如下圖所示。


        由於NAT 的透明性,所以ClientA-1 和ClientB-1 不用關心和Server 通訊的過程,它們只需要知道Server 開放服務的地址和埠號即可。根據圖1 ,假設在ClientA-1 中有程序使用socket (192.168.0.2 :7000 )和Server 通訊,在ClientB-1 中有程序使用socket (192.168.1.12:8000 )和Server 通訊。它們通過各自的NAT 轉換後分別變成了socket (202.103.142.29 :5000 )和socket (221.10.145.84 :6000 )。
5.2 使用UDP 穿透NAT

       通常情況下,當程序使用UDP 和外部主機通訊時,NAT 會建立一個Session ,這個Session 能夠保留多久並沒有標準,或許幾秒,幾分鐘,幾個小時。假設ClientA-1 在應用程式中看到了ClientB-1 線上,並且想和ClientB-1 通訊,一種辦法是Server 作為中間人,負責轉發ClientA-1 和ClientB-1 之間的訊息,但是這樣伺服器太累,會吃不消。另一種方法就是讓ClientA-1 何ClientB-1 建立端到端的連線,然後他們自己通訊。這也就是P2P 連線。根據不同型別的NAT ,下面分別講解。

(1 )全錐NAT ,穿透全錐型NAT 很容易,根本稱不上穿透,因為全錐型NAT 將內部主機的對映到確定的地址,不會阻止從外部發送的連線請求,所以可以不用任何輔助手段就可以建立連線。
(2 )限制性錐NAT 和埠限制性錐NAT (簡稱限制性NAT ),穿透限制性錐NAT 會丟棄它未知的源地址發向內部主機的資料包。所以如果現在ClientA-1 直接傳送UDP 資料包到ClientB-1 ,那麼資料包將會被NAT-B 無情的丟棄。所以採用下面的方法來建立ClientA-1 和ClientB-1 之間的通訊。
1 .ClientA-1 (202.103.142.29:5000 )傳送資料包給Server ,請求和ClientB-1 (221.10.145.84:6000 )通訊。
2. Server 將ClientA-1 的地址和埠(202.103.142.29:5000 )傳送給ClientB-1 ,告訴ClientB-1 ,ClientA-1 想和它通訊。
3. ClientB-1 向ClientA-1 (202.103.142.29:5000 )傳送UDP 資料包,當然這個包在到達NAT-A 的時候,還是會被丟棄,這並不是關鍵的,因為傳送這個UDP 包只是為了讓NAT-B 記住這次通訊的目的地址:埠號,當下次以這個地址和埠為源的資料到達的時候就不會被NAT-B 丟棄,這樣就在NAT-B 上打了一個從ClientB-1 到ClientA-1 的孔。
4. 為了讓ClientA-1 知道什麼時候才可以向ClientB-1 傳送資料,所以ClientB-1 在向ClientA-1 (202.103.142.29:5000 )打孔之後還要向Server 傳送一個訊息,告訴Server 它已經準備好了。
5. Server 傳送一個訊息給ClientA-1 ,內容為:ClientB-1 已經準備好了,你可以向ClientB-1 傳送訊息了。
6. ClientA-1 向ClientB-1 傳送UDP 資料包。這個資料包不會被NAT-B 丟棄,以後ClientB-1 向ClientA-1 傳送的資料包也不會被ClientA-1 丟棄,因為NAT-A 已經知道是ClientA-1 首先發起的通訊。至此,ClientA-1 和ClientB-1 就可以進行通訊了。

5.3 使用TCP 穿透NAT

使用TCP 協議穿透NAT 的方式和使用UDP 協議穿透NAT 的方式幾乎一樣,沒有什麼本質上的區別,只是將無連線的UDP 變成了面向連線的TCP 。值得注意是:

1.     ClientB-1 在向ClientA-1 打孔時,傳送的SYN 資料包,而且同樣會被NAT-A 丟棄。同時,ClientB-1 需要在原來的socket 上監聽,由於重用socket ,所以需要將socket 屬性設定為SO_REUSEADDR 。

2.     ClientA-1 向ClientB-1 傳送連線請求。同樣,由於ClientB-1 到ClientA-1 方向的孔已經打好,所以連線會成功,經過3 次握手後,ClientA-1 到ClientB-1 之間的連線就建立起來了。


5.4 穿透對稱NAT

上面討論的都是怎樣穿透錐(Cone )NAT ,對稱NAT 和錐NAT 很不一樣。對於 對稱NAT ,當一個私網內主機和外部多個不同主機通訊時,對稱NAT 並不會像錐(Cone ,全錐,限制性錐,埠限制性錐)NAT 那樣分配同一個埠。而是會新建立一個Session ,重新分配一個埠。參考上面穿透限制性錐NAT 的過程,在步驟3時:ClientB-1 (221.10.145.84: ?)向ClientA-1 打孔的時候,對稱NAT 將給ClientB-1 重新分配一個埠號,而這個埠號對於Server 、ClientB-1 、ClientA-1 來說都是未知的。同樣, ClientA-1 根本不會收到這個訊息,同時在步驟4 ,ClientB-1 傳送給Server 的通知訊息中,ClientB-1 的socket 依舊是(221.10.145.84:6000 )。而且,在步驟6 時:ClientA-1 向它所知道但錯誤的ClientB-1 傳送資料包時,NAT-1 也會重新給ClientA-1 分配埠號。所以,穿透對稱NAT 的機會很小。下面是兩種有可能穿透對稱NAT 的策略。


5.4.1 同時開放TCP ( Simultaneous TCP open )策略

如果一個 對稱 NAT 接收到一個來自 本地 私有網 絡 外面的 TCP SYN 包, 這 個包想 發 起一個 “ 引入” 的TCP 連 接,一般來 說 , NAT 會拒 絕這 個 連 接 請 求並扔掉 這 個 SYN 包,或者回送一個TCP RST(connection reset ,重建 連 接)包 給請 求方。但是,有一 種 情況 卻會接受這個“引入”連線。

RFC 規定:對於對稱NAT , 當 這 個接收到的 SYN 包中的源IP 地址 : 埠、目 標 IP 地址 : 埠都與NAT 登 記 的一個已 經 啟用的 TCP 會 話 中的地址資訊相符 時 , NAT 將會放行 這 個 SYN 包。 需要 特 別 指出 的是:怎樣才是一個已經啟用的TCP 連線?除了真正已經建立完成的TCP 連線外,RFC 規範指出: 如果 NAT恰好看到一個 剛剛發 送出去的一個 SYN 包和 隨之 接收到的SYN 包中的地址 :埠 資訊相符合的 話 ,那 麼NAT 將會 認為這 個 TCP 連 接已 經 被啟用,並將允 許這 個方向的 SYN 包 進 入 NAT 內部。 同時開放TCP 策略就是利用這個時機來建立連線的。

如果 Client A -1 和 Client B -1 能 夠 彼此正確的 預 知 對 方的 NAT 將會 給 下一個 TCP 連 接分配的公網TCP 埠,並且兩個客 戶 端能 夠 同 時 地 發 起一 個面向對方的 “ 外出 ” 的 TCP 連 接 請求 ,並在 對 方的SYN 包到達之前,自己 剛發 送出去的 SYN 包都能 順 利的穿 過 自己的 NAT 的 話 ,一條端 對 端的 TCP 連 接就 能 成功地建立了 。


5.4.2 埠猜測策略

同時開放TCP 策略非常依賴於猜測對方的下一個埠,而且強烈依賴於傳送連線請求的時機,而且還有網路的不確定性,所以能夠建立的機會很小,即使Server 充當同步時鐘的角色。下面是一種通過UDP 穿透的方法,由於UDP 不需要建立連線,所以也就不需要考慮“同時開放”的問題。

為了介紹ClientB-1 的詭計,先介紹一下STUN 協議。STUN (Simple Traversal of UDP Through NATs )協議是一個輕量級協議,用來探測被NAT 對映後的地址:埠。STUN 採用C/S 結構,需要探測自己被NAT 轉換後的地址:埠的Client 向Server 傳送請求,Server 返回Client 轉換後的地址:埠。

參考上面UDP穿透NAT 的步驟2 ,當ClientB-1 收到Server 傳送給它的訊息後,ClientB-1 即開啟3 個socket 。socket-0 向STUN Server 傳送請求,收到回覆後,假設得知它被轉換後的地址:埠( 221.10.145.84:600 5 ),socket-1 向ClientA-1 傳送一個UDP 包,socket-2 再次向另一個STUN Server 傳送請求,假設得到它被轉換後的地址:埠( 221.10.145.84:60 20 )。通常,對稱NAT 分配埠有兩種策略,一種是按順序增加,一種是隨機分配。如果這裡對稱NAT 使用順序增加策略,那麼,ClientB-1 將兩次收到的地址:埠傳送給Server 後,Server 就可以通知ClientA-1 在這個埠範圍內猜測剛才ClientB-1 傳送給它的socket-1 中被NAT 對映後的地址:埠,ClientA-1 很有可能在孔有效期內成功猜測到埠號,從而和ClientB-1 成功通訊。


5.5 問題總結

從上面兩種穿透對稱NAT 的方法來看,都建立在了嚴格的假設條件下。但是現實中多數的NAT 都是錐NAT ,因為資源畢竟很重要,反觀對稱NAT ,由於太不節約埠號所以相對來說成本較高。所以,不管是穿透錐NAT,還是對稱NAT ,現實中都是可以辦到的。除非對稱NAT 真的使用隨機演算法來分配可用的埠。


6.結語

NAT技術無可否認是在ipv4地址資源的短缺時候起到了緩解作用;在減少使用者申請ISP服務的花費和提供比較完善的負載平衡功能等方面帶來了不少好處。但是在ipv4地址在以後幾年將會枯竭,NAT技術不能改變ip地址空間不足的本質。然而在安全機制上也潛在著威脅,在配置和管理上也是一個挑戰。如果要從根本上解決ip地址資源的問題,ipv6才是最根本之路。在ipv4轉換到ipv6的過程中,NAT技術確實是一個不錯的選擇,相對其他的方案優勢也非常明顯。