<轉自http://yangzb.iteye.com/blog/1030060>
一、引言
RFCl631以及相關RFC定義的網絡位址翻譯器(NAT)是一種将IP位址從一個編址域(realm)映射到另外一個編址域的方法,如最典型的應 用是把RFCl918定義的私有IP位址映射到Internet所使用的公有IP位址。雖然NAT技術已經得到廣泛應用,但它是一把雙刃劍,在帶來節省IPv4位址空間等好處的同時,破壞了Internet最基本的“端到端的透明性”的設計理念,增加了網絡的複雜性,阻礙了業務的創新。
IETF一直主張利用IPv6技術解決位址短缺問題,是以IETF雖然出版了幾個與NAT相關的RFC,但對NAT技術(尤其是穿越問題)一直沒有系 統的标準化工作,如SIP和MobileIP就是NAT出現後設計的一些協定,都未考慮到NAT的穿越問題。最近,業界意識到Internet在短期内不 可能過渡到IPv6,IPv4和IPv6将長期并存,NAT以及NAT-PT(NAT-協定翻譯)将繼續得到長期應用,是以NAT相關問題開始引起了IETF和ITU-T等相關國際标準化組織的關注。中國通信标準化協會IP與多媒體工作委員會也正在積極參與ITU-TSGl6組的相關活動,加緊制定中 國的多媒體業務NAT穿越标準。本文介紹NAT穿越問題的重要組成部分:NAT的類型。
二、NAT的類型
從功能上看,主要有以下幾種典型的NAT(RFC2663)(見圖1):

1.傳統NAT(Traditional NAT)
在多數情況下,傳統NAT允許位于内部網絡的主機(采用RFCl918位址)透明地通路外部網絡中的主機,把從外部網絡到内部網絡的通路作為一種特 例,為事先選擇好的特定内部主機做靜态位址映射。外部網絡中主機的IP位址在外部網絡以及内部網絡中是惟一的和有效的,但内部網絡主機的IP位址隻有在内 部網絡中才是惟一的,在外部網絡中不一定有效。換言之,NAT不會向外部編址域通告内部網絡的位址,但有可能向内部網絡通告外部網絡的位址。内部網絡使用 的位址一定不能與外部網絡的位址重疊,任何一個位址是一個内部位址或外部位址,不能同時是内部和外部位址。
有關傳統NAT的較長的描述見RFCl631和RFC3022。傳統NAT包括基本NAT和NAPT兩大類。
(1)基本NAT
NAT擁有多個公開IP位址,當位于内部網絡的主機向外部主機發起會話請求時,把内部位址翻譯成全球惟一的公開IP位址。對于從内部網絡中外出的IP包,翻譯源IP位址以及相關的字段,如IP/TCP/UDP/ICMP頭校驗和。對于進入内部網絡的IP包,翻譯目的IP位址以及與上面所羅列的相關字 段。如果内部網絡中主機的數目不大于NAT所擁有的公開IP位址的數目,則可以保證每個内部位址都可以映射到一個公開的IP位址,否則允許同時連接配接到外部 網絡的内部主機的數目會受到NAT公開IP位址數量的限制。可以使用靜态映射的方式,把特定内部主機映射為一個特定的全球惟一的位址,保證了外部對内部主 機的通路。一個内部主機可以利用相同的位址映射同時發起多個會話。
(2)NAPT
NAPT(網絡位址端口翻譯)把“基本NAT”翻譯的概念延伸了一步,翻譯位址的同時也翻譯傳輸層标志(如TCP/UDP的端口号,ICMP的查詢ID),進而把多個内部主機的傳輸層标志複用為一個惟一的外部位址。NAPT使得一組主機可以共享一個惟一的外部位址。在實際使用中可以把NAPT和基本NAT結合起來,将一組外部位址與端口翻譯關聯起來。
對于從内部網絡向外的通路請求,NAPT翻譯源IP位址、源傳輸層标志以及相關的字段,如IP,TCP,UDP和ICMP頭校驗和。對于進入内部網絡 的包,翻譯目的IP位址、目的傳輸層标志以及IP層和傳輸層頭校驗和。傳輸層标志可以是TCP/UDP端口号或ICMP查詢ID中的任意一種。
2.雙向NAT(Bi-directionaINAT,Two-WayNAT)
當使用雙向NAT(Bi-directionaINAT或Two-WayNAT)時,可以從内部網絡向外部網絡發起會話請求,也可以從外部網絡向内部 網絡發起會話請求。當在外出或進入任何一個方向上建立連接配接時,把内部網絡位址靜态或動态綁定到全局惟一的位址上。這裡假設位于内部網絡和外部網絡之間的名 字空間(FQDN,Fully Qualified DomainNames)是端到端惟一的,因為隻有這樣才能夠使得位于外部編址域的主機利用域名系統(DNS)通路内部網絡的主機。在雙向NAT上必須部 署DNS-ALG(DNS應用層網關,DNS-Application LevelGateway),以處理名字到位址的映射。當一個DNS包需要穿越内部和外部編址域時,DNS-ALG必須能夠将DNS查詢和響應消息中的内 部位址翻譯成外部位址,或把外部位址翻譯成内部位址。
3.兩次NAT(Twice NAT)
兩次NAT是NAT的一個變種,它同時修改源和目的位址。這與前面的傳統NAT和雙向NAT(BiDirectional)都不同,前面的兩種NAT隻翻譯源或者目的位址(端口)。
兩次NAT在内部編址域和外部編址域存在沖突時非常有用。典型例子之一是當一個站點(不恰當地)使用已配置設定給其它機構的公開IP位址對其内部主機進行 編址時;例子之二是當一個站點從一家營運商換到另外一家營運商,同時希望(在内部)保留前一家營運商配置設定的位址時(而前一家營運商可能會在一段時間後将這 些位址重新配置設定給其它人使用)。在這些情況下,非常關鍵的一點就是外部網絡的主機可能會配置設定得到以前已配置設定給内部主機的同一位址。如果該位址碰巧出現在某 個包中,則應該将它轉發給内部主機,而不是通過NAT轉發給外部編址域。兩次NAT通過同時翻譯IP包的源和目的位址,試圖橋接這些編址域,解決了位址沖 突的問題。
4.多宿主NAT(Multihomed NAT)
使用NAT會帶來很多問題(RFC2993)。比如,NAT裝置要為經過它的會話維護狀态資訊,而一個會話的請求和響應必須通過同一NAT裝置做路 由,是以通常要求允許NAT末梢域邊界路由器必須是惟一的,所有的IP包要麼發起,要麼終結在該域。但這種配置将NAT裝置變成了可能的單點故障點。
為了讓一個内部網絡能夠在某個NAT鍊路故障的情況下,也可以保持與外部網絡的連通性,通常希望内部網絡到相同或不同的ISP具有多條連接配接(多宿主的),希望經過相同或不同的NAT裝置。
又如,多個NAT裝置或多條鍊路使用同一NAT,共享相同的NAT配置能夠為互相之間提供故障備份。在這種情況下,有必要讓備份NAT裝置交換狀态資訊,以便當主NAT出現故障時,備份NAT能夠擔負起透明地保持會話的能力。
三、傳統NAT的類型
目前,市場上使用最多的是傳統NAT裝置,尤其是NAPT裝置。傳統NAT(内部位址,端口)與(内部位址,端口)的映射方式主要有以下幾種典型類型(RFC3489)(見圖2):
圖2
傳統NAI的類型
1.克隆NAT(CloneNAT)
當在(私有IP,私有端口)與(公開IP.公開端口)已經建立了一個端口映射表後,克隆NAT将為随後從相同的私有位址和端口号發起的呼叫重複使用該映射,條件是隻要使用映射(有時業叫綁定)的會話至少有一個繼續保持激活狀态。
從圖3可以看出,客戶A分别從相同的内部位址和端口号(10.0.0.1:1234)同時發起兩個會話請求到伺服器1和伺服器2,因為這兩個請求來自 相同的内部位址和端口,是以克隆NAT将為這兩個不同的會話請求配置設定相同的公開端點号(100.100. 100.100:62000),以保證客戶A的“身份”能夠在經過翻譯後仍然保持一緻。NAT和防火牆不翻譯端口号,是以也是克隆方式的NAT。根據克隆 時受到的限制大小,又可以把克隆NAT分為以下三種:
圖3
克隆NAT
(1)全克隆(Full Cone)
首先,把所有來自相同内部IP位址和端口的請求映射到相同的外部1P位址和端口。其次,任何一個外部主機通過把一個TP包發送給已得到映射的外部IP位址的方式,都能夠把該包發送給該内部主機。
(2)限制性克隆(Restricted Cone)
把所有來自相同内部IP位址和端口号的請求映射到相同的外部IP位址和端口。與全克隆NAT方式不同,隻有當内部主機以前曾經給IP位址為x的外部主機發送過一個包時,IP位址為x的該外部主機才能夠把一個IP包發送給該内部主機。
(3)端口限制性克隆(Port Restricted Cone)
端口限制性克隆與限制性克隆類似,隻是限制中多了端口号。特别是,一個外部主機可以發送一個源IP位址和源端口号分别為(x,P)的IP包給外部主 機,隻有當内部主機以前曾經給IP位址為x,端口号為P的外部主機發送過一個包時,IP位址為X的該外部主機才能夠把一個源端口号為P的IP包發送給該内 部主機。
2.對稱NAT
對稱式NAT(symmetricNAT)是指把所有來自相同内部IP位址和端口号,到特定目的1P位址和端口号的請求映射到相同的外部TP位址和端 口。如果同一主機使用不同的源位址和端口對,發送的目的位址不同,則使用不同的映射。隻有收到了一個IP包的外部主機才能夠向該内部主機發送回一個UDP包。對稱式的NAT不保證所有會話中的(私有位址,私有端口)和(公開IP,公開端口)之間綁定的一緻性。相反,它為每個新的會話配置設定一個新的端口号。
從圖4可以看出,假如客戶A分别從相同的内部位址和端口号(10.0.0.1:1234)同時發起兩個會話請求到伺服器1和伺服器2,對稱NAT可能 會為這兩個來自相同地點的會話請求配置設定不相同的公開端點号,如把100 100. 100.100:62000配置設定給會話1,把100 100.100.100:62001配置設定給會話2。因為這兩個會話的有一個端點不同,是以雖然在翻譯的過程中客戶A的身份發生了變化,但NAT仍然能夠正 确工作。