轉載 https://blog.csdn.net/gui951753/article/details/795933070
IPv4即網際網協議第4版——Internet Protocol Version 4的縮寫。IPv4定義一個跨越異種網絡互連的超級網,它為每個網際網的節點分配全球唯一IP地址。如果我們把Internet比作一個郵政系統,那么IP地址的作用就等同於包含城市、街區、門牌編號在內的完整地址。IPv4使用32bits整數表達一個地址,地址最大范圍就是232 約為43億。以IP創始時期可被聯網的設備來看,這樣的一個空間已經很大,很難被短時間用完。然而,事實遠遠超出人們的設想,計算機網絡在此后的幾十年里迅速壯大,網絡終端數量呈爆炸性增長。
更為糟糕的是,為了路由和管理方便,43億的地址空間被按照不同前綴長度划分為A,B,C,D類地址網絡和保留地址。其中,A類網絡地址127段,每段包括主機地址約1678萬個。B類網絡地址16384段,每段包括65536個主機地址。
ANA向超大型企業/組織分配A類網絡地址,一次一段。向中型企業或教育機構分配B類網絡地址,一次一段。這樣一種分配策略使得IP地址浪費很嚴重,很多被分配出去的地址沒有真實被利用,地址消耗很快。以至於二十世紀90年代初,網絡專家們意識到,這樣大手大腳下去,IPv4地址很快就要耗光了。於是,人們開始考慮IPv4的替代方案,同時采取一系列的措施來減緩IPv4地址的消耗。正是在這樣一個背景之下,本期的主角閃亮登場,它就是網絡地址轉換——NAT。
NAT是一項神奇的技術,說它神奇在於它的出現幾乎使IPv4起死回生。在IPv4已經被認為行將結束歷史使命之后近20年時間里,人們幾乎忘了IPv4的地址空間即將耗盡這樣一個事實——在新技術日新月異的時代,20年可算一段漫長的歷史。更不用說,在NAT產生以后,網絡終端的數量呈加速上升趨勢,對IP地址的需求劇烈增加。此足見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名字很准確,網絡地址轉換,就是替換IP報文頭部的地址信息。NAT通常部署在一個組織的網絡出口位置,通過將內部網絡IP地址替換為出口的IP地址提供公網可達性和上層協議的連接能力。那么,什么是內部網絡IP地址?
RFC1918規定了三個保留地址段落:10.0.0.0-10.255.255.255;172.16.0.0-172.31.255.255;192.168.0.0-192.168.255.255。這三個范圍分別處於A,B,C類的地址段,不向特定的用戶分配,被IANA作為私有地址保留。這些地址可以在任何組織或企業內部使用,和其他Internet地址的區別就是,僅能在內部使用,不能作為全球路由地址。這就是說,出了組織的管理范圍這些地址就不再有意義,無論是作為源地址,還是目的地址。對於一個封閉的組織,如果其網絡不連接到Internet,就可以使用這些地址而不用向IANA提出申請,而在內部的路由管理和報文傳遞方式與其他網絡沒有差異。
對於有Internet訪問需求而內部又使用私有地址的網絡,就要在組織的出口位置部署NAT網關,在報文離開私網進入Internet時,將源IP替換為公網地址,通常是出口設備的接口地址。一個對外的訪問請求在到達目標以后,表現為由本組織出口設備發起,因此被請求的服務端可將響應由Internet發回出口網關。出口網關再將目的地址替換為私網的源主機地址,發回內部。這樣一次由私網主機向公網服務端的請求和響應就在通信兩端均無感知的情況下完成了。依據這種模型,數量龐大的內網主機就不再需要公有IP地址了。
NAT的轉換示意圖如下所示

我們一般使用私網ip作為局域網內部的主機標識,使用公網ip作為互聯網上通信的標識
在整個NAT的轉換中,最關鍵的流程有以下幾點
- 網絡被分為私網和公網兩個部分,NAT網關設置在私網到公網的路由出口位置,雙向流量必須都要經過NAT網關
- 網絡訪問只能先由私網側發起,公網無法主動訪問私網主機;
- NAT網關在兩個訪問方向上完成兩次地址的轉換或翻譯,出方向做源信息替換,入方向做目的信息替換;
- NAT網關的存在對通信雙方是保持透明的;
- NAT網關為了實現雙向翻譯的功能,需要維護一張關聯表,把會話的信息保存下來。
靜態NAT
如果一個內部主機唯一占用一個公網IP,這種方式被稱為一對一模型。此種方式下,轉換上層協議就是不必要的,因為一個公網IP就能唯一對應一個內部主機。顯然,這種方式對節約公網IP沒有太大意義,主要是為了實現一些特殊的組網需求。比如用戶希望隱藏內部主機的真實IP,或者實現兩個IP地址重疊網絡的通信。
動態NAT
它能夠將未注冊的IP地址映射到注冊IP地址池中的一個地址。不像使用靜態NAT那樣,你無需靜態地配置路由器,使其將每個內部地址映射到一個外部地址,但必須有足夠的公有因特網IP地址,讓連接到因特網的主機都能夠同時發送和接收分組

NAT重載
這是最常用的NAT類型。NAT重載也是動態NAT,它利用源端口將多個私網ip地址映射到一個公網ip地址,它也被稱為網絡地址端口轉換NAPT(Network Address Port Translation)(Port-Level NAT)(多對一)。
通過使用PAT(NAT重載),只需使用一個公網ip地址,就可將數千名用戶連接到因特網。其核心之處就在於利用端口號實現公網和私網的轉換。
面對私網內部數量龐大的主機,如果NAT只進行IP地址的簡單替換,就會產生一個問題:當有多個內部主機去訪問同一個服務器時,從返回的信息不足以區分響應應該轉發到哪個內部主機。
此時,需要NAT設備根據傳輸層信息或其他上層協議去區分不同的會話,並且可能要對上層協議的標識進行轉換,比如TCP或UDP端口號。
這樣NAT網關就可以將不同的內部連接訪問映射到同一公網IP的不同傳輸層端口,通過這種方式實現公網IP的復用和解復用。
這種方式也被稱為端口轉換PAT、NAPT或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技術的優缺點
優點
節省合法的公有ip地址
地址重疊時,提供 解決辦法
網絡發生變化時,避免重新編址(網絡環境發生了一些變化,但是由於nat技術的特點,局域網的地址並沒有發生改變,我們依然使用着最初的編址方案)
NAT對我們來說最大的貢獻就是幫助我們節省了大量的ip資源
缺點
在介紹NAT的諸多缺點之前,我們先簡單介紹下什么是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存在時不能簡單按照連接數判斷。
總之,缺點大概如下:
- 無法進行端到端的ip跟蹤(破壞了端對端通信的平等性)
- 很多應用層協議無法識別(比如ftp協議 )
NAT穿越技術
前面解釋了NAT的弊端,為了解決IP端到端應用在NAT環境下遇到的問題,網絡協議的設計者們創造了各種武器來進行應對。但遺憾的是,這里每一種方法都不完美,還需要在內部主機、應用程序或者NAT網關上增加額外的處理。
應用層網關(ALG)
前面我們已經介紹到了,NAT實現了對UDP或TCP報文頭中的的IP地址及端口轉換功能,但對應用層數據載荷中的字段無能為力(也就是凈載中的數據無法修改),在許多應用層協議中,比如多媒體協議(H.323、SIP等)、FTP、SQLNET等,TCP/UDP載荷中帶有地址或者端口信息,這些內容不能被NAT進行有效的轉換,就可能導致問題。也就是說,NAT只是將數據包的包頭的ip地址和端口號進行了轉換,但是沒有對包內數據中的ip地址和端口號進行轉換於是我們開始設想能不能使用一種行之有效的方法保證包頭的ip和端口號與包中數據里的Ip地址和端口號都轉化為公網的ip地址和端口號。
ALG的實際應用
對於ALG的實現機制還是不清楚,如果有懂的大佬,推薦下書籍
下面我們舉個FTP傳輸的例子來簡單介紹一下ALG的實際應用

圖中私網側的主機要訪問公網的FTP服務器。
NAT設備上配置了私網地址192.168.1.2到公網地址8.8.8.11的映射,實現地址的NAT轉換,以支持私網主機對公網的訪問。組網中,若沒有ALG對報文載荷的處理,私網主機發送的PORT報文到達服務器端后,服務器無法根據私網地址進行尋址,也就無法建立正確的數據連接。整個通信過程包括如下四個階段:
(1) 私網主機和公網FTP服務器之間通過TCP三次握手成功建立控制連接。
(2) 控制連接建立后,私網主機向FTP服務器發送PORT報文,報文中攜帶私網主機指定的數據連接的目的地址和端口,用於通知服務器使用該地址和端口和自己進行數據連接。
(3) PORT報文在經過支持ALG特性的NAT設備時,報文載荷中的私網地址和端口會被轉換成對應的公網地址和端口。即設備將收到的PORT報文載荷中的私網地址192.168.1.2轉換成公網地址8.8.8.11,端口1084轉換成12487。
(4) 公網的FTP服務器收到PORT報文后,解析其內容,並向私網主機發起數據連接,該數據連接的目的地址為8.8.8.11,目的端口為12487(注意:一般情況下,該報文源端口為20,但由於FTP協議沒有嚴格規定,有的服務器發出的數據連接源端口為大於1024的隨機端口,如本例采用的是wftpd服務器,采用的源端口為3004)。由於該目的地址是一個公網地址,因此后續的數據連接就能夠成功建立,從而實現私網主機對公網服務器的訪問。
NAT技術的未來
在知乎上看到過這樣一種言論,隨着ipV6技術的到來,NAT技術已經不再需要了。在我看來,技術的革命一定是一步一步實現的,比如先是在局部地區使用IPV6,然后再逐步擴大其規模,減少IPv4的規模,所以NAT技術還是需要的。而且到了那個時候,網絡世界中會充斥着兩種地址ipV4和ipV6,這個時候更需要NAT技術了,因為NAT的中文翻譯叫做網絡地址轉換啊
