400-638-8808
|
微信公眾號





穩(wěn)定可靠 永不間斷

海外收發(fā) 暢通無阻

協(xié)同辦公 資源管理

超大郵件 超級功能

智能反垃圾郵件技術(shù)
易管理 免維護(hù)

1 概述
1.1 簡介
1.1.1 名詞解釋
公有IP地址:也叫全局地址,是指合法的IP地址,它是由NIC(網(wǎng)絡(luò)信息中心)或者ISP(網(wǎng)絡(luò)服務(wù)提供商)分配的地址,對外代表一個或多個內(nèi)部局部地址,是全球統(tǒng)一的可尋 址的地址。
私有IP地址:也叫內(nèi)部地址,屬于非注冊地址,專門為組織機(jī)構(gòu)內(nèi)部使用。因特網(wǎng)分配編號委員會(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地址)組合而成,我們稱這樣的一個地址集合為地址池。在內(nèi)部網(wǎng)絡(luò)的數(shù)據(jù)包通過地址轉(zhuǎn)換到達(dá)外部網(wǎng)絡(luò)時,將會在地址池中選擇某個IP地址作為數(shù)據(jù)包的源IP地址,這樣可以有效的利用用戶的外部地址,提高訪問外部網(wǎng)絡(luò)的能力。
1.1.2關(guān)于NAT
NAT英文全稱是“Network Address Translation”,中文意思是“網(wǎng)絡(luò)地址轉(zhuǎn)換”,它是一個IETF(Internet Engineering Task Force, Internet工程任務(wù)組)標(biāo)準(zhǔn),允許一個整體機(jī)構(gòu)以一個公用IP(Internet Protocol)地址出現(xiàn)在Internet上。顧名思義,它是一種把內(nèi)部私有網(wǎng)絡(luò)地址(IP地址)翻譯成合法網(wǎng)絡(luò)IP地址的技術(shù),如下圖所示。因此我們可以認(rèn)為,NAT在一定程度上,能夠有效的解決公網(wǎng)地址不足的問題。
簡單地說,NAT就是在局域網(wǎng)內(nèi)部網(wǎng)絡(luò)中使用內(nèi)部地址,而當(dāng)內(nèi)部節(jié)點(diǎn)要與外部網(wǎng)絡(luò)進(jìn)行通訊時,就在網(wǎng)關(guān)(可以理解為出口,打個比方就像院子的門一樣)處,將內(nèi)部地址替換成公用地址,從而在外部公網(wǎng)(internet)上正常使用,NAT可以使多臺計(jì)算機(jī)共享Internet連接,這一功能很好地解決了公共 IP地址緊缺的問題。通過這種方法,可以只申請一個合法IP地址,就把整個局域網(wǎng)中的計(jì)算機(jī)接入Internet中。這時,NAT屏蔽了內(nèi)部網(wǎng)絡(luò),所有內(nèi)部網(wǎng)計(jì)算機(jī)對于公共網(wǎng)絡(luò)來說是不可見的,而內(nèi)部網(wǎng)計(jì)算機(jī)用戶通常不會意識到NAT的存在。如下圖所示。這里提到的內(nèi)部地址,是指在內(nèi)部網(wǎng)絡(luò)中分配給節(jié)點(diǎn)的私有IP地址,這個地址只能在內(nèi)部網(wǎng)絡(luò)中使用,不能被路由轉(zhuǎn)發(fā)。

NAT 功能通常被集成到路由器、防火墻、ISDN路由器或者單獨(dú)的NAT設(shè)備中。比如Cisco路由器中已經(jīng)加入這一功能,網(wǎng)絡(luò)管理員只需在路由器的IOS中設(shè)置NAT功能,就可以實(shí)現(xiàn)對內(nèi)部網(wǎng)絡(luò)的屏蔽。再比如防火墻將WEB Server的內(nèi)部地址192.168.1.1映射為外部地址202.96.23.11,外部訪問202.96.23.11地址實(shí)際上就是訪問訪問 192.168.1.1。此外,對于資金有限的小型企業(yè)來說,現(xiàn)在通過軟件也可以實(shí)現(xiàn)這一功能。Windows 98 SE、Windows 2000 都包含了這一功能。
NAT有三種類型:靜態(tài)NAT(Static NAT)、動態(tài)地址NAT(Pooled NAT)、網(wǎng)絡(luò)地址端口轉(zhuǎn)換NAPT(Port-Level NAT)。

1.2.1靜態(tài)NAT
通過手動設(shè)置,使 Internet 客戶進(jìn)行的通信能夠映射到某個特定的私有網(wǎng)絡(luò)地址和端口。如果想讓連接在 Internet 上的計(jì)算機(jī)能夠使用某個私有網(wǎng)絡(luò)上的服務(wù)器(如網(wǎng)站服務(wù)器)以及應(yīng)用程序(如游戲),那么靜態(tài)映射是必需的。靜態(tài)映射不會從 NAT 轉(zhuǎn)換表中刪除。
如果在 NAT 轉(zhuǎn)換表中存在某個映射,那么 NAT 只是單向地從 Internet 向私有網(wǎng)絡(luò)傳送數(shù)據(jù)。這樣,NAT 就為連接到私有網(wǎng)絡(luò)部分的計(jì)算機(jī)提供了某種程度的保護(hù)。但是,如果考慮到 Internet 的安全性,NAT 就要配合全功能的防火墻一起使用。
對于以上網(wǎng)絡(luò)拓?fù)鋱D,當(dāng)內(nèi)網(wǎng)主機(jī) 10.1.1.1如果要與外網(wǎng)的主機(jī)201.0.0.11通信時,主機(jī)(IP:10.1.1.1)的數(shù)據(jù)包經(jīng)過路由器時,路由器通過查找NAT table 將IP數(shù)據(jù)包的源IP地址(10.1.1.1)改成與之對應(yīng)的全局IP地址(201.0.0.1),而目標(biāo)IP地址201.0.0.11保持不變,這樣,數(shù)據(jù)包就能到達(dá)201.0.0.11。而當(dāng)主機(jī)HostB(IP:201.0.0.11) 響應(yīng)的數(shù)據(jù)包到達(dá)與內(nèi)網(wǎng)相連接的路由器時,路由器同樣查找NAT table,將IP數(shù)據(jù)包的目的IP 地址改成10.1.1.1,這樣內(nèi)網(wǎng)主機(jī)就能接收到外網(wǎng)主機(jī)發(fā)過來的數(shù)據(jù)包。在靜態(tài)NAT方式中,內(nèi)部的IP地址與公有IP地址是一種一一對應(yīng)的映射關(guān)系,所以,采用這種方式的前提是,機(jī)構(gòu)能夠申請到足夠多的全局IP地址。
1.2.2 動態(tài)NAT
動態(tài)地址NAT只是轉(zhuǎn)換IP地址,它為每一個內(nèi)部的IP地址分配一個臨時的外部IP地址,主要應(yīng)用于撥號,對于頻繁的遠(yuǎn)程聯(lián)接也可以采用動態(tài)NAT。當(dāng)遠(yuǎn)程用戶聯(lián)接上之后,動態(tài)地址NAT就會分配給他一個IP地址,用戶斷開時,這個IP地址就會被釋放而留待以后使用。
動態(tài)NAT方式適合于 當(dāng)機(jī)構(gòu)申請到的全局IP地址較少,而內(nèi)部網(wǎng)絡(luò)主機(jī)較多的情況。內(nèi)網(wǎng)主機(jī)IP與全局IP地址是多對一的關(guān)系。當(dāng)數(shù)據(jù)包進(jìn)出內(nèi)網(wǎng)時,具有NAT功能的設(shè)備對IP數(shù)據(jù)包的處理與靜態(tài)NAT的一樣,只是NAT table表中的記錄是動態(tài)的,若內(nèi)網(wǎng)主機(jī)在一定時間內(nèi)沒有和外部網(wǎng)絡(luò)通信,有關(guān)它的IP地址映射關(guān)系將會被刪除,并且會把該全局IP地址分配給新的IP數(shù)據(jù)包使用,形成新的NAT table映射記錄。
1.2.3網(wǎng)絡(luò)地址端口轉(zhuǎn)換NAPT
網(wǎng)絡(luò)地址端口轉(zhuǎn)換NAPT(Network Address Port Translation)則是把內(nèi)部地址映射到外部網(wǎng)絡(luò)的一個IP地址的不同端口上。它可以將中小型的網(wǎng)絡(luò)隱藏在一個合法的IP地址后面。NAPT與 動態(tài)地址NAT不同,它將內(nèi)部連接映射到外部網(wǎng)絡(luò)中的一個單獨(dú)的IP地址上,同時在該地址上加上一個由NAT設(shè)備選定的端口號。
NAPT是使用最普遍的一種轉(zhuǎn)換方式,它又包含兩種轉(zhuǎn)換方式:SNAT和DNAT。
(1)源NAT(Source NAT,SNAT):修改數(shù)據(jù)包的源地址。源NAT改變第一個數(shù)據(jù)包的來源地址,它永遠(yuǎn)會在數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò)之前完成,數(shù)據(jù)包偽裝就是一具SNAT的例子。
(2)目的NAT(Destination NAT,DNAT):修改數(shù)據(jù)包的目的地址。Destination NAT剛好與SNAT相反,它是改變第一個數(shù)據(jù)包的目的地地址,如平衡負(fù)載、端口轉(zhuǎn)發(fā)和透明代理就是屬于DNAT。
源NAT舉例:對于以上網(wǎng)絡(luò)拓?fù)鋱D,內(nèi)網(wǎng)的主機(jī)數(shù)量比較多,但是該組織只有一個合法的IP地址,當(dāng)內(nèi)網(wǎng)主機(jī)(10.1.1.3)往外發(fā)送數(shù)據(jù)包時,則需要修改數(shù)據(jù)包的IP地址和TCP/UDP端口號,例如將
源IP:10.1.1.3
源port:1493
改成
源IP:201.0.0.1
源port:1492(注意:源端口號可以與原來的一樣也可以不一樣)
當(dāng)外網(wǎng)主機(jī)(201.0.0.11)響應(yīng)內(nèi)網(wǎng)主機(jī)(10.1.1.3)時,應(yīng)將:
目的IP:201.0.0.1
目的port:1492
改成
目的IP:10.1.1.3
目的port:1493
這樣,通過修改IP地址和端口的方法就可以使內(nèi)網(wǎng)中所有的主機(jī)都能訪問外網(wǎng),此類NAT適用于組織或機(jī)構(gòu)內(nèi)只有一個合法的IP地址的情況,也是動態(tài)NAT的一種特例。
目的NAT舉例:這種方式適用于內(nèi)網(wǎng)的某些服務(wù)器需要為外網(wǎng)提供某些服務(wù)的情況。

例如以上拓?fù)浣Y(jié)構(gòu),內(nèi)網(wǎng)服務(wù)器群(ip地址分別為:10.1.1.1,10.1.1.2,10.1.1.3等)需要為外網(wǎng)提供WEB 服務(wù),當(dāng)外網(wǎng)主機(jī)HostB訪問內(nèi)網(wǎng)時,所發(fā)送的數(shù)據(jù)包的目的IP地址為10.1.1.127,端口號為:80,當(dāng)該數(shù)據(jù)包到達(dá)內(nèi)網(wǎng)連接的路由器時,路由器查找NAT table,路由器通過修改目的IP地址和端口號,將外網(wǎng)的數(shù)據(jù)包平均發(fā)送到不同的主機(jī)上(10.1.1.1,10.1.1.2,10.1.1.3等),這樣就實(shí)現(xiàn)了負(fù)載均衡。
1.3 NAT實(shí)現(xiàn)方式
1.3.1 全錐NAT(Full Cone NAT)
一旦一個內(nèi)部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有發(fā)自iAddr:port1的包都經(jīng)由eAddr:port2向外發(fā)送。任意外部主機(jī)都能通過給eAddr:port2發(fā)包到達(dá)iAddr:port1。

1.3.2 限制性錐NAT(Address-Restricted Cone NAT)
一旦一個內(nèi)部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有發(fā)自iAddr:port1的包都經(jīng)由eAddr:port2向外發(fā)送。任意外部主機(jī)(hostAddr:any)都能通過給eAddr:port2發(fā)包到達(dá)iAddr:port1的前提是:iAddr:port1之前發(fā)送過包到hostAddr:any。 "any"也就是說端口不受限制。

1.3.3 端口限制性錐NAT(Port Restricted Cone NAT)
端口限制性錐NAT與限制性錐NAT類似,只是多了端口號的限制。
一旦一個內(nèi)部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有發(fā)自iAddr:port1的包都經(jīng)由eAddr:port2向外發(fā)送。一個外部主機(jī)(hostAddr:port3)能夠發(fā)包到達(dá)iAddr:port1的前提是:iAddr:port1之前發(fā)送過包到hostAddr:port3.

1.3.4 對稱NAT(Symmetric NAT)

2、NAT原理
2.1 地址轉(zhuǎn)換
NAT的基本工作原理是,當(dāng)私有網(wǎng)主機(jī)和公共網(wǎng)主機(jī)通信的IP包經(jīng)過NAT網(wǎng)關(guān)時,將IP包中的源IP或目的IP在私有IP和NAT的公共IP之間進(jìn)行轉(zhuǎn)換。
如下圖所示,NAT網(wǎng)關(guān)有2個網(wǎng)絡(luò)端口,其中公共網(wǎng)絡(luò)端口的IP地址是統(tǒng)一分配的公共 IP,為202.20.65.5;私有網(wǎng)絡(luò)端口的IP地址是保留地址為192.168.1.1。私有網(wǎng)中的主機(jī)192.168.1.2向公共網(wǎng)中的主機(jī)202.20.65.4發(fā)送了1個IP包(Dst=202.20.65.4,Src=192.168.1.2)。

當(dāng)IP包經(jīng)過NAT網(wǎng)關(guān)時,NAT Gateway會將IP包的源IP轉(zhuǎn)換為NAT Gateway的公共IP并轉(zhuǎn)發(fā)到公共網(wǎng),此時IP包(Dst=202.20.65.4,Src=202.20.65.5)中已經(jīng)不含任何私有網(wǎng)IP的信息。由于IP包的源IP已經(jīng)被轉(zhuǎn)換成NAT Gateway的公共IP,Web Server發(fā)出的響應(yīng)IP包(Dst= 202.20.65.5,Src=202.20.65.4)將被發(fā)送到NAT Gateway。
這時,NAT Gateway會將IP包的目的IP轉(zhuǎn)換成私有網(wǎng)中主機(jī)的IP,然后將IP包(Des=192.168.1.2,Src=202.20.65.4)轉(zhuǎn)發(fā)到私有網(wǎng)。對于通信雙方而言,這種地址的轉(zhuǎn)換過程是完全透明的。轉(zhuǎn)換示意圖如下。

如果內(nèi)網(wǎng)主機(jī)發(fā)出的請求包未經(jīng)過NAT,那么當(dāng)Web Server收到請求包,回復(fù)的響應(yīng)包中的目的地址就是私有網(wǎng)絡(luò)IP地址,在Internet上無法正確送達(dá),導(dǎo)致連接失敗。
在上述過程中,NAT Gateway在收到響應(yīng)包后,就需要判斷將數(shù)據(jù)包轉(zhuǎn)發(fā)給誰。此時如果子網(wǎng)內(nèi)僅有少量客戶機(jī),可以用靜態(tài)NAT手工指定;但如果內(nèi)網(wǎng)有多臺客戶機(jī),并且各自訪問不同網(wǎng)站,這時候就需要連接跟蹤(connection track)。如下圖所示:

在NAT Gateway收到客戶機(jī)發(fā)來的請求包后,做源地址轉(zhuǎn)換,并且將該連接記錄保存下來,當(dāng)NAT Gateway收到服務(wù)器來的響應(yīng)包后,查找Track Table,確定轉(zhuǎn)發(fā)目標(biāo),做目的地址轉(zhuǎn)換,轉(zhuǎn)發(fā)給客戶機(jī)。
以上述客戶機(jī)訪問服務(wù)器為例,當(dāng)僅有一臺客戶機(jī)訪問服務(wù)器時,NAT Gateway只須更改數(shù)據(jù)包的源IP或目的IP即可正常通訊。但是如果Client A和Client B同時訪問Web Server,那么當(dāng)NAT Gateway收到響應(yīng)包的時候,就無法判斷將數(shù)據(jù)包轉(zhuǎn)發(fā)給哪臺客戶機(jī),如下圖所示。

此時NAT Gateway會在Connection Track中加入端口信息加以區(qū)分。如果兩客戶機(jī)訪問同一服務(wù)器的源端口不同,那么在Track Table里加入端口信息即可區(qū)分,如果源端口正好相同,那么在實(shí)行SNAT和DNAT的同時對源端口也要做相應(yīng)的轉(zhuǎn)換,如下圖所示。

3、應(yīng)用
NAT主要可以實(shí)現(xiàn)以下幾個功能:數(shù)據(jù)包偽裝、平衡負(fù)載、端口轉(zhuǎn)發(fā)和透明代理。
數(shù)據(jù)偽裝: 可以將內(nèi)網(wǎng)數(shù)據(jù)包中的地址信息更改成統(tǒng)一的對外地址信息,不讓內(nèi)網(wǎng)主機(jī)直接暴露在因特網(wǎng)上,保證內(nèi)網(wǎng)主機(jī)的安全。同時,該功能也常用來實(shí)現(xiàn)共享上網(wǎng)。例如,內(nèi)網(wǎng)主機(jī)訪問外網(wǎng)時,為了隱藏內(nèi)網(wǎng)拓?fù)浣Y(jié)構(gòu),使用全局地址替換私有地址。
端口轉(zhuǎn)發(fā): 當(dāng)內(nèi)網(wǎng)主機(jī)對外提供服務(wù)時,由于使用的是內(nèi)部私有IP地址,外網(wǎng)無法直接訪問。因此,需要在網(wǎng)關(guān)上進(jìn)行端口轉(zhuǎn)發(fā),將特定服務(wù)的數(shù)據(jù)包轉(zhuǎn)發(fā)給內(nèi)網(wǎng)主機(jī)。例如公司小王在自己的服務(wù)器上架設(shè)了一個Web網(wǎng)站,他的IP地址為192.168.0.5,使用默認(rèn)端口80,現(xiàn)在他想讓局域網(wǎng)外的用戶也能直接訪問他的Web站點(diǎn)。利用NAT即可很輕松的解決這個問題,服務(wù)器的IP地址為210.59.120.89,那么為小王分配一個端口,例如81,即所有訪問210.59.120.89:81的請求都自動轉(zhuǎn)向192.168.0.5:80,而且這個過程對用戶來說是透明的。
負(fù)載平衡:目的地址轉(zhuǎn)換NAT可以重定向一些服務(wù)器的連接到其他隨機(jī)選定的服務(wù)器。例如1.2.3所講的目的NAT的例子。
失效終結(jié):目的地址轉(zhuǎn)換NAT可以用來提供高可靠性的服務(wù)。如果一個系統(tǒng)有一臺通過路由器訪問的關(guān)鍵服務(wù)器,一旦路由器檢測到該服務(wù)器當(dāng)機(jī),它可以使用目的地址轉(zhuǎn)換NAT透明的把連接轉(zhuǎn)移到一個備份服務(wù)器上,提高系統(tǒng)的可靠性。
透明代理:例如自己架設(shè)的服務(wù)器空間不足,需要將某些鏈接指向存在另外一臺服務(wù)器的空間;或者某臺計(jì)算機(jī)上沒有安裝IIS服務(wù),但是卻想讓網(wǎng)友訪問該臺計(jì)算機(jī)上的內(nèi)容,這個時候利用IIS的Web站點(diǎn)重定向即可輕松的幫助我們搞定。
4、NAT的缺陷
NAT在最開始的時候是非常完美的,但隨著網(wǎng)絡(luò)的發(fā)展,各種新的應(yīng)用層出不窮,此時NAT也暴露出了缺點(diǎn)。NAT的缺陷主要表現(xiàn)在以下幾方面:
(1) 不能處理嵌入式IP地址或端口
NAT設(shè)備不能翻譯那些嵌入到應(yīng)用數(shù)據(jù)部分的IP地址或端口信息,它只能翻譯那種正常位于IP首部中的地址信息和位于TCP/UDP首部中的端口信息。如下圖,由于對方會使用接收到的數(shù)據(jù)包中應(yīng)用數(shù)據(jù)部分嵌入的地址和端口進(jìn)行通信(比如FTP協(xié)議),這樣就可能產(chǎn)生連接故障,如果通信雙方都是使用的公網(wǎng)IP,這不會造成什么問題,但如果那個嵌入式地址和端口是內(nèi)網(wǎng)的,顯然連接就不可能成功,原因就如開篇所說的一樣。MSN Messenger的部分功能就使用了這種方式來傳遞IP和端口信息,這樣就導(dǎo)致了NAT設(shè)備后的客戶端網(wǎng)絡(luò)應(yīng)用程序出現(xiàn)連接故障。

一些NAT服務(wù)為了適應(yīng)更多的場景,提供了對多種協(xié)議的適配,比如支持FTP、SCTP、IMCP、DNS等等,這種技術(shù)稱為ALG(Application Level Gateway),即在應(yīng)用層對IP和端口做一定的抽取工作,并生成NAT映射表記錄。但這些也大大增加了NAT的復(fù)雜度,特別是自定義協(xié)議的情況下,要考慮較復(fù)雜的機(jī)制來穿透NAT。
(2) 不能從公網(wǎng)訪問內(nèi)部網(wǎng)絡(luò)服務(wù)
由于內(nèi)網(wǎng)是私有IP,所以不能直接從公網(wǎng)訪問內(nèi)部網(wǎng)絡(luò)服務(wù),比如WEB服務(wù),對于這個問題,我們可以采用建立靜態(tài)映射的方法來解決。比如有一條靜態(tài)映射,是把218.70.201.185:80與192.168.0.88:80映射起的,當(dāng)公網(wǎng)用戶要訪問內(nèi)部WEB服務(wù)器時,它就首先連接到218.70.201.185:80,然后NAT設(shè)備把請求傳給192.168.0.88:80,192.168.0.88把響應(yīng)返回NAT設(shè)備,再由NAT設(shè)備傳給公網(wǎng)訪問用戶。
(3) 有一些應(yīng)用程序雖然是用A端口發(fā)送數(shù)據(jù)的,但卻要用B端口進(jìn)行接收,不過NAT設(shè)備翻譯時卻不知道這一點(diǎn),它仍然建立一條針對A端口的映射,結(jié)果對方響應(yīng)的數(shù)據(jù)要傳給B端口時,NAT設(shè)備卻找不到相關(guān)映射條目而會丟棄數(shù)據(jù)包。
(4) 一些P2P應(yīng)用在NAT后無法進(jìn)行
對于那些沒有中間服務(wù)器的純P2P應(yīng)用(如電視會議,娛樂等)來說,如果大家都位于NAT設(shè)備之后,雙方是無法建立連接的。因?yàn)闆]有中間服務(wù)器的中轉(zhuǎn),NAT設(shè)備后的P2P程序在NAT設(shè)備上是不會有映射條目的,也就是說對方是不能向你發(fā)起一個連接的。現(xiàn)在已經(jīng)有一種叫做P2P NAT穿越的技術(shù)來解決這個問題。
(5) NAT設(shè)備對數(shù)據(jù)包進(jìn)行編輯和修改操作,降低了發(fā)送數(shù)據(jù)的效率;而且由于增加了技術(shù)的復(fù)雜性,排錯也變得困難了。
5.NAT穿透
NAT 不僅實(shí)現(xiàn)地址轉(zhuǎn)換,同時還起到防火墻的作用,隱藏內(nèi)部網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu),保護(hù)內(nèi)部主機(jī)。 NAT 不僅完美地解決了 lP 地址不足的問題,而且還能夠有效地避免來自網(wǎng)絡(luò)外部的攻擊,隱藏并保護(hù)網(wǎng)絡(luò)內(nèi)部的計(jì)算機(jī)。這樣對于外部主機(jī)來說,內(nèi)部主機(jī)是不可見的。但是,對于P2P 應(yīng)用來說,卻要求能夠建立端到端的連接,所以如何穿透NAT 也是P2P 技術(shù)中的一個關(guān)鍵。
5.1 網(wǎng)絡(luò)拓樸

Server (129.208.12.38 )是公網(wǎng)上的服務(wù)器,NAT-A 和NAT-B 是兩個NAT 設(shè)備(可能是集成NAT 功能的路由器,防火墻等),它們具有若干個合法公網(wǎng)IP ,在NAT-A 阻隔的私有網(wǎng)絡(luò)中有若干臺主機(jī)【ClientA-1 ,ClientA-N 】,在NAT-B 阻隔的私有網(wǎng)絡(luò)中也有若干臺主機(jī)【ClientB-1 ,ClientB-N 】。為了以后說明問題方便,只討論主機(jī)ClientA-1 和ClientB-1 。
假設(shè)主機(jī)ClientA-1 和主機(jī)ClientB-1 都和服務(wù)器Server 建立了“連接”,如下圖所示。
由于NAT 的透明性,所以ClientA-1 和ClientB-1 不用關(guān)心和Server 通信的過程,它們只需要知道Server 開放服務(wù)的地址和端口號即可。根據(jù)圖1 ,假設(shè)在ClientA-1 中有進(jìn)程使用socket (192.168.0.2 :7000 )和Server 通信,在ClientB-1 中有進(jìn)程使用socket (192.168.1.12:8000 )和Server 通信。它們通過各自的NAT 轉(zhuǎn)換后分別變成了socket (202.103.142.29 :5000 )和socket (221.10.145.84 :6000 )。
5.2 使用UDP 穿透NAT
通常情況下,當(dāng)進(jìn)程使用UDP 和外部主機(jī)通信時,NAT 會建立一個Session ,這個Session 能夠保留多久并沒有標(biāo)準(zhǔn),或許幾秒,幾分鐘,幾個小時。假設(shè)ClientA-1 在應(yīng)用程序中看到了ClientB-1 在線,并且想和ClientB-1 通信,一種辦法是Server 作為中間人,負(fù)責(zé)轉(zhuǎn)發(fā)ClientA-1 和ClientB-1 之間的消息,但是這樣服務(wù)器太累,會吃不消。另一種方法就是讓ClientA-1 何ClientB-1 建立端到端的連接,然后他們自己通信。這也就是P2P 連接。根據(jù)不同類型的NAT ,下面分別講解。
(1 )全錐NAT ,穿透全錐型NAT 很容易,根本稱不上穿透,因?yàn)槿F型NAT 將內(nèi)部主機(jī)的映射到確定的地址,不會阻止從外部發(fā)送的連接請求,所以可以不用任何輔助手段就可以建立連接。
(2 )限制性錐NAT 和端口限制性錐NAT (簡稱限制性NAT ),穿透限制性錐NAT 會丟棄它未知的源地址發(fā)向內(nèi)部主機(jī)的數(shù)據(jù)包。所以如果現(xiàn)在ClientA-1 直接發(fā)送UDP 數(shù)據(jù)包到ClientB-1 ,那么數(shù)據(jù)包將會被NAT-B 無情的丟棄。所以采用下面的方法來建立ClientA-1 和ClientB-1 之間的通信。
1 .ClientA-1 (202.103.142.29:5000 )發(fā)送數(shù)據(jù)包給Server ,請求和ClientB-1 (221.10.145.84:6000 )通信。
2. Server 將ClientA-1 的地址和端口(202.103.142.29:5000 )發(fā)送給ClientB-1 ,告訴ClientB-1 ,ClientA-1 想和它通信。
3. ClientB-1 向ClientA-1 (202.103.142.29:5000 )發(fā)送UDP 數(shù)據(jù)包,當(dāng)然這個包在到達(dá)NAT-A 的時候,還是會被丟棄,這并不是關(guān)鍵的,因?yàn)榘l(fā)送這個UDP 包只是為了讓NAT-B 記住這次通信的目的地址:端口號,當(dāng)下次以這個地址和端口為源的數(shù)據(jù)到達(dá)的時候就不會被NAT-B 丟棄,這樣就在NAT-B 上打了一個從ClientB-1 到ClientA-1 的孔。
4. 為了讓ClientA-1 知道什么時候才可以向ClientB-1 發(fā)送數(shù)據(jù),所以ClientB-1 在向ClientA-1 (202.103.142.29:5000 )打孔之后還要向Server 發(fā)送一個消息,告訴Server 它已經(jīng)準(zhǔn)備好了。
5. Server 發(fā)送一個消息給ClientA-1 ,內(nèi)容為:ClientB-1 已經(jīng)準(zhǔn)備好了,你可以向ClientB-1 發(fā)送消息了。
6. ClientA-1 向ClientB-1 發(fā)送UDP 數(shù)據(jù)包。這個數(shù)據(jù)包不會被NAT-B 丟棄,以后ClientB-1 向ClientA-1 發(fā)送的數(shù)據(jù)包也不會被ClientA-1 丟棄,因?yàn)镹AT-A 已經(jīng)知道是ClientA-1 首先發(fā)起的通信。至此,ClientA-1 和ClientB-1 就可以進(jìn)行通信了。
5.3 使用TCP 穿透NAT
使用TCP 協(xié)議穿透NAT 的方式和使用UDP 協(xié)議穿透NAT 的方式幾乎一樣,沒有什么本質(zhì)上的區(qū)別,只是將無連接的UDP 變成了面向連接的TCP 。值得注意是:
1. ClientB-1 在向ClientA-1 打孔時,發(fā)送的SYN 數(shù)據(jù)包,而且同樣會被NAT-A 丟棄。同時,ClientB-1 需要在原來的socket 上監(jiān)聽,由于重用socket ,所以需要將socket 屬性設(shè)置為SO_REUSEADDR 。
2. ClientA-1 向ClientB-1 發(fā)送連接請求。同樣,由于ClientB-1 到ClientA-1 方向的孔已經(jīng)打好,所以連接會成功,經(jīng)過3 次握手后,ClientA-1 到ClientB-1 之間的連接就建立起來了。
5.4 穿透對稱NAT
上面討論的都是怎樣穿透錐(Cone )NAT ,對稱NAT 和錐NAT 很不一樣。對于 對稱NAT ,當(dāng)一個私網(wǎng)內(nèi)主機(jī)和外部多個不同主機(jī)通信時,對稱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 發(fā)送給Server 的通知消息中,ClientB-1 的socket 依舊是(221.10.145.84:6000 )。而且,在步驟6 時:ClientA-1 向它所知道但錯誤的ClientB-1 發(fā)送數(shù)據(jù)包時,NAT-1 也會重新給ClientA-1 分配端口號。所以,穿透對稱NAT 的機(jī)會很小。下面是兩種有可能穿透對稱NAT 的策略。
5.4.1 同時開放TCP ( Simultaneous TCP open )策略
如果一個 對稱 NAT 接收到一個來自 本地 私有網(wǎng) 絡(luò) 外面的 TCP SYN 包, 這 個包想 發(fā) 起一個 “ 引入” 的TCP 連 接,一般來 說 , NAT 會拒 絕這 個 連 接 請 求并扔掉 這 個 SYN 包,或者回送一個TCP RST(connection reset ,重建 連 接)包 給請 求方。但是,有一 種 情況 卻會接受這個“引入”連接。
RFC 規(guī)定:對于對稱NAT , 當(dāng) 這 個接收到的 SYN 包中的源IP 地址 : 端口、目 標(biāo) IP 地址 : 端口都與NAT 登 記 的一個已 經(jīng) 激活的 TCP 會 話 中的地址信息相符 時 , NAT 將會放行 這 個 SYN 包。 需要 特 別 指出 的是:怎樣才是一個已經(jīng)激活的TCP 連接?除了真正已經(jīng)建立完成的TCP 連接外,RFC 規(guī)范指出: 如果 NAT恰好看到一個 剛剛發(fā) 送出去的一個 SYN 包和 隨之 接收到的SYN 包中的地址 :端口 信息相符合的 話 ,那 么NAT 將會 認(rèn)為這 個 TCP 連 接已 經(jīng) 被激活,并將允 許這 個方向的 SYN 包 進(jìn) 入 NAT 內(nèi)部。 同時開放TCP 策略就是利用這個時機(jī)來建立連接的。
如果 Client A -1 和 Client B -1 能 夠 彼此正確的 預(yù) 知 對 方的 NAT 將會 給 下一個 TCP 連 接分配的公網(wǎng)TCP 端口,并且兩個客 戶 端能 夠 同 時 地 發(fā) 起一 個面向?qū)Ψ降?nbsp;“ 外出 ” 的 TCP 連 接 請求 ,并在 對 方的SYN 包到達(dá)之前,自己 剛發(fā) 送出去的 SYN 包都能 順 利的穿 過 自己的 NAT 的 話 ,一條端 對 端的 TCP 連 接就 能 成功地建立了 。
5.4.2 端口猜測策略
同時開放TCP 策略非常依賴于猜測對方的下一個端口,而且強(qiáng)烈依賴于發(fā)送連接請求的時機(jī),而且還有網(wǎng)絡(luò)的不確定性,所以能夠建立的機(jī)會很小,即使Server 充當(dāng)同步時鐘的角色。下面是一種通過UDP 穿透的方法,由于UDP 不需要建立連接,所以也就不需要考慮“同時開放”的問題。
為了介紹ClientB-1 的詭計(jì),先介紹一下STUN 協(xié)議。STUN (Simple Traversal of UDP Through NATs )協(xié)議是一個輕量級協(xié)議,用來探測被NAT 映射后的地址:端口。STUN 采用C/S 結(jié)構(gòu),需要探測自己被NAT 轉(zhuǎn)換后的地址:端口的Client 向Server 發(fā)送請求,Server 返回Client 轉(zhuǎn)換后的地址:端口。
參考上面UDP穿透NAT 的步驟2 ,當(dāng)ClientB-1 收到Server 發(fā)送給它的消息后,ClientB-1 即打開3 個socket 。socket-0 向STUN Server 發(fā)送請求,收到回復(fù)后,假設(shè)得知它被轉(zhuǎn)換后的地址:端口( 221.10.145.84:600 5 ),socket-1 向ClientA-1 發(fā)送一個UDP 包,socket-2 再次向另一個STUN Server 發(fā)送請求,假設(shè)得到它被轉(zhuǎn)換后的地址:端口( 221.10.145.84:60 20 )。通常,對稱NAT 分配端口有兩種策略,一種是按順序增加,一種是隨機(jī)分配。如果這里對稱NAT 使用順序增加策略,那么,ClientB-1 將兩次收到的地址:端口發(fā)送給Server 后,Server 就可以通知ClientA-1 在這個端口范圍內(nèi)猜測剛才ClientB-1 發(fā)送給它的socket-1 中被NAT 映射后的地址:端口,ClientA-1 很有可能在孔有效期內(nèi)成功猜測到端口號,從而和ClientB-1 成功通信。
5.5 問題總結(jié)
從上面兩種穿透對稱NAT 的方法來看,都建立在了嚴(yán)格的假設(shè)條件下。但是現(xiàn)實(shí)中多數(shù)的NAT 都是錐NAT ,因?yàn)橘Y源畢竟很重要,反觀對稱NAT ,由于太不節(jié)約端口號所以相對來說成本較高。所以,不管是穿透錐NAT,還是對稱NAT ,現(xiàn)實(shí)中都是可以辦到的。除非對稱NAT 真的使用隨機(jī)算法來分配可用的端口。
6.結(jié)語
NAT技術(shù)無可否認(rèn)是在ipv4地址資源的短缺時候起到了緩解作用;在減少用戶申請ISP服務(wù)的花費(fèi)和提供比較完善的負(fù)載平衡功能等方面帶來了不少好處。但是在ipv4地址在以后幾年將會枯竭,NAT技術(shù)不能改變ip地址空間不足的本質(zhì)。然而在安全機(jī)制上也潛在著威脅,在配置和管理上也是一個挑戰(zhàn)。如果要從根本上解決ip地址資源的問題,ipv6才是最根本之路。在ipv4轉(zhuǎn)換到ipv6的過程中,NAT技術(shù)確實(shí)是一個不錯的選擇,相對其他的方案優(yōu)勢也非常明顯。
產(chǎn)品與服務(wù)
香港服務(wù)器 香港高防服務(wù)器 美國服務(wù)器 韓國服務(wù)器 新加坡服務(wù)器 日本服務(wù)器 臺灣服務(wù)器云服務(wù)器
香港云主機(jī) 美國云主機(jī) 韓國云主機(jī) 新加坡云主機(jī) 臺灣云主機(jī) 日本云主機(jī) 德國云主機(jī) 全球云主機(jī)高防專線
海外高防IP 海外無限防御 SSL證書 高防CDN套餐 全球節(jié)點(diǎn)定制 全球?qū)>GPLC關(guān)于我們
關(guān)于天下數(shù)據(jù) 數(shù)據(jù)招商加盟 天下數(shù)據(jù)合作伙伴 天下數(shù)據(jù)團(tuán)隊(duì)建設(shè) 加入天下數(shù)據(jù) 媒體報道 榮譽(yù)資質(zhì) 付款方式關(guān)注我們
微信公眾賬號
新浪微博
天下數(shù)據(jù)手機(jī)站 關(guān)于天下數(shù)據(jù) 聯(lián)系我們 誠聘英才 付款方式 幫助中心 網(wǎng)站備案 解決方案 域名注冊 網(wǎng)站地圖
天下數(shù)據(jù)18年專注海外香港服務(wù)器、美國服務(wù)器、海外云主機(jī)、海外vps主機(jī)租用托管以及服務(wù)器解決方案-做天下最好的IDC服務(wù)商
《中華人民共和國增值電信業(yè)務(wù)經(jīng)營許可證》 ISP證:粵ICP備07026347號
朗信天下發(fā)展有限公司(控股)深圳市朗玥科技有限公司(運(yùn)營)聯(lián)合版權(quán)
深圳總部:中國.深圳市南山區(qū)深圳國際創(chuàng)新谷6棟B座10層 香港總部:香港上環(huán)蘇杭街49-51號建安商業(yè)大廈7樓
7×24小時服務(wù)熱線:4006388808香港服務(wù)電話:+852 67031102
本網(wǎng)站的域名注冊業(yè)務(wù)代理北京新網(wǎng)數(shù)碼信息技術(shù)有限公司的產(chǎn)品