你瞭解你每天都在用的NAT嗎?

概述

NAT英文全稱是“Network Address Translation”,中文意思是“網絡地址轉換”,它是一個IETF(Internet Engineering Task Force, Internet工程任務組)標準,允許一個整體機構以一個公用IP(Internet Protocol)地址出現在Internet上。顧名思義,它是一種把內部私有網絡地址(IP地址)翻譯成合法網絡IP地址的技術。NAT 可以讓那些使用私有地址的內部網絡連接到Internet或其它IP網絡上,這個過程對用戶來說是透明的。NAT路由器在將內部網絡的數據包發送到公用網絡時,在IP包的報頭把私有地址轉換成合法的IP地址。因此我們可以認爲,NAT在一定程度上能夠有效的解決公網地址不足的問題。

相關概念

  • NAT中的四類網絡地址

內部本地地址(Inside Local):內網中設備所使用的IP地址。

內部全局地址(Inside Global):對於外部網絡來說,局域網內部主機所表現的 IP 地址。

外部本地地址(Outside Local):外部網絡主機的真實地址。

外部全局地址(Outside Global):對於內部網絡來說,外部網絡主機所表現的 IP 地址。外網設備所使用的真正的地址。
在這裏插入圖片描述local 、global 是相對於端口狀態說的,local 是 inside 部分可以被路由的,global 是 outside 部分可以被路由的。

  • 公有IP地址

公有IP地址也叫全局地址,是指合法的IP地址,它是由NIC(網絡信息中心)或者ISP(網絡服務提供商)分配的地址,對外代表一個或多個內部局部地址,是全球統一的可尋 址的地址。

  • 私有IP地址

私有IP地址也叫內部地址,屬於非註冊地址,專門爲組織機構內部使用。因特網分配編號委員會(IANA)保留了3塊IP地址做爲私有IP地址:

A類:10.0.0.0—10.255.255.255 10.0.0.0/8
B類:172.16.0.0—172.31.255.255 172.16.0.0/12
C類:192.168.0.0—192.168.255.255 192.168.0.0/16

這三塊私有地址本身是可路由的,只是公網上的路由器不會轉發這三塊私有地址的流量;當一個公司內部配置了這些私有地址後,內部的計算機在和外網通信時,公司的邊界路由會通過NAT或者PAT技術,將內部的私有地址轉換成外網IP,外部看到的源地址是公司邊界路由轉換過的公網IP地址,這在某種意義上也增加了內部網絡的安全性。

Basic NAT是一種把一組IP地址映射成另一組IP地址的方法,映射的過程在IP中繼設備上完成,對用戶完全透明。NAPT則要複雜一些,NAPT把許多(不能太多)IP地址連同TCP/UDP端口號映射到單獨一個IP地址和端口號上。無論是Basic NAT還是NAPT都提供一種把內部的私有地址轉換成在公網上可用的全球唯一IP地址的方法。

  • 地址池

地址池是有一些外部地址(全球唯一的IP地址)組合而成,我們稱這樣的一個地址集合爲地址池。在內部網絡的數據包通過地址轉換到達外部網絡時,將會在地址池中選擇某個IP地址作爲數據包的源IP地址,這樣可以有效的利用用戶的外部地址,提高訪問外部網絡的能力。

分類

在這裏插入圖片描述

NAT有三種類型:靜態NAT(Static NAT)、動態地址NAT(Pooled NAT)、網絡地址端口轉換NAPT(Network Address Port Translation)(Port-Level NAT)。

靜態NAT( Static NAT )

通過手動設置,使 Internet 客戶進行的通信能夠映射到某個特定的私有網絡地址和端口。如果想讓連接在 Internet 上的計算機能夠使用某個私有網絡上的服務器以及應用程序,那麼靜態映射是必需的。

靜態 NAT ( Static NAT )( 一對一 )。將內部網絡的私有IP地址轉換爲公有IP地址,IP地址對是一對一的,是一直不變的,靜態映射不會從 NAT 轉換表中刪除。

在這裏插入圖片描述

動態地址 NAT ( Pooled NAT )

動態地址 NAT將內部網絡的私有 IP 地址轉換爲公用 IP 地址時,IP 地址是不確定,隨機的。所有被授權訪問 Internet 的私有 IP 地址可隨機轉換爲任何指定合法的 IP 地址。也就是說,只要指定哪些內部地址可以進行轉換,以及用哪些合法地址作爲外部地址時,就可以進行動態 NAT 轉換。動態 NAT 是在路由器上配置一個外網 IP 地址池,當內部有計算機需要和外部通信時,就從地址池裏動態的取出一個外網 IP,並將他們的對應關係綁定到 NAT 表中,通信結束後,這個外網 IP 才被釋放,可供其他內部 IP 地址轉換使用,這個 DHCP 租約 IP 有相似之處。當 ISP 提供的合法 IP 地址略少於網絡內部的計算機數量時。可以採用動態轉換的方式

動態NAT方式中,內網主機IP與全局IP地址是多對一的關係。當數據包進出內網時,具有NAT功能的設備對IP數據包的處理與靜態NAT的一樣,只是NAT table表中的記錄是動態的,若內網主機在一定時間內沒有和外部網絡通信,有關它的IP地址映射關係將會被刪除,並且會把該全局IP地址分配給新的IP數據包使用,形成新的NAT table映射記錄。

在這裏插入圖片描述

網絡地址端口轉換 NAPT(Network Address Port Translation)(Port-Level NAT)

網絡地址端口轉換NAPT(Network Address Port Translation)則是把內部地址映射到外部網絡的一個IP地址的不同端口上。它可以將中小型的網絡隱藏在一個合法的IP地址後面。NAPT與 動態地址NAT不同,它將內部連接映射到外部網絡中的一個單獨的IP地址上,同時在該地址上加上一個由NAT設備選定的端口號。

NAPT是使用最普遍的一種轉換方式,它又包含兩種轉換方式:SNAT和DNAT。

SNAT和DNAT是針對內部網絡而言的,可以理解爲數據包以內網IP作爲源的時候進行的源地址轉換叫SNAT,數據包以內網IP作爲目的的時候進行的目的地址轉換叫DNAT。

源NAT(Source NAT,SNAT)

SNAT是修改數據包的源地址。源NAT改變第一個數據包的來源地址,它永遠會在數據包發送到網絡之前完成,數據包僞裝就是一具SNAT的例子。

SNAT舉例

對於內網的主機數量比較多,但是該組織只有一個合法的IP地址,如當內網主機(10.1.1.3)往外發送數據包時,則需要修改數據包的IP地址和TCP/UDP端口號,例如將

在這裏插入圖片描述

這樣,通過修改IP地址和端口的方法就可以使內網中所有的主機都能訪問外網,此類NAT適用於組織或機構內只有一個合法的IP地址的情況,也是動態NAT的一種特例。客戶端172.18.250.6和百度服務器202.108.22.5通信,172.18.250.6發送數據時,先轉換爲219.155.6.240:1723(任意>1024的隨機端口),然後再利用這個身份發送數據給百度服務器,然後百度服務器迴應數據併發送給219.155.6.240:1723,NAT網關檢查自己的關聯表,意識到這是自己地私網中172.18.250.6的數據包,然後把這個數據發送給客戶端

也就是說,我們利用端口號的唯一性實現了公網ip轉換爲私網ip的這一步。PAT(NAT重載)能夠使用傳輸層端口號來標識主機,因此,從理論上說,最多可讓大約65000臺主機共用一個公有IP地址

目的NAT(Destination NAT,DNAT)

DNAT是修改數據包的目的地址。Destination NAT剛好與SNAT相反,它是改變第一個數據包的目的地地址,如平衡負載、端口轉發和透明代理就是屬於DNAT。

DNAT舉例

在這裏插入圖片描述
這種方式適用於內網的某些服務器需要爲外網提供某些服務的情況。例如以上拓撲結構,內網服務器羣(ip地址分別爲:10.1.1.1,10.1.1.2,10.1.1.3等)需要爲外網提供WEB 服務,當外網主機HostB訪問內網時,所發送的數據包的目的IP地址爲10.1.1.127,端口號爲:80,當該數據包到達內網連接的路由器時,路由器查找NAT table,路由器通過修改目的IP地址和端口號,將外網的數據包平均發送到不同的主機上(10.1.1.1,10.1.1.2,10.1.1.3等),這樣就實現了負載均衡。

NAT工作原理

NAT設備維護一個狀態表,用來把非法的IP地址映射到合法的IP地址上去。每個包在NAT設備中都被翻譯成正確的IP地址,發往下一級,這意味着給處理器帶來了一定的負擔。但對於一般的網絡來說,這種負擔是微不足道的。在運行NAT的路由器中,當數據包被傳送時,NAT可以轉換數據包的IP地址和TCP/UDP數據包的端口號。設置NAT功能的路由器至少要有一個Inside(內部)端口和一個Outside(外部)端口。內部端口連接內網的用戶,外部端口一般連接到Internet。當IP數據包離開內部網絡時,NAT負責將內網IP源地址(通常是專用地址)轉換爲合法的公共IP地址。當IP數據包進入內網時,NAT將合法的公共IP目的地址轉換爲內網的IP源地址。

NAT的基本工作原理是:當私有網主機和公共網主機通信的IP包經過NAT網關時,將IP包中的源IP或目的IP在私有IP和NAT的公共IP之間進行轉換。

其實主要就是 修改 IP 數據包中的源 IP 地址,或目的 IP 地址。主要目的是把 RFC1918所提議的私有地址轉變成在 Internet 上可路由的公有合法地址。對於某些有限的應用(如 DNS、 FTP 等),它也可以修改 IP 數據包有效載荷中的地址。由於應用的複雜性, NAT 目前支持的應用有限,當然,如果需要,完全可以針對新的應用做相應的開發工作。

NAT地址轉換過程

在NAT路由器接收到來自內部網絡主機發送的數據包時(發),其源IP地址(SA)爲“內部本地地址”,目的IP地址(DA)爲“外部本地地址”。當數據包被轉發到外部網絡時,數據包的源IP地址(SA)就會轉變爲“內部全局地址”,而目的IP地址(DA)被轉變爲“外部全局地址”。也就是把數據包的所有源IP地址(SA)和目的IP地址(DA)全部由本地地址轉換爲全局地址。如圖6-9上部分數據包IP地址轉換示意圖。

在NAT路由器接收到來自外部網絡主機發送的數據包時(收),其源IP地址(SA)就是“外部全局地址”,目的IP地址(DA)就是“內部全局地址”。相當於由內部網絡向外部網絡發送數據包時數據包中的源IP地址(SA)和目的IP地址(DA)的互換。而當數據包被路由器轉發到本地網絡時,源IP地址(SA)被轉變爲“外部本地地址”,目的IP地址(DA)被轉變爲“內部本地地址”,也相當於由內部網絡向外部網絡發送數據包時數據包中的源IP地址(SA)和目的IP地址(DA)的互換。

在這裏插入圖片描述

NAT基本IP地址轉換原理

以上是從總體上介紹NAT的IP地址轉換原理的,實際NAT應用有時並不需要對源IP地址和IP地址進行全面替換,僅需要對源IP地址或者僅需要對目的IP地址進行轉換即可達到所需的目的。下面予以介紹。

內部地址NAT即將數據包內網IP部分的地址進行轉換,外部地址NAT就是將數據包外網IP部分的地址進行轉換(不論它是源還是目的地址)。

內部地址NAT轉換實例

多數情況下使用NAT的目的就是爲了使內部網絡中的多個用戶能使用一個註冊IP地址訪問外部網絡,所以僅需要配置內部地址NAT轉換。

這是一個簡單的NAT轉換示例。要實現以下目的:當NAT路由器的內部網絡s0接口上接收到一個源地址爲內部本地地址10.10.10.1,目的IP地址爲外部本地地址171.16.68.1的數據包時,在轉發到s1接口時,原來數據包源地址的內部本地地址10.10.10.1被轉換成內部全局地址171.16.68.5,但目的地址不變,然後繼續發送。在這個過程中,所進行的只是數據包中源IP地址的轉換,由內部本地地址向內部全局地址轉換,且只是內部地址之間的轉換。

相反,當在NAT路由器的外部網絡接口s1上接收源地址爲172.16.68.1外部本地地址,目的地址爲內部全局地址172.16.68.5的外部服務器響應數據包時,目的地址將被轉換成10.10.10.1這個內部本地地址,然後繼續發送。在這個過程中,所進行的只是數據包中目的IP地址的轉換,由內部全局地址向內部本地地址轉換,也只是內部地址之間的轉換。
在這裏插入圖片描述

外部地址NAT轉換實例

當公司服務器位於內部網絡,使用內部網絡私有IP地址,爲了方便外部網絡用戶對內部網絡服務器進行訪問,則需要“外部全局地址”與“外部本地地址”之間的轉換。

下面同樣以上面那個簡單的NAT轉換示例進行介紹。本示例要實現的目的是:當NAT路由器外部網絡接口s1接收到來自外部網絡用戶發送的源IP地址爲外部全局地址171.16.68.1,目的地址爲內部本地地址10.10.10.1的數據包在被路由器轉發到s0接口時,數據包中的源IP地址轉變爲外部本地地址10.10.10.5(即由外部全局地址轉換成外部本地地址),目的IP地址不變,即也只是源IP地址的轉換;而由內部網絡用戶發送的響應數據包中,卻只是目的IP地址(即由外部本地地址轉換爲外部全局地址)的轉換,源IP地址不變。

在這裏插入圖片描述

NAT的應用

NAT主要可以實現以下幾個功能:數據包僞裝、平衡負載、端口轉發和透明代理。

  • 數據僞裝:可以將內網數據包中的地址信息更改成統一的對外地址信息,不讓內網主機直接暴露在因特網上,保證內網主機的安全。同時,該功能也常用來實現共享上網。例如,內網主機訪問外網時,爲了隱藏內網拓撲結構,使用全局地址替換私有地址。

  • 端口轉發:當內網主機對外提供服務時,由於使用的是內部私有IP地址,外網無法直接訪問。因此,需要在網關上進行端口轉發,將特定服務的數據包轉發給內網主機。

  • 負載平衡:目的地址轉換NAT可以重定向一些服務器的連接到其他隨機選定的服務器。

  • 失效終結:目的地址轉換NAT可以用來提供高可靠性的服務。如果一個系統有一臺通過路由器訪問的關鍵服務器,一旦路由器檢測到該服務器down機,它可以使用目的地址轉換NAT透明的把連接轉移到一個備份服務器上,提高系統的可靠性。

  • 透明代理:NAT可以把連接到因特網的HTTP連接重定向到一個指定的HTTP代理服務器以緩存數據和過濾請求。一些因特網服務提供商就使用這種技術來減少帶寬的使用而不用讓他們的客戶配置他們的瀏覽器支持代理連接。

NAT技術的優缺點

優點

  • 節省合法的公有ip地址

  • 地址重疊時,提供解決辦法

  • 網絡發生變化時,避免重新編址(這個問題具有親身體會,原本所在的實習單位搬遷,我們搬到了新的住處,網絡環境發生了一些變化,但是由於nat技術的特點,我們局域網的地址並沒有發生改變,我們依然使用着最初的編址方案)

NAT對我們來說最大的貢獻就是幫助我們節省了大量的ip資源。

IP的端到端通信

IP協議的一個重要貢獻是把世界變得平等。在理論上,具有IP地址的每個站點在協議層面有相當的獲取服務和提供服務的能力,不同的IP地址之間沒有差異。人們熟知的服務器和客戶機實際是在應用協議層上的角色區分,而在網絡層和傳輸層沒有差異。一個具有IP地址的主機既可以是客戶機,也可以是服務器,大部分情況下,既是客戶機,也是服務器。端到端對等看起來是很平常的事情,而意義並不尋常。但在以往的技術中,很多協議體系下的網絡限定了終端的能力。正是IP的這個開放性,使得TCP/IP協議族可以提供豐富的功能,爲應用實現提供了廣闊平臺。因爲所有的IP主機都可以服務器的形式出現,所以通訊設計可以更加靈活。使用UNIX/LINUX的系統充分利用了這個特性,使得任何一個主機都可以建立自己的HTTP、SMTP、POP3、DNS、DHCP等服務。與此同時,很多應用也是把客戶端和服務器的角色組合起來完成功能。例如在VoIP應用中,用戶端向註冊服務器登錄自己的IP地址和端口信息過程中,主機是客戶端;而在呼叫到達時,呼叫處理服務器向用戶端發送呼叫請求時,用戶端實際工作在服務器模式下。在語音媒體流信道建立過程後,通訊雙向發送語音數據,發送端是客戶模式,接收端是服務器模式。而在P2P的應用中,一個用戶的主機既爲下載的客戶,同時也向其他客戶提供數據,是一種C/S混合的模型。上層應用之所以能這樣設計,是因爲IP協議棧定義了這樣的能力。試想一下,如果IP提供的能力不對等,那麼每個通信會話都只能是單方向發起的,這會極大限制通信的能力。細心的讀者會發現,前面介紹NAT的一個特性正是這樣一種限制。沒錯,NAT最大的弊端正在於此——破壞了IP端到端通信的能力

NAT的弊端

  • 首先,NAT使IP會話的保持時效變短。因爲一個會話建立後會在NAT設備上建立一個關聯表,在會話靜默的這段時間,NAT網關會進行老化操作。這是任何一個NAT網關必須做的事情,因爲IP和端口資源有限,通信的需求無限,所以必須在會話結束後回收資源。通常TCP會話通過協商的方式主動關閉連接,NAT網關可以跟蹤這些報文,但總是存在例外的情況,要依賴自己的定時器去回收資源。而基於UDP的通信協議很難確定何時通信結束,所以NAT網關主要依賴超時機制回收外部端口。通過定時器老化回收會帶來一個問題,如果應用需要維持連接的時間大於NAT網關的設置,通信就會意外中斷。因爲網關回收相關轉換表資源以後,新的數據到達時就找不到相關的轉換信息,必須建立新的連接。當這個新數據是由公網側向私網側發送時,就會發生無法觸發新連接建立,也不能通知到私網側的主機去重建連接的情況。這時候通信就會中斷,不能自動恢復。即使新數據是從私網側發向公網側,因爲重建的會話表往往使用不同於之前的公網IP和端口地址,公網側主機也無法對應到之前的通信上,導致用戶可感知的連接中斷。NAT網關要把回收空閒連接的時間設置到不發生持續的資源流失,又維持大部分連接不被意外中斷,是一件比較有難度的事情。在NAT已經普及化的時代,很多應用協議的設計者已經考慮到了這種情況,所以一般會設置一個連接保活的機制,即在一段時間沒有數據需要發送時,主動發送一個NAT能感知到而又沒有實際數據的保活消息,這麼做的主要目的就是重置NAT的會話定時器。

  • 其次,NAT在實現上將多個內部主機發出的連接複用到一個IP上,這就使依賴IP進行主機跟蹤的機制都失效了。如網絡管理中需要的基於網絡流量分析的應用無法跟蹤到終端用戶與流量的具體行爲的關係。基於用戶行爲的日誌分析也變得困難,因爲一個IP被很多用戶共享,如果存在惡意的用戶行爲,很難定位到發起連接的那個主機。即便有一些機制提供了在NAT網關上進行連接跟蹤的方法,但是把這種變換關係接續起來也困難重重。基於IP的用戶授權不再可靠,因爲擁有一個IP的不等於一個用戶或主機。一個服務器也不能簡單把同一IP的訪問視作同一主機發起的,不能進行關聯。有些服務器設置有連接限制,同一時刻只接納來自一個IP的有限訪問(有時是僅一個訪問),這會造成不同用戶之間的服務搶佔和排隊。有時服務器端這樣做是出於DOS攻擊防護的考慮,因爲一個用戶正常情況下不應該建立大量的連接請求,過度使用服務資源被理解爲攻擊行爲。但是這在NAT存在時不能簡單按照連接數判斷。

總之,缺點大概如下:

  • 破壞了端對端通信的平等性
  • 應用需要維持連接的時間大於NAT網關的設置,通信就會意外中斷
  • 無法進行端到端的ip跟蹤
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章