Win XP中網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)概述
簡(jiǎn)介
隨著越來(lái)越多的家庭和小型企業(yè)添置計(jì)算機(jī),它們會(huì)發(fā)現(xiàn)網(wǎng)絡(luò)是一種非常強(qiáng)大的計(jì)算機(jī)資源共享工具。Internet 連接則是網(wǎng)絡(luò)上更珍貴的資源,有可能被共享。為共享 Internet 連接,同時(shí)利用價(jià)格便宜、管理簡(jiǎn)單的家庭或小型辦公網(wǎng)絡(luò),需要部署 Internet 網(wǎng)關(guān)。Internet 網(wǎng)關(guān)通常將 NAT (網(wǎng)絡(luò)地址轉(zhuǎn)換) 作為將多個(gè)主機(jī)連接到 Internet 以共享單個(gè)公共 IP 地址的途徑。但不幸的是,該解決方案卻會(huì)破壞多種網(wǎng)絡(luò)應(yīng)用程序。我們將在本文中對(duì)此加以說(shuō)明。
現(xiàn)有的“NAT 穿越”技術(shù)允許網(wǎng)絡(luò)應(yīng)用程序檢測(cè)是否存在本地 NAT 設(shè)備。檢測(cè)到后,應(yīng)用程序隨即對(duì) NAT 進(jìn)行配置,定義相應(yīng)的映射來(lái)解決兼容性問(wèn)題。
本文屬于概述性文章,將向網(wǎng)絡(luò)應(yīng)用程序的用戶(hù)和開(kāi)發(fā)人員簡(jiǎn)要介紹一下 NAT,介紹如何識(shí)別常見(jiàn) NAT 問(wèn)題,同時(shí)介紹應(yīng)用程序如何使用 “NAT 穿越”解決這些問(wèn)題。需要關(guān)注的 Internet 網(wǎng)關(guān)設(shè)備的一個(gè)重要特征是 UPnP 認(rèn)證。使用者購(gòu)買(mǎi)或從服務(wù)提供商那里租借 Internet 網(wǎng)關(guān)設(shè)備時(shí),強(qiáng)烈建議只考慮那些通過(guò)用于 NAT 穿越的 UPnP 認(rèn)證的設(shè)備,這是因?yàn)樵摴δ軐?duì)于滿(mǎn)足用戶(hù)、降低支持費(fèi)用及使用更有創(chuàng)新性的服務(wù)和應(yīng)用程序而言至關(guān)重要。
對(duì)網(wǎng)關(guān)設(shè)備廠(chǎng)商而言,在 Internet 網(wǎng)關(guān)設(shè)備中加入對(duì) NAT 穿越的 UPnP 技術(shù)支持并不復(fù)雜,費(fèi)用不高,也不用花大量的時(shí)間。通過(guò)使用 UPnP (已經(jīng)是基于 Internet 標(biāo)準(zhǔn)和協(xié)議的),Internet 網(wǎng)關(guān)設(shè)備制造商就可以解決 NAT 穿越問(wèn)題,并將優(yōu)點(diǎn)延伸至大多數(shù)經(jīng)過(guò)該設(shè)備的應(yīng)用程序。這同許多應(yīng)用程序開(kāi)發(fā)人員或網(wǎng)關(guān)設(shè)備制造商不得不為解決上述問(wèn)題而提供一次性解決方案形成鮮明的對(duì)比。本文并非旨在為希望在 Internet 網(wǎng)關(guān)設(shè)備中實(shí)施“NAT 穿越”的硬件制造商提供詳細(xì)的指南。有關(guān)此信息,請(qǐng)參閱 UPnP 論壇 Web 站點(diǎn)。
Windows 體系結(jié)構(gòu)、網(wǎng)絡(luò)以及 UPnP 體系結(jié)構(gòu)方面的知識(shí)會(huì)對(duì)充分理解本文會(huì)有所幫助,但并不是必需的。
什么是 NAT?
網(wǎng)絡(luò)地址轉(zhuǎn)換 (NAT) 是一個(gè) Internet 工程任務(wù)組 (Internet Engineering Task Force,IETF) 標(biāo)準(zhǔn),用于允許專(zhuān)用網(wǎng)絡(luò)上的多臺(tái) PC (使用專(zhuān)用地址段,例如 10.0.x.x、192.168.x.x、172.x.x.x) 共享單個(gè)、全局路由的 IPv4 地址。IPv4 地址日益不足是經(jīng)常部署 NAT 的一個(gè)主要原因。Windows XP 和 Windows Me 中的“Internet 連接共享”及許多 Internet 網(wǎng)關(guān)設(shè)備都使用 NAT,尤其是在通過(guò) DSL 或電纜調(diào)制解調(diào)器連接寬帶網(wǎng)的情況下。
NAT 對(duì)于解決 IPv4 地址耗費(fèi)問(wèn)題 (在 IPv6 部署中卻沒(méi)必要) 盡管很有效,但畢竟屬于臨時(shí)性的解決方案。這種 IPv4 地址占用問(wèn)題在亞洲及世界其他一些地方已比較嚴(yán)重,且日漸成為北美地區(qū)需要關(guān)注的問(wèn)題。這就是人們?yōu)槭裁撮L(zhǎng)久以來(lái)一直關(guān)注使用 IPv6 來(lái)克服這個(gè)問(wèn)題的原因所在。
除了減少所需的 IPv4 地址外,由于專(zhuān)用網(wǎng)絡(luò)之外的所有主機(jī)都通過(guò)一個(gè)共享的 IP 地址來(lái)監(jiān)控通信,因此 NAT 還為專(zhuān)用網(wǎng)絡(luò)提供了一個(gè)隱匿層。NAT 與 防火墻 或代理服務(wù)器不同,但它確實(shí)有利于安全。
圖 1:使用 NAT 設(shè)備進(jìn)行 Internet 通信的網(wǎng)絡(luò)示例。 正如固定電纜調(diào)制解調(diào)器或 DSL 調(diào)制解調(diào)器可以作為 NAT 設(shè)備一樣, PC 也可以作為 NAT 設(shè)備。 常規(guī) NAT 操作
NAT 設(shè)備后面的客戶(hù)端通常通過(guò) DHCP (動(dòng)態(tài)主機(jī)配置協(xié)議) 分配到專(zhuān)用的 IP 地址,或者由管理員進(jìn)行靜態(tài)配置。在該專(zhuān)用網(wǎng)絡(luò)的外面進(jìn)行通信時(shí),通常會(huì)發(fā)生下列事情。
在客戶(hù)機(jī)上
當(dāng)應(yīng)用程序想同服務(wù)器通信時(shí),它將打開(kāi)與源 IP 地址、源端口、目標(biāo) IP 地址、目標(biāo)端口及網(wǎng)絡(luò)協(xié)議相關(guān)聯(lián)的套接字。這樣可以識(shí)別通信所需的兩個(gè)端點(diǎn)。當(dāng)應(yīng)用程序利用該套接字傳輸信息時(shí),客戶(hù)機(jī)的專(zhuān)用 IP 地址 (源 IP 地址) 和端口 (源端口) 將被插入數(shù)據(jù)包的源字段中。數(shù)據(jù)包的目標(biāo)字段將包含服務(wù)器的 IP 地址 (遠(yuǎn)程主機(jī) - 目標(biāo) IP 地址) 和端口。由于該數(shù)據(jù)包的目的地是該專(zhuān)用網(wǎng)絡(luò)之外的某個(gè)位置,因此客戶(hù)機(jī)將把該數(shù)據(jù)包轉(zhuǎn)發(fā)給默認(rèn)的網(wǎng)關(guān)。這種情況下的默認(rèn)網(wǎng)關(guān)就是 NAT 設(shè)備。
NAT 設(shè)備上的輸出數(shù)據(jù)包
NAT 設(shè)備將截獲該輸出數(shù)據(jù)包,然后利用目標(biāo) IP 地址 (服務(wù)器)、目標(biāo)端口、NAT 設(shè)備的外部 IP 地址、外部端口、網(wǎng)絡(luò)協(xié)議及客戶(hù)機(jī)的內(nèi)部 IP 地址和端口來(lái)創(chuàng)建端口映射。
NAT 設(shè)備將維護(hù)這些映射組成的表,并將該端口的映射存儲(chǔ)在表中。外部 IP 地址和端口就是該數(shù)據(jù)通信用于取代內(nèi)部客戶(hù)機(jī) IP 地址和端口的公共 IP 地址和端口。
NAT 設(shè)備隨即將來(lái)自客戶(hù)機(jī)專(zhuān)用內(nèi)部 IP 地址和端口的數(shù)據(jù)包的源字段轉(zhuǎn)換為 NAT 設(shè)備的公共 IP 地址和端口,從而對(duì)這些數(shù)據(jù)包進(jìn)行轉(zhuǎn)換。
然后,數(shù)據(jù)包將通過(guò)外部網(wǎng)絡(luò)發(fā)送出去,并最終到達(dá)目標(biāo)服務(wù)器。
圖 2:出站數(shù)據(jù)包轉(zhuǎn)換的示例。
服務(wù)器上
當(dāng)服務(wù)器接收到數(shù)據(jù)包時(shí),它認(rèn)為自己是在和一臺(tái)具有可全球路由 IP 地址的計(jì)算機(jī)進(jìn)行通信。它會(huì)利用自己源字段中的 IP 地址和端口將響應(yīng)數(shù)據(jù)包定向到 NAT 設(shè)備的外部 IP 地址和端口。
NAT 設(shè)備上的輸入數(shù)據(jù)包
NAT 從服務(wù)器那接收到這些數(shù)據(jù)包,然后將數(shù)據(jù)包與其端口映射表進(jìn)行比較。如果 NAT 發(fā)現(xiàn)某個(gè)端口映射的遠(yuǎn)程主機(jī) IP 地址、遠(yuǎn)程端口、外部端口及網(wǎng)絡(luò)協(xié)議與輸入數(shù)據(jù)包的源 IP 地址、源端口、目標(biāo)端口和網(wǎng)絡(luò)協(xié)議匹配,NAT 就會(huì)進(jìn)行反向轉(zhuǎn)換。NAT 將把數(shù)據(jù)包目標(biāo)字段中的外部 IP 地址和外部端口替換為客戶(hù)機(jī)的專(zhuān)用 IP 地址和內(nèi)部端口。
然后,NAT 將內(nèi)部網(wǎng)絡(luò)上的數(shù)據(jù)包發(fā)送給客戶(hù)機(jī)。然而,如果 NAT 找不到對(duì)應(yīng)的端口映射,它就會(huì)丟棄輸入數(shù)據(jù)包并中斷連接。
NAT 的作用是,客戶(hù)機(jī)將能在全球 Internet 上與專(zhuān)用 IP 地址進(jìn)行通訊,而應(yīng)用程序或客戶(hù)機(jī)卻無(wú)需做任何額外的工作。這意味著應(yīng)用程序不必調(diào)用額外的 API,客戶(hù)機(jī)也不必執(zhí)行附加的配置。在這種情況下,NAT 對(duì)客戶(hù)機(jī)和服務(wù)器應(yīng)用程序來(lái)說(shuō)都是透明的 - 所有對(duì)象都正常工作。
但是,并非所有網(wǎng)絡(luò)應(yīng)用程序都使用能與 NAT 協(xié)同工作的協(xié)議。這就是問(wèn)題的所在。
NAT 與應(yīng)用程序之間的常見(jiàn)問(wèn)題
如果客戶(hù)機(jī)在開(kāi)始連接和接收回復(fù)時(shí)都使用同一端口,則讓客戶(hù)機(jī)利用 NAT 來(lái)共享單個(gè)可全局路由的 IP 地址不會(huì)有什么問(wèn)題。但是,許多應(yīng)用程序所用策略的假定條件在 NAT 設(shè)備用于連接 Internet 時(shí)都不成立。這里將討論其中一些問(wèn)題。
內(nèi)部網(wǎng)絡(luò)上的服務(wù)很多網(wǎng)絡(luò)服務(wù)或服務(wù)器假定,如果建立監(jiān)聽(tīng)套接字,則 Internet 上的所有客戶(hù)機(jī)都可以與之聯(lián)系。如果在網(wǎng)絡(luò)的邊界上有 NAT 設(shè)備,為了將通信引入到內(nèi)部網(wǎng)絡(luò)服務(wù),NAT 需要存在端口映射。但在網(wǎng)絡(luò)邊緣上有 NAT 設(shè)備時(shí),NAT 卻要求進(jìn)行端口映射,以便將輸入通訊轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)。因此,該服務(wù)僅對(duì)專(zhuān)用網(wǎng)絡(luò)上的客戶(hù)機(jī)有效。它對(duì)于 Internet 其余部分而言不可用。
該問(wèn)題最常見(jiàn)的解決辦法是手動(dòng)配置端口映射,使 NAT 設(shè)備將定向給 NAT 特定外部 IP 地址和端口的通信轉(zhuǎn)發(fā)給該服務(wù)所用的內(nèi)部 IP 地址和端口。
利用該端口映射,服務(wù)可以接收輸入數(shù)據(jù)包,從而使服務(wù)可被專(zhuān)用網(wǎng)絡(luò)外部的客戶(hù)機(jī)所使用。建立端口映射之前,網(wǎng)絡(luò)是斷開(kāi)的。
手動(dòng)配置映射通常很復(fù)雜,為了正確配置映射需要較有經(jīng)驗(yàn)的用戶(hù)。因此,除非是聯(lián)系自己寬帶 Internet 服務(wù)提供商、PC 制造商、零售商或 Internet 網(wǎng)關(guān)制造商的客戶(hù)服務(wù)中心以嘗試找到問(wèn)題的根源及解決方案,否則許多一般用戶(hù)或小型企業(yè)用戶(hù)將無(wú)法使用所需的應(yīng)用程序或服務(wù)。上述情況還會(huì)造成映射的不嚴(yán)格:許多外部客戶(hù)機(jī)都可以使用該映射來(lái)連接服務(wù)器。
嵌入地址或端口
有些網(wǎng)絡(luò)應(yīng)用程序假定客戶(hù)機(jī)所分配的 IP 地址和端口將始終可進(jìn)行全局路由,并可直接在 Internet 上使用。許多情況下,它們屬于 IETF 保留地址范圍內(nèi)的專(zhuān)用 IP 地址。應(yīng)用程序會(huì)在發(fā)送給服務(wù)器的數(shù)據(jù)包的負(fù)載中包含該專(zhuān)用 IP 地址或端口。服務(wù)器可以將該嵌入地址用作聯(lián)系客戶(hù)機(jī)時(shí)所用的地址。
如果服務(wù)器試圖用嵌入 IP 地址和端口進(jìn)行回復(fù),而非 NAT 提供的映射地址和端口,系統(tǒng)就會(huì)丟棄該數(shù)據(jù)包。這是因?yàn)榍度?IP 地址是無(wú)法路由的。如果網(wǎng)絡(luò)應(yīng)用程序能找到 NAT 設(shè)備并檢索到所要使用的外部 IP 地址和外部端口映射,應(yīng)用程序就可以在數(shù)據(jù)包中嵌入正確的信息。
使用分散套接字的應(yīng)用程序
還有一些網(wǎng)絡(luò)應(yīng)用程序使用端口 ' X ' 上的套接字向服務(wù)器或?qū)Φ扔?jì)算機(jī)發(fā)送通訊信息,然后等待將服務(wù)器的通訊信息接收到端口 ' Y ' 的獨(dú)立監(jiān)聽(tīng)套接字上。NAT 將監(jiān)視輸出通訊并為端口 ' X ' 創(chuàng)建端口映射,但并不對(duì)尋址到端口 ' Y ' 的返回?cái)?shù)據(jù)包進(jìn)行端口映射。尋址到端口 ' Y ' 的輸入數(shù)據(jù)包將被丟棄。
需要端口可用
有些網(wǎng)絡(luò)協(xié)議假定始終有可全局路由的已知端口可用。當(dāng)多個(gè)客戶(hù)機(jī)共享 IP 地址時(shí),每次將只有一個(gè)客戶(hù)機(jī)能使用已知端口。例如,每次只有一個(gè) Web 服務(wù)能使用本地網(wǎng)絡(luò)上的端口 80。如果不是這樣,NAT 設(shè)備將無(wú)法確定外部請(qǐng)求所適用的客戶(hù)機(jī)。即使在配置端口映射的用戶(hù)的幫助下,如果從本地網(wǎng)絡(luò)的外部能找到多個(gè)客戶(hù)機(jī),也必須采取某些特殊的措施。
多個(gè) NAT
對(duì)于客戶(hù)機(jī)位于一個(gè) NAT 后面的 NAT 的后面這個(gè)問(wèn)題已經(jīng)超出了本文所涵蓋的范圍。
對(duì)用戶(hù)和行業(yè)的影響
上一段介紹了與 NAT 穿越有關(guān)的技術(shù)問(wèn)題。從用戶(hù)的角度講,它所造成的影響比較簡(jiǎn)單:人們?cè)僖矡o(wú)法使用受 NAT 干擾的服務(wù)或應(yīng)用程序。
現(xiàn)在,大多數(shù)用戶(hù)甚至沒(méi)有意識(shí)到自己已成為這種 NAT 問(wèn)題的“受害者”。他們只是知道,當(dāng)試圖玩多人游戲或者使用對(duì)等應(yīng)用程序 (例如進(jìn)行實(shí)時(shí)通訊) 或其他某些應(yīng)用程序時(shí),卻無(wú)法玩或無(wú)法使用。他們可能會(huì)在 PC 上看到類(lèi)似“無(wú)法連接”等的錯(cuò)誤消息,或者在試圖使用應(yīng)用程序時(shí),程序卻出現(xiàn)故障。
有時(shí),具有撥號(hào)調(diào)制解調(diào)器 Internet 連接的用戶(hù)在使用撥號(hào)調(diào)制解調(diào)器時(shí)不會(huì)出現(xiàn)上述問(wèn)題。但當(dāng)用戶(hù)使用寬帶服務(wù)并將 DSL 或電纜調(diào)制解調(diào)器設(shè)備與 NAT 一起使用時(shí),卻出現(xiàn)故障。在進(jìn)行快速 Internet 連接的情況下,這些用戶(hù)尤其會(huì)受到 NAT 問(wèn)題的困擾:它們會(huì)突然導(dǎo)致用戶(hù)無(wú)法玩游戲或使用其他服務(wù)。
這導(dǎo)致了用戶(hù)的不滿(mǎn),矛頭指向 PC 生產(chǎn)商、ISP、Internet 網(wǎng)關(guān)提供商等等。通常,用戶(hù)并不知道問(wèn)題的根源,而技術(shù)支持人員也并不總能知道如何通過(guò)電話(huà)解決這些問(wèn)題。
這已不僅是用戶(hù)的問(wèn)題。它也成為向用戶(hù)提供產(chǎn)品和服務(wù)的制造商的問(wèn)題。用戶(hù)在試圖解決這些由 NAT 引起的問(wèn)題時(shí)會(huì)撥打支持電話(huà),而這部分費(fèi)用會(huì)減少制造商或零售商的利潤(rùn),甚至使其無(wú)利可圖。這些問(wèn)題會(huì)導(dǎo)致用戶(hù)對(duì)試用服務(wù)的不滿(mǎn),從而使某些用戶(hù)降低了對(duì)后續(xù)的新服務(wù)或新應(yīng)用程序的興趣。因此,NAT 會(huì)妨礙其他創(chuàng)新產(chǎn)品/服務(wù)的推出和使用。
鑒于上述因素,解決 NAT 問(wèn)題已成為業(yè)界的一項(xiàng)重要任務(wù)。
什么是“NAT 穿越”?“NAT 穿越”是這樣一組功能:它允許網(wǎng)絡(luò)應(yīng)用程序能明確自己位于 NAT 設(shè)備的后面,獲得外部 IP 地址,并將端口映射配置為將 NAT 外部端口的數(shù)據(jù)包轉(zhuǎn)發(fā)給應(yīng)用程序所用的內(nèi)部端口,而所有這些都是自動(dòng)完成的,因此用戶(hù)不必手動(dòng)配置端口映射或其他類(lèi)似的方面。
相對(duì)與目前所用的、面向特定應(yīng)用程序的其他方法而言,這對(duì)于解決由 NAT 引起的連接問(wèn)題確實(shí)是一種更為全面的解決方案。目前使用的那些專(zhuān)門(mén)解決方案有的要求用戶(hù)具有一定的技術(shù)知識(shí),有的要求應(yīng)用程序開(kāi)發(fā)人員或 Internet 網(wǎng)關(guān)提供商進(jìn)行專(zhuān)門(mén)的開(kāi)發(fā)工作,也有的則對(duì)二者都要求。
雖然 NAT 穿越可以解決一些 NAT 問(wèn)題,但它不是萬(wàn)能藥,不能解決所有問(wèn)題。盡管如此,在提高用戶(hù)滿(mǎn)意度、減少用戶(hù)支持呼叫的次數(shù)和支持新的、具有創(chuàng)造性的服務(wù)和應(yīng)用程序方面,這種自動(dòng)化的 NAT 穿越代表了非常重要的一步,尤其對(duì)于家庭網(wǎng)絡(luò)環(huán)境而言。
NAT 穿越應(yīng)視為一種在需要時(shí)使用的處理機(jī)制,而非在所有情況下都發(fā)揮作用。在 IPv6 中,每個(gè)客戶(hù)機(jī)都具有可全局路由的 IP 地址,因此已不再需要 NAT 及 NAT 穿越。就 IPv6 能在多長(zhǎng)時(shí)間得到普遍部署這一問(wèn)題,有各種不同的預(yù)測(cè)。在業(yè)界,包括 Microsoft ,已投入巨資推進(jìn) IPv6,但在現(xiàn)在及未來(lái)的幾年內(nèi),本文后面所述的 NAT 穿越解決方案對(duì)于希望解決 NAT 問(wèn)題的一般用戶(hù)和小型企業(yè)用戶(hù)而言卻意義非凡。
NAT 穿越操作
“NAT 穿越”依賴(lài)于作為通用即插即用 (UPnP) 論壇規(guī)范組成部分的發(fā)現(xiàn)和控制協(xié)議。UPnP 論壇有一個(gè)工作委員會(huì)主要負(fù)責(zé)定義 Internet 網(wǎng)關(guān)設(shè)備的控制協(xié)議并定義這些設(shè)備的服務(wù)。
支持 Internet 網(wǎng)關(guān)設(shè)備控制協(xié)議基本元素的 Internet 網(wǎng)關(guān)設(shè)備可向局域網(wǎng)上的控制點(diǎn)聲明自己的存在并發(fā)布 XML 描述文檔。利用這些 XML 描述文檔,控制點(diǎn)就能了解用于確定 Internet 網(wǎng)關(guān)是否支持 NAT、獲取 NAT 的外部 IP 地址及創(chuàng)建端口映射時(shí)需要調(diào)用的 UPnP 操作。
Windows 中的“NAT 穿越 API”對(duì)直接使用 UPnP 的要求進(jìn)行了提煉,可提供用于檢測(cè)、管理和配置 NAT 設(shè)備的接口。
NAT 穿越 API
當(dāng)網(wǎng)絡(luò)應(yīng)用程序需要檢測(cè)是否存在 NAT 設(shè)備并調(diào)整該設(shè)備的行為時(shí),該應(yīng)用程序可以使用 Windows 中提供的“NAT 穿越 API”(完整記錄在 Platform SDK 中) 來(lái)實(shí)現(xiàn)下列功能:
.
判斷 NAT 是否存在
.獲取 NAT 的外部 IP 地址。
.獲取特定外部端口的靜態(tài)端口映射信息 (如果已映射)。
.添加靜態(tài)端口映射 (除非已分配外部端口)。
.啟用或禁用特定的端口映射而不刪除
.編輯靜態(tài)端口映射的界面友好描述
.刪除靜態(tài)端口映射
.獲取局域網(wǎng)靜態(tài)端口映射的列表。
利用這些功能,應(yīng)用程序可以解決許多因 NAT 而導(dǎo)致的問(wèn)題。請(qǐng)注意:Windows NAT 穿越 API 目前僅在有限的時(shí)間內(nèi)支持端口映射,否則將稱(chēng)為靜態(tài)端口映射。
Windows XP 中的 NAT 穿越 API
默認(rèn)情況下,Windows XP 中將安裝 NAT 穿越 API。這些 API 也可安裝在運(yùn)行 Windows Me 和 Windows 98 的計(jì)算機(jī)中,方法是使用 Windows XP CD 上一個(gè)名為“網(wǎng)絡(luò)安裝向?qū)А钡墓ぞ摺樘峁└郊?XML 解析器支持,“NAT 穿越 API”還要求安裝 Internet Explorer 6.0。
Windows 2000 目前不支持“NAT 穿越”。
Internet 網(wǎng)關(guān)中支持 NAT 穿越
Internet 網(wǎng)關(guān)對(duì) NAT 穿越的支持是通過(guò)支持 “通用即插即用論壇” 所定義的 Internet 網(wǎng)關(guān)設(shè)備 (IGD) 規(guī)范而實(shí)現(xiàn)的。網(wǎng)關(guān)制造商還應(yīng)注意到:Windows 中的 NAT 穿越 API 對(duì) IGD 進(jìn)行下列假定:
.
IGD 每次僅聲明一個(gè)外部接口。盡管在技術(shù)上允許 Internet 網(wǎng)關(guān)設(shè)備聲明多個(gè)外部接口,但“NAT 穿越 API”卻只使用第一個(gè)。
.IGD 支持允許任何遠(yuǎn)程 IP 地址將數(shù)據(jù)包發(fā)送給內(nèi)部客戶(hù)機(jī)的端口映射。
.IGD 支持具有廣播地址 (列為客戶(hù)機(jī)) 的端口映射
.IGD 支持 NAT 外部端口數(shù)與客戶(hù)機(jī)內(nèi)部端口數(shù)不同。
.IGD 將聲明版本號(hào) 1。
.靜態(tài)端口映射 (或稱(chēng)持續(xù)時(shí)間設(shè)置為無(wú)限的端口映射) 將無(wú)限期存在。即使是重新啟動(dòng)系統(tǒng)、更改 IP 地址或是服務(wù)器上存在客戶(hù)機(jī),都無(wú)法去除靜態(tài)端口映射。
本文寫(xiě)作的過(guò)程中,幾個(gè)業(yè)界領(lǐng)先的制造商已經(jīng)宣布在 2001 年提供支持這些 UPnP 方法并且能與 Windows NAT 穿越 API 協(xié)同使用的 Internet 網(wǎng)關(guān)設(shè)備。對(duì)于業(yè)界和用戶(hù)而言,這都是向前邁進(jìn)的有意義的一步。
隨著越來(lái)越多的 Internet 網(wǎng)關(guān)設(shè)備提供商認(rèn)識(shí)到使用 UPnP 解決上述問(wèn)題所具有的優(yōu)勢(shì),隨著更多一般用戶(hù)和小型企業(yè)用戶(hù)開(kāi)始意識(shí)到與 NAT 有關(guān)的問(wèn)題及這些支持 UPnP 的 NAT 穿越解決方案的強(qiáng)大功能,為 NAT 穿越提供 UPnP 支持有望成為此類(lèi)設(shè)備的必備功能或入市前提。
Internet 網(wǎng)關(guān)制造商應(yīng)加入 UPnP 論壇,了解如何使自己的 Internet 網(wǎng)關(guān)設(shè)備符合 UPnP 標(biāo)準(zhǔn)。
應(yīng)說(shuō)明的是:Windows XP 上的“Internet 連接共享”支持 UPnP IGD 標(biāo)準(zhǔn) 0.9 版。預(yù)計(jì)版本 1.0 將與版本 0.9 兼容。
應(yīng)用程序怎樣使用 NAT 穿越
應(yīng)用程序使用“NAT 穿越”的方式與多個(gè)因素有關(guān),包括端口映射期望的生存期及端口是否用于多個(gè)客戶(hù)機(jī)或服務(wù)。應(yīng)用程序應(yīng)清除自己創(chuàng)建的所有靜態(tài)端口映射,以避免出現(xiàn)孤立映射及端口被其他應(yīng)用程序占盡的情況。
如果應(yīng)用程序是一種網(wǎng)絡(luò)服務(wù) (例如 Web 服務(wù)器),并在生存期內(nèi)要求使用已知端口,它的安裝程序就可以使用 “NAT 穿越 API” 來(lái)配置一個(gè)靜態(tài)端口映射。假定其他應(yīng)用程序、網(wǎng)絡(luò)管理員、網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)都維持原狀,而清除機(jī)制也保持映射不變,則外部客戶(hù)機(jī)就能在服務(wù)生存期內(nèi)連接該服務(wù)。應(yīng)用程序卸載服務(wù)負(fù)責(zé)刪除這個(gè)映射。如果出現(xiàn)崩潰,即使服務(wù)已不存在,靜態(tài)端口映射也仍將存在。如果外部 IP 地址發(fā)生變化,則靜態(tài)端口映射將自動(dòng)獲取更改的內(nèi)容。
如果應(yīng)用程序并不始終運(yùn)行,或者對(duì)網(wǎng)絡(luò)維護(hù)其靜態(tài)端口映射的信任度降低,它就可以在每次啟動(dòng)時(shí)保留某個(gè)已知端口,并在每次關(guān)閉時(shí)恢復(fù)資源。這一點(diǎn)可通過(guò)運(yùn)行某個(gè)并行腳本來(lái)實(shí)現(xiàn)。作為添加和刪除端口映射的替代方案,可以讓?xiě)?yīng)用程序根據(jù)需要啟用和禁用映射。應(yīng)用程序還可以始終保留靜態(tài)端口映射,且只在每次啟用時(shí)刷新映射。
同樣,如果外部 IP 地址發(fā)生變化,則靜態(tài)端口映射將自動(dòng)獲取更改的內(nèi)容。
如果專(zhuān)用網(wǎng)絡(luò)上不同客戶(hù)機(jī)的多個(gè)應(yīng)用程序使用同一內(nèi)部端口號(hào),應(yīng)用程序就會(huì)要求進(jìn)行修改,以支持多個(gè)客戶(hù)機(jī)的運(yùn)行。只有單個(gè)客戶(hù)機(jī)能使用外部端口映射的內(nèi)部端口號(hào)。此處建議讓第一個(gè)客戶(hù)機(jī)使用。其他客戶(hù)機(jī)應(yīng)請(qǐng)求內(nèi)部端口數(shù)不同于外部端口數(shù)的非對(duì)稱(chēng)端口映射。
有一種特殊的情況:多個(gè)客戶(hù)機(jī)可監(jiān)聽(tīng)同一外部端口,而唯一的目的是被遠(yuǎn)程主機(jī)發(fā)現(xiàn)。輸入數(shù)據(jù)包可以轉(zhuǎn)換為使用內(nèi)部客戶(hù)機(jī) IP 地址的廣播地址,而非特定的客戶(hù)機(jī)地址。監(jiān)聽(tīng)該端口的客戶(hù)機(jī)可通過(guò)啟動(dòng)自己與遠(yuǎn)程主機(jī)之間的連接而予以回復(fù)。建議不要普遍使用這種方案,因?yàn)榈皆摰刂返妮斎霐?shù)據(jù)包將被網(wǎng)絡(luò)上的所有客戶(hù)機(jī)接收,并會(huì)反過(guò)來(lái)對(duì)它們?cè)斐捎绊憽?/p>
如果服務(wù)需要短期監(jiān)聽(tīng)某個(gè)隨機(jī)端口,它應(yīng)在應(yīng)用程序中請(qǐng)求一個(gè)靜態(tài)端口映射,而非使用腳本。服務(wù)結(jié)束時(shí),應(yīng)予以清除 (刪除映射)。應(yīng)用程序應(yīng)保留一份自己特有端口映射的記錄。這樣,如果應(yīng)用程序在崩潰時(shí)沒(méi)有關(guān)閉映射,就可以在下一次啟動(dòng)時(shí)檢索出清除端口映射所需的必要信息。
如果應(yīng)用程序離開(kāi)網(wǎng)絡(luò)時(shí)沒(méi)有清除其端口映射,則該映射就會(huì)保留下來(lái),而清除任務(wù)就落在用戶(hù)的身上。目前 Windows 中尚沒(méi)有清除機(jī)制,這是因?yàn)楹茈y判斷應(yīng)用程序不再使用映射的時(shí)間。
NAT 穿越的局限
盡管“NAT 穿越”可以解決與通過(guò) NAT 設(shè)備進(jìn)行連接時(shí)有關(guān)的多種問(wèn)題,但還有“NAT 穿越”無(wú)法解決的問(wèn)題及由其引起的問(wèn)題。這些問(wèn)題包括:
.
NAT 穿越使用開(kāi)放式信任模式。這意味著專(zhuān)用網(wǎng)絡(luò)上的所有應(yīng)用程序都能訪(fǎng)問(wèn) NAT 上的所有端口映射。盡管這樣可以增加一些管理方面的靈活性,但應(yīng)用程序也就失去了對(duì)其映射的唯一占有權(quán)。
.應(yīng)用程序?qū)⒇?fù)責(zé)解決沖突。如果應(yīng)用程序嘗試映射某個(gè)已映射給其他客戶(hù)機(jī)的端口,它就應(yīng)負(fù)責(zé)查找另一個(gè)端口或改寫(xiě)應(yīng)用程序。
.NAT 穿越無(wú)法解決在 ISP 分發(fā)專(zhuān)用地址和使用 NAT 進(jìn)行客戶(hù)機(jī)連接方面的問(wèn)題。這種情況下,NAT 位于 Internet 網(wǎng)關(guān)設(shè)備的外面,實(shí)際上位于服務(wù)提供商網(wǎng)絡(luò)的內(nèi)部。如果客戶(hù)機(jī)網(wǎng)絡(luò)上的 NAT 位于另一個(gè)同類(lèi) NAT 的后面,家庭或小型企業(yè)中的 NAT 穿越就會(huì)出現(xiàn)故障。因此,建議 Internet 服務(wù)提供商不要在自己的網(wǎng)絡(luò)內(nèi)部署 NAT。
.應(yīng)用程序獲取 NAT 穿越時(shí)并非毫無(wú)代價(jià)。它們必須同時(shí)進(jìn)行修改以調(diào)用 API,或者隨帶腳本以提供解決方案。這對(duì)于大多數(shù)開(kāi)發(fā)人員而言仍在可控制的范圍內(nèi),尤其是考慮到將這些 NAT 穿越機(jī)制并入應(yīng)用程序后,應(yīng)用程序就能自動(dòng)與多種 Internet 網(wǎng)關(guān)設(shè)備協(xié)同使用。
.使用完端口映射后,應(yīng)用程序負(fù)責(zé)清除工作。靜態(tài)映射會(huì)無(wú)限期存在,最好用于打算在整個(gè)應(yīng)用程序生存期內(nèi)監(jiān)聽(tīng)知名端口的服務(wù)。
.提供 NAT 的 Internet 網(wǎng)關(guān)必須支持通用即插即用 Internet 網(wǎng)關(guān)設(shè)備規(guī)范 (至少為版本 0.9)。
結(jié)論
NAT 是得到 IETF 認(rèn)可的解決方案,針對(duì)的是 IPv4 名稱(chēng)空間耗用問(wèn)題。使用 NAT 的 Internet 網(wǎng)關(guān)經(jīng)常用于家庭和小型企業(yè)。之所以使用它們,是因?yàn)樗鼈儍r(jià)格便宜,易于管理,無(wú)需用戶(hù)安裝特殊的軟件。
使用 NAT 的不足在于會(huì)破壞許多聊天、多人游戲和對(duì)等應(yīng)用程序。這是因?yàn)樗鼈兊木W(wǎng)絡(luò)協(xié)議對(duì)網(wǎng)絡(luò)體系結(jié)構(gòu)所做的假定已不成立。
“NAT 穿越”為應(yīng)用程序提供了一條查找 NAT 設(shè)備、發(fā)現(xiàn)可全局路由的共享 IP 地址并配置靜態(tài)端口映射以解決某些連接問(wèn)題的途徑。NAT 穿越解決方案無(wú)法解決與 NAT 有關(guān)的所有問(wèn)題,但可以緩解部分問(wèn)題。
本文的主要結(jié)論是:
.
Internet 網(wǎng)關(guān)設(shè)備制造商應(yīng)在自己的設(shè)備中支持 UPnP,從而支持“NAT 穿越”。
.網(wǎng)絡(luò)應(yīng)用程序開(kāi)發(fā)人員應(yīng)使用 Windows NAT 穿越 API 來(lái)檢測(cè) NAT 的存在,并在必要時(shí)允許其應(yīng)用程序經(jīng)過(guò) NAT。
.用戶(hù)應(yīng)使用支持 UPnP 和“NAT 穿越”的 Internet 網(wǎng)關(guān)設(shè)備,以確保最佳的應(yīng)用程序性能。
.DSL 和電纜調(diào)制解調(diào)器的服務(wù)提供商應(yīng)指定、銷(xiāo)售和租賃為 NAT 穿越提供 UPnP 支持的 Internet 網(wǎng)關(guān)設(shè)備。
在 IPv6 最終消除 NAT 之前,某些形式的 NAT 穿越仍會(huì)繼續(xù)存在。
相關(guān)文章:
