淺析NAT的型別-ZT
淺析NAT的型別
何 寶 巨集[1]
摘 要 介紹了四種典型的NAT型別和兩種典型的傳統NAT型別。
關鍵詞 NAT NATP 型別
一、引 言
RFC1631以及相關RFC定義的網路地址翻譯器(NAT)。
IETF一直主張利用IPv6技術解決地址短缺問題,因此IETF雖然出版了幾個與NAT相關的RFC,但對NAT技術(尤其是穿越問題)一直沒有系統的標準化工作,如SIP和Mobile IP就是NAT出現後設計的一些協議,都未考慮到NAT的穿越問題
二、NAT的型別
圖1 NAT的型別 |
|
NAT |
|
傳統NAT |
|
雙向NAT |
|
兩次NAT |
|
多宿主NAT |
|
NAPT |
|
基本NAT |
1.傳統NAT(Traditional NAT)
在多數情況下,傳統NAT允許位於內部網路的主機(採用RFC1918地址)透明地主動的訪問外部網路中的主機,把從外部網路主動到內部網路的訪問作為一種特例,為事先選擇好的特定內部主機做靜態地址對映。外部網路中主機的IP地址在外部網路以及內部網路中是惟一的和有效的,但內部網路主機的IP地址只有在內部網路中才是惟一的,在外部網路中不一定有效。換言之,NAT不會向外部編址域通告內部網路的地址,但有可能向內部網路通告外部網路的地址。內部網路使用的地址一定不能與外部網路的地址重疊,任何一個地址是一個內部地址或外部地址,不能同時是內部和外部地址。
有關傳統NAT的詳細描述見RFC1631和RFC3022。傳統NAT包括基本NAT和NAPT兩大類。
(1)基本NAT
NAT擁有多個公開IP地址,當位於內部網路的主機向外部主機發起會話請求時,把內部地址翻譯成全球惟一的公開IP地址。對於從內部網路中外出的IP包,翻譯源IP地址以及相關的欄位,如IP/TCP/UDP/ICMP頭校驗和。對於進入內部網路的IP包,翻譯目的IP地址以及與上面所羅列的相關欄位。如果內部網路中主機的數目不大於NAT所擁有的公開IP地址的數目,則可以保證每個內部地址都可以對映到一個公開的IP地址,否則允許同時連線到外部網路的內部主機的數目會受到NAT公開IP地址數量的限制。可以使用靜態對映的方式,把特定內部主機對映為一個特定的全球惟一的地址,保證了外部對內部主機的訪問。一個內部主機可以利用相同的地址對映同時發起多個會話。
心得:就是隻翻譯地址,不翻譯埠,只是在IP層翻譯,不涉及到傳輸層。而且內部地址數量應該小於或者等於NAT地址數量。
(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-directional NAT,Two-Way NAT)
當使用雙向NAT(Bi-directional NAT或Two-Way NAT)時,可以從內部網路向外部網路發起會話請求,也可以從外部網路向內部網路發起會話請求。當在外出或進入任何一個方向上建立連線時,把內部網路地址靜態或動態繫結到全域性惟一的地址上。這裡假設位於內部網路和外部網路之間的名字空間(FQDN,Fully Qualified Domain Names)是端到端惟一的,因為只有這樣才能夠使得位於外部編址域的主機利用域名系統(DNS)訪問內部網路的主機。在雙向NAT上必須部署DNS-ALG(DNS應用層閘道器,DNS-Application Level Gateway),以處理名字到地址的對映。當一個DNS包需要穿越內部和外部編址域時,DNS-ALG必須能夠將DNS查詢和響應訊息中的內部地址翻譯成外部地址,或把外部地址翻譯成內部地址。
3.兩次NAT(Twice NAT)
兩次NAT是NAT的一個變種,它同時修改源和目的地址。這與前面的傳統NAT和雙向NAT(Bi Directional)都不同,前面的兩種NAT只翻譯源或者目的地址(埠)。
兩次NAT在內部編址域和外部編址域存在衝突時非常有用。典型例子之一是當一個站點(不恰當地)使用已分配給其它機構的公開IP地址對其內部主機進行編址時;例子之二是當一個站點從一家運營商換到另外一家運營商,同時希望(在內部)保留前一家運營商分配的地址時(而前一家運營商可能會在一段時間後將這些地址重新分配給其它人使用)。在這些情況下,非常關鍵的一點就是外部網路的主機可能會分配得到以前已分配給內部主機的同一地址。如果該地址碰巧出現在某個包中,則應該將它轉發給內部主機,而不是通過NAT轉發給外部編址域。兩次NAT通過同時翻譯IP包的源和目的地址,試圖橋接這些編址域,解決了地址衝突的問題。簡單說,就是內網的IP和外網的IP有可能相同,為了防止NAT伺服器把這些包轉發出去,而不是NAT.
4.多宿主NAT(Multihomed NAT)
使用NAT會帶來很多問題(RFC2993)。比如,NAT裝置要為經過它的會話維護狀態資訊,而一個會話的請求和響應必須通過同一NAT裝置做路由,因此通常要求允許NAT末梢域邊界路由器必須是惟一的,所有的IP包要麼發起,要麼終結在該域。但這種配置將NAT裝置變成了可能的單點故障點。
為了讓一個內部網路能夠在某個NAT鏈路故障的情況下,也可以保持與外部網路的連通性,通常希望內部網路到相同或不同的ISP具有多條連線(多宿主的),希望經過相同或不同的NAT裝置。
又如,多個NAT裝置或多條鏈路使用同一NAT,共享相同的NAT配置能夠為相互之間提供故障備份。在這種情況下,有必要讓備份NAT裝置交換狀態資訊,以便當主NAT出現故障時,備份NAT能夠擔負起透明地保持會話的能力。
三、傳統NAT的型別
圖2 傳統NAT的型別 |
|
傳統NAT |
|
限制性埠克隆 |
|
限制性克隆 |
|
全克隆 |
|
對稱 |
|
克隆NAT |
1.克隆NAT(Clone NAT)
當在(私有IP,私有埠)與(公開IP,公開埠)已經建立了一個埠對映表後,克隆NAT將為隨後從相同的私有地址和埠號發起的呼叫重複使用該對映,條件是隻要使用對映(有時業叫繫結)的會話至少有一個繼續保持啟用狀態。
圖3 克隆NAT |
|
會話1(A與伺服器1) 1.2.3.4:1234 100.100.100.100:62000 |
會話2(A與伺服器2) 4.5.6.7:4567 100.100.100.100:62000 |
會話1(A與S1) 1.2.3.4:1234 10.0.0.1:1234 |
會話2(A與S2) 4.5.6.7:4567 10.0.0.1:1234 |
|
伺服器1 1.2.3.4:1234 |
|
伺服器2 4.5.6.7:4567 |
克隆NAT 100.100.100.100 |
|
客戶A 10.0.0.1:1234 |
(1)全克隆(Full Clone)
首先,把所有來自相同內部IP地址和埠的請求對映到相同的外部IP地址和埠。其次,任何一個外部主機通過把一個IP包傳送給已得到對映的外部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
圖4 對稱NAT |
會話2(A與伺服器2) 4.5.6.7:4567 100.100.100.100:62001 |
|
|
會話1(A與伺服器1) 1.2.3.4:1234 100.100.100.100:62000 |
會話1(A與S1) 1.2.3.4:1234 10.0.0.1:1234 |
會話2(A與S2) 4.5.6.7:4567 10.0.0.1:1234 |
|
伺服器1 1.2.3.4:1234 |
|
伺服器2 4.5.6.7:4567 |
對稱NAT 100.100.100.100 |
客戶A 10.0.0.1:1234 |
從圖4可以看出,假如客戶A分別從相同的內部地址和埠號(10.0.0.1:1234)同時發起兩個會話請求到伺服器1和伺服器2,對稱NAT可能會為這兩個來自相同地點的會話請求分配不相同的公開端點號,如把100.100.100.100:62000分配給會話1,把100.100.100.100:62001分配給會話2。因為這兩個會話的有一個端點不同,所以雖然在翻譯的過程中客戶A的身份發生了變化,但NAT仍然能夠正確工作。
(收稿日期:2004-07-06)
相關文章
- Oracle基本資料型別儲存格式淺析[zt]Oracle資料型別
- 淺析number型別的值型別
- Oracle Xmltype型別淺析OracleXML型別
- Timestamp型別淺析型別
- Oracle Lob型別儲存淺析Oracle型別
- JavaScript的隱式型別轉換淺析JavaScript型別
- Oracle基本資料型別儲存格式淺析——RAW型別Oracle資料型別
- 淺析Kubernrtes服務型別(Service Types)型別
- Oracle基本資料型別儲存格式淺析(五)——RAW型別Oracle資料型別
- JAVA泛型淺析Java泛型
- Oracle基本資料型別儲存格式淺析(四)——ROWID型別Oracle資料型別
- Oracle基本資料型別儲存格式淺析(三)——日期型別(一)Oracle資料型別
- Oracle基本資料型別儲存格式淺析(三)——日期型別(二)Oracle資料型別
- Oracle基本資料型別儲存格式淺析(三)——日期型別(三)Oracle資料型別
- Oracle基本資料型別儲存格式淺析(三)——日期型別(四)Oracle資料型別
- JavaScript 隱性型別轉換步驟淺析JavaScript型別
- java多型性淺析Java多型
- 操作Blob型別的方法(zt)型別
- Oracle基本資料型別儲存格式淺析(二)——數字型別Oracle資料型別
- sql mode 型別(ZT)SQL型別
- [zt] 淺析資料庫的FOR XML的應用—RAW模式資料庫XML模式
- Java泛型應用淺析Java泛型
- 如何用iptables實現NAT(zt)
- 淺析MySQL InnoDB的隔離級別MySql
- SQL Server中datetimeset轉換datetime型別問題淺析SQLServer型別
- 淺析多媒體互動展廳幾個常見型別型別
- 淺析賦值、淺拷貝、深拷貝的區別賦值
- 淺談程式語言型別的強型別,弱型別,動態型別,靜態型別型別
- 淺析 Python 的類、繼承和多型Python繼承多型
- 淺析mybatis中${}和#{}取值區別MyBatis
- Shapeless 入門指南(二):自然數型別 Nat型別
- C#.NET 中的型別轉換 ztC#型別
- MySQL bit型別增加索引後查詢結果不正確案例淺析MySql型別索引
- 淺談JavaScript的型別轉換JavaScript型別
- zt_ora-600內部錯誤的型別型別
- 淺析SQL Server datetime資料型別設計與最佳化誤區SQLServer資料型別
- 淺析Oracle(rownum)和Mysql(limit)分頁的區別OracleMySqlMIT
- 淺析Java語言中兩種異常的差別Java