天天看點

【計算機網絡】網絡位址轉換NAT

網絡位址轉換NAT

要知道到每個IP使能的裝置都需要一個IP位址。以一個家庭為例,假設當地的ISP已為該家庭配置設定過一塊位址,但是後期家庭中的智能裝置增加(智能手機、電腦等),這些都需要IP位址才可上網,此時應該怎麼辦?

此時就需要一種管理IP位址的方法, 網路位址轉換(Network Address Translation)就是一種簡單的方法。

NAT本質上是一種

允許在網際網路的不同地方重複使用相同的IP位址集的機制

看圖介紹

【計算機網絡】網絡位址轉換NAT

這是NAT使能的路由器的運作圖。在NAT後(圖中右邊)的主機使如家庭、公司的專用網絡或者具有專用位址的地域(realm)中的位址,通過NAT路由器與外界互動(NAT的工作原理就是重寫通過路由器的資料報的識别資訊)。

具有專用位址的地域:指其位址僅對該網絡中的裝置有意義的網絡。

在圖中右側有四個接口具有相同的網絡位址10.0.0.0/24。假設有數十萬個家庭網絡都使用這樣的位址空間,并與外界進行互動(接入全球網際網路),顯然,這個位址空間中的任何位址都不可以作為封包的源位址或者目的位址。也就是說,10.0.0.0/24位址空間在給定的網絡中才有效,與外界互動需要進行位址轉換。

從圖中可以看出,所有流出NAT路由器的封包都擁有相同的源的位址138.76.29.7,流入路由器的封包都擁有相同的目的位址138.76.29.7。從此可以看出,NAT路由器對外界隐藏了該網絡中的細節。所有從廣域網到達NAT路由器的資料報都擁有相同的IP位址,現在問題是,路由器怎樣将到達的資料報轉發給内部主機?那便通過上圖所示的

NAT轉換表(NAT Translation table)

,在表中包含端口号及IP位址。

初始位址來源:該路由器和該網絡中的所有主機都是通過DHCP(可見上一篇文章)獲得位址的。NAT路由器從ISP的DHCP伺服器得到它的位址,并且運作一個DHCP伺服器,為位于它控制的計算機提供位址。

舉個例子

介紹NAT路由器的工作流程。

如上圖所示。假設以為家庭使用者使用主機10.0.0.1請求IP位址為128.119.40.186的某Web伺服器(端口為80)上面的一個Web頁面。

  • 主機10.0.0.1使用了端口号3345(系統指派)并将資料報發送至LAN端。資料報的源位址為主機位址,目的位址為所通路的Web伺服器位址。
  • 路由器接收到該資料報,為該資料報生成一個新的端口号5001(未在NAT轉換表中的端口号)。将源IP替代為廣域網一側接口的IP位址138.76.29.7,且将資料報中源端口替換為5001。路由器在NAT轉換表中增加一項。
  • 伺服器收到該請求後進行響應傳回響應封包,目的位址為NAT理由器位址,目的端口号為5001。
  • NAT路由器收到響應封包後,依據封包中的目的IP和目的端口号在轉換表中檢索合适的目的IP位址(10.0.0.1)和目的端口号(3345)。并修改資料報中的目的位址個目的端口,向家庭網絡中轉發該資料報。

關于NAT的一些問題

雖然NAT在近幾年得到了廣泛地應用,卻也存在了一些問題,①“違規”使用端口号,一般端口号是用于程序編址②路由器應為三層交換機不能但是NAT路由器卻處理了運輸層的内容③違反了“端到端”的原則等。但是,存在即合理,現在NAT已成為網際網路的一個重要元件了。

NAT還有一個重要的問題便是它妨礙了P2P應用程式,包括P2P檔案共享應用和P2PIP語音。

在P2P應用程式中,任何參與對等方A應當能夠對任何其他參與的對等方B發起一條TCP連接配接。是以該問題實質在于,如果對等方B在一個NAT後面,那麼它将不能充當伺服器并接受TCP連接配接。(A單獨無法得知B的位址)

現在假設對等方A不在NAT後面,對等方B在NAT後面,對等方C不在NAT後面。C與B已經建立了一條TCP連接配接,如果A想與B建立連接配接,則需要通過C請求對等方B,發起直接傳回對等方A的一條TCP連接配接。一旦二者建立一條直接的P2P TCP連接配接,兩個對等方就可以交換封包或檔案了。

這種雇傭關系被稱為連接配接反轉(connection reversal),已被許多P2P應用程式用于NAT穿越(NAT traversal)。

若A,B二者都在NAT後面則可使用應用程式進行中繼處理。

UPnP

NAT穿越正越來越多地由通用即插即用(UPnP)提供,UPnP是一種允許主機發現并配置鄰近NAT的協定。UPnP要求主機和路由器都是UPnP相容的。

使用UPnP,在主機上運作的應用程式可以為某些請求 向NAT路由器請求一個公共端口号 生成一個一個NAT映射。

如果NAT接收該請求并生成映射,則外部的結點可發起((公共IP位址,公共端口号))的TCP連接配接。這事先UPnP需要讓應用程式知道(公共IP位址,公共端口号),然後該應用程式便可向外部通告它。

總之,UPnP允許外部主機使用TCP或者UDP向NAT化的主機發起通信會話。

上面算是對NAT有了一個基本的了解。下面再對NAT進行一些補充。

傳統的NAT:基本NAT和NAPT

根據NAT思想行為的不同實作,出現了不同類型的NAT。

傳統NAT(traditional NAT)包括基本的NAT(basic NAT)和網絡位址端口轉換(Network Address Port Translation,NAPT)。除非進行差別,我們所說的NAT通常包括以上二者。

基本的NAT:隻執行IP位址的重寫。本質上就是将私有位址(專用網絡中的位址)改寫為一個取自于ISP提供的位址池或公有位址範圍的公共位址。這是一種IP位址一對一的轉換,并沒有減少IP位址的使用。改了了IP位址,但是保留端口号不變。

NAPT使用傳輸層辨別符(TCP/UDP端口,ICMP查詢辨別)來确定一個特定的資料報到底和NAT内部的哪台主機關聯。這樣,要使用的公有位址就會很少,通常隻需要一個。

雖然在NAT後的私有主機使用的IP位址不受什麼限制,也可以采用全局位址空間。但是當這樣的全局位址空間也被網際網路上的另外一個實體所使用時,在私有位址範圍内的本地系統極有可能通路不到使用相同位址的公共系統,因為采用相同位址的本地系統會屏蔽掉使用相同位址的遠端系統。

為避免此種不良情況,保留了3個IPv4位址範圍作為私有位址範圍使用[RFC 1918]:10.0.0.0/8,172.16.0.0/12,192.168.0.0/16。

下面NAT所支援的幾種主要傳輸協定。

NAT和TCP

從建立TCP連接配接(“三次握手”)開始介紹。設私有主機10.0.0.126(端口号為9200)向伺服器212.110.167.157發起TCP連接配接。

NAT路由器接收到該資料報後,會注意到這是一個新的連接配接,如果政策允許,那麼資料報中的源位址會被修改為NAT路由器的外部接口IP位址63.204.134.177,源端口号不會改變(端口保留)。NAT轉發資料報時,尋址就變為(63.204.134.177:9200;212.110.167.157:80)。

此時,NAT還将在内部狀态記住目前正在處理一個新連接配接(NAT會話),也就是NAT映射(NAT mapping)。

伺服器将響應封包發送至(63.204.134.177:9200)

NAT路由器依據資料報中的目的端口号在映射表中查找合适的内部主機,然後将資料報的目的位址改為(10.0.0.126:9200)對其進行轉發。

然後用戶端收到對請求的響應,這樣在多數情況下表示已經連接配接到伺服器。

上述例子說明在正常情況下是如何建立一個基本NAT會話,但是并未說明會話是如何被清除的。

正常情況下,會話會在交換FIN資料報之後被删除,但是若不是正常關閉連接配接,那麼會導緻NAT映射仍然被保留在記憶體中。是以,當流量很少時,NAT必須清除這些被認為已經“死亡”的映射條目。

TCP連接配接的簡化版本

大多數的NAT都包括一個TCP連接配接的簡化版本,并可以區分連接配接成功還是失敗。

特别地,NAT在檢測到一個傳出的SYN資料報後會激活

連接配接計時器(connection timer)

,如果回複的ACK封包在計時器到期之前還未到達,則該會話狀态會清除。

如果ACK封包到達,計時器将會被清除,并建立一個超長時間的

會話計時器(session timer)

(用小時替代分鐘)。

這時,NAT可能會向内部的端點發送一個額外的資料報,用于确認該會話是否已經終止(稱為探測(probing))。如果收到ACK,NAT認識到該連接配接仍然是活躍的,則會重置計時器,不會删除會話。

如果沒有接收到響應(在關閉計時器(close timer)逾時之後)或者收到一個RST資料報,表明該連接配接已經終止,狀态将被清除。

NAT和UDP

NAT處理UDP資料報時出現的問題與處理TCP時的大多數一樣,但是UDP有些不同,UDP沒有連接配接建立和清除的過程。詳細點說,UDP沒有辨別位,如SYN,FIN和RST這些位來表示一個會話的建立或銷毀。此外,一個關聯中的參與者也未必完全清楚。UDP采用基于兩個端點的位址/端口号的組合辨別一條連接配接。

NAT在處理UDP資料報時,如果一個綁定在“近期”沒有被使用,UDP NAT會采用一個映射計時器(mapping timer)來清除NAT的狀态。“近期”[RFC 4787]要求計時器至少為2分鐘,推薦5分鐘。

計時器何時被重新整理?

當資料報從内部傳輸到外部時NAT就重新整理(NAT對外重新整理行為),反之亦然(資料報從外到内,重新整理對内部的計時器)。對内重新整理行為是可選的。

當出現IP分片時,除了第一個分片包含端口号資訊,其餘分片都沒有,這就會影響NAT的正常操作。是以,NAT/NAPT不能正确處理分片。

NAT和ICMP

ICMP提供了關于IP資料報的狀态資訊,也可以用于測量和收集網絡狀态資訊。

ICMP有兩種類型的封包:資訊類和出錯類。

出錯類封包通常包含一個引起錯誤條件的IP資料報(全部或者部分)的副本。它們從錯誤被檢測到的端點,發送到資料報的原始發送方。ICMP差錯封包經過NAT時,需要改寫“錯誤資料報”的IP位址,以便被内部主機識别(稱為ICMP修複行動(ICMP fix-up))。

對資訊類封包處理情況和出錯類的差不多,資訊類大多數是查詢/響應或客戶/伺服器性質的,還包括一個類似于TCP/UDP端口号的查詢ID(Query ID)字段。是以,處理這些類型的NAT要能夠識别這些向外傳輸的資訊請求,并設定計時器等待響應。

位址和端口轉換行為

NAT的操作方式差别很大,大部分細節設計具體的位址和端口的映射。

以《TCP/IP詳解(卷1)》中的圖為例介紹。

假設内部主機,先連接配接到Y1:y1,然後連接配接到Y2:y2,則NAT伺服器先建立映射X1':x1',然後建立X2':x2'。在大多數情況下,X1'=X2',因為大多數伺服器隻使用一個全局路由的IP位址。如果x1'=x2',則映射被認為是重複使用的。如果x1'=x2'=x,那麼就是前面所說的端口保留。在一些情況下,端口保留不能存在,因為會存在沖突問題。

      

【計算機網絡】網絡位址轉換NAT

NAT的全局行為将由其轉換和過濾行為定義。

這些都可能是獨立于主機位址、以來于位址、或依賴于位址和端口号

行為名稱 轉換行為 過濾行為
獨立于端點的 對于所有的Y2:y2,X1':x1'=X2':x2'(必需的) 隻要X1':x1'存在,就允許X1':x1'的任何資料報
依賴于位址的 X1':x1'=X2':x2'當且僅當Y1=Y2 隻要X1'之前聯系過Y1,就允許從Y1:y1到X1':x1'事務資料報
依賴于位址和端口的 X1':x1'=X2':x2'當且僅當Y1:y1=Y2:y2 隻要X1'之前聯系過Y1:y1,就允許從Y1:y1到X1':x1'事務資料報

每天進步一點點,不要停止前進的腳步~

繼續閱讀