1. 程式人生 > >網絡地址轉換NAT

網絡地址轉換NAT

地址 分片 減少 替換 mar tcp連接 設有 長時間 用戶

網絡地址轉換NAT

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

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

NAT本質上是一種允許在互聯網的不同地方重復使用相同的IP地址集的機制

看圖介紹


技術分享圖片

這是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的全局行為將由其轉換和過濾行為定義。

這些都可能是獨立於主機地址、以來於地址、或依賴於地址和端口號

行為名稱 轉換行為 過濾行為
獨立於端點的 對於所有的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‘事務數據報

網絡地址轉換NAT