NAT(網絡地址轉換)是如何工作的?
如果你正在閱讀本文,那你很有可能已經連上了因特網,這就是你用網絡地址轉換 (Network Address Translation, NAT) 的一個很好的機會!因特網已經發展到比人們當初設想時還龐大得多了。盡管其具體規模無法知曉,但現在估計有1億臺主機和超過3.5億的用戶活躍在因特網上。這比美國所有人口總數還多!(這篇文章發布較早,如今實際數量已經遠遠超過這個了,譯者) 事實上,因特網每年都以兩倍的速率不斷擴大。
那么面對日益龐大的因特網,NAT該做什么呢?所有的事情!對于一臺計算機要想和其他計算機進行通信或應用因特網上的Web服務 (電子郵件等各種網絡服務,譯者) ,那么它必須要有一個 IP 地址。一個 IP 地址是一串***的32位數字,它標識你的計算機在網絡中的位置。它基本上就像你的郵箱地址一樣:一種能夠正確找到你并把網絡信息送給你的地址。
當初IP地址問世時,所有人都認為其擁有的地址能夠覆蓋到每一個人。理論上,互不相同的IP 地址有4,294,967,296 (232) 個。但實際上真正可用的地址數比這要少 (在32億到33億之間) ,因為IP地址按類別劃分的方法和需要留出一些地址來進行廣播,
伴隨著因特網的膨脹和家庭網絡與公司網絡的不斷增加,可用的 IP 地址顯然已經不夠了。最容易想到的解決方案是重新設計地址格式讓它擁有更多的地址。這種方案正在開發,但是將花費數年才會實現,因為它需要跟換全球整個因特網的基礎設備。
NAT路由器傳送進出私有網絡的示意圖:
這就是 NAT (RFC 1631) 需要拯救的地方。總的來說,網絡地址轉換 (NAT) 允許一個單獨的設備,比如像路由器,作為因特網 (公共網絡) 和局域網 (私有網絡) 之間的代理。這就意味著對外部網絡來說僅僅只需要一個單獨的 IP 地址就可以代表一組 (內部網絡的) 計算機。
IP 地址的短缺僅僅是使用NAT的一個原因。另外兩個原因是:
安全
管理
你將知道跟多關于你如何收益于NAT的東西,但是首先,讓我們再靠近點看看 NAT 還能做什么 ...
讀者所應具備的知識:
本篇文檔的讀者應具備以下知識:
IP 地址和路由的概念
所用到的工具 這篇文檔的描述并不受限于任何特定的軟件和硬件。
面具之后 NAT 就像一個大辦公室里的傳達員。我們假設你讓傳達員拒絕將任何電話接進來給你,除非你要求將其接進來。然后,你給潛在客戶打了一個電話,(因為不在) 告訴他們回話給你。你告訴傳達員你正在等待一個來自這個客戶的電話,并允許將他們接進來。
這個客戶撥打了主號碼 (辦公室對外的電話號碼,譯者) 到你的辦公室,這是客戶***能查到的號碼。當客戶告訴傳達員他們想找誰的時候,傳達員就會查看一張匹配有公司人名和其電話分機的查看表。這個傳達員知道你在等待這個電話,因此傳達員將這個電話轉到了你的分機。 思科開發的網絡地址轉換 (NAT) 設備是工作在內部網絡和外部網絡之間的。NAT 的實現有許多種方式,并有許多種工作方法:
靜態NAT – 用一個一對一設備將一個未注冊的 IP 地址映射到一個已注冊的 IP 地址。當一臺設備需要被外界網絡可達時尤其有用。在靜態 NAT 中,IP 地址是192.168.32.10 的計算機總是被轉換成213.18.123.110:
#p#
動態 NAT – 映射一個未注冊的 IP 地址到一組已注冊 IP 地址里的一個。動態 NAT 也是在未注冊和已注冊 IP 地址之間建立映射關系,但是映射地址的來源是取決于通信時地址池中的可用注冊 IP 地址數。在動態 NAT 中,IP 地址是192.168.32.10的計算機總是轉換成范圍在213.18.123.100 - 213.18.123.150中***個可用 IP 地址:
過載 – 映射多個未注冊 IP 地址到一個已注冊 IP 地址時,動態 NAT 采用不同的端口。也就是所謂的 PAT (Port Address Translation, 端口地址轉換),單地址 NAT 或端口級 NAT 復用。在過載中,私有網絡中的每一臺計算機都轉換到同一個 IP 地址 (213.18.123.100) 但是被分配不同的端口號:
重疊 –當你在內網使用的 IP 地址已經在另一個網絡中被注冊并使用了,路由器就會維護一個有這些地址的檢查表,這樣路由器就可以截斷 (內網) 這些地址并將它們替換到***已注冊 IP 地址。特別注意, NAT 路由器必須將 ”內部“ 已注冊地址轉換到另一個已注冊***地址,還必須將 "外部" 已注冊地址轉換到私有網絡的***地址。這將通過靜態 NAT 或是你能用 DNS 并實現動態 NAT 來實現。內部 IP 地址的范圍 (237.16.32.XX) 已被另一個網絡注冊并使用。因此,路由器將進行地址轉換來避免和另一個網絡的潛在沖突。當信息被送往內部網絡時,它還將外部已注冊的 IP 地址轉換回本地原來的 IP 地址:
內部網絡通常是一個局域網 (LAN, Local Area Nerwork),通常也被稱為存根域。存根域只在內部使用 IP 地址的局域網。存根域中的大多數流量都只在內部傳送,不會離開這個內部網絡。一個存根域包括注冊和未注冊的 IP 地址。當然,任何使用未注冊 IP 地址的計算機都必須用網絡地址轉換來和外部網絡通信 (任何時候存根域內只有一部份主機要與外界通信,甚至還有許多主機可能從不與外界通信,所有整個存根域只需要共享少量的全局IP地址, 譯者注)。
有多種方法能配置 NAT。在下面的例子中,NAT 路由器被配置來將處于私有 (內部) 網絡中的未注冊 IP 地址 (內部地址) 轉換成注冊 IP 地址。當一臺擁有未注冊地址的內部設備需要和公共 (外部) 網絡通信時,NAT將會起作用。
ISP (Internet Server Provider, 網絡服務提供商)給你的公司分發一定范圍的 IP 地址段。分配的這一堆地址是注冊***的 IP 地址,即所謂的內部全局地址[1]。未被注冊的私有 IP 地址被分成兩組,數量少的一組 (外部本地地址[2]) 將被 NAT 使用,而大多數將用于存根域[5]所謂的內部本地地址[3]。外部本地地址用于轉換處于公共網絡中設備的*** IP 地址,即外部全局地址[4]。更多關于本地和全局地址的定義參見 NAT: Local and Global Definitions。NAT 僅僅只是轉換在內部和外部網絡之間被指定需要被轉換的流量。任何不符合流量轉換規則或那些僅僅在其他接口 (即路由器上的LAN口,譯者) 之間轉發的流量并不會被轉換,它們只會被轉發。根據 IP 地址是私有網絡 (存根域) 還是共有網絡 (因特網) 和流量是輸入還是輸出,而被分為許多種。
大多數在存根域 (網絡) 中的計算機都用內部本地地址相互通信。
在存根域 (網絡) 中的一些計算機需要經常和外部網絡通信。這些計算機就會被分配內部全局地址,這就意味著他們不再需要地址轉換。
當一臺在存根域 (網絡) 中被分配了內部本地地址的計算機想要和外部網絡通信時,數據包就會像通常一樣被路由到其默認網關,此時網管充當 NAT 路由器功能。
這個 NAT 路由器檢查它的路由表,查看有沒有包含這個數據包目的地址的條目。如果其目的地址不在這個路由表里,路由器就將數據包丟棄。如果這條目存在,路由器就驗證這個數據包是否是從內部網絡到外部網絡,并檢查其是否滿足轉換規則。路由器然后查看地址轉換表,看有沒有一個條目是這個內部本地地址對應的內部全局地址。如果有,路由器就用這個內部全局地址來替代數據包的內部本地地址。如果僅僅是配置了靜態 NAT 且沒有這樣的條目存在,路由器就會不轉換地址而直接轉發數據包。
通過內部全局地址,路由器將數據包轉發至它的目的地址。#p#
共有網絡中的一臺計算機要發送一個數據包到私有網絡。數據包中的源地址是一個外部全局地址。目的地址是一個內部全局地址。
當數據包從外部網絡到達路由器時,NAT 路由器查看地址轉換表發現其器目的地址有對應的內部本地地址,NAT 路由器就將其映射到這個存根域 (網絡) 的那臺計算機上。
NAT路由器將這個數據包中的內部全局地址 (即其目的地址,譯者) 轉換成內部本地地址后再查看路由表。只要在地址轉換表中沒有發現相應條目,路由器就不會轉換,更不會去查看路由表來驗證目的地址,它僅僅是將其丟棄而已。
關于用路由器命令執行 NAT 轉換的詳細信息參見NAT Order of Operation
NAT 過載運用了 TCP/IP 協議棧的一個功能,多路復用技術,它允許一臺計算機用不同的 TCP 或 UDP 端口維持許多當前來自遠程計算機的連接。一個 IP 數據包的頭部包含以下信息:
源地址——發出數據包的計算機的 IP 地址,例如,201.3.83.132
源端口號——源計算機為 TCP 或 UDP 分配的端口號,例如,1080.
目的地址——接收數據包的計算機的 IP 地址。例如,145.51.18.223.
目的端口號——源計算機請求接收計算機開放的 TCP 或 UDP 端口號,例如,3021.
地址用來標識一個連接兩端的兩臺計算機,而端口號則確保兩臺計算機之間的連接都有一個***的標識符。這四個數字一起確定了一個***的 TCP/IP 連接。每一個端口號都是16位,這就是說一共有65536個 (2^16) 個端口可供選擇。事實上,不同的廠商映射端口的方式略有不同,所以你可能只有大約4000個端口是可用的。
動態 NAT 和過載舉例
Flash 動畫:動態 NAT
這就是動態 NAT 是如何工作的:
點擊鏈接 Dynamic NAT Flash animation ,點擊任何一個綠色的按鈕是成功發送一個出去或進入存根域 (網絡)。點擊任何一個紅色按鈕是發送一個帶有非法地址而被路由器丟棄的數據包。
左邊是一個公司的內部網絡 (存根域) ,其中的 IP 地址并不是由 IANA (Internet Assigned Numbers Authority, 互聯網編號分配機構,一個掌握所有 IP 地址的全球權威機構 ) 分配的。這些地址并不會被路由器轉發,因為它們并不是***的 (其他內部網絡也可能有相同的地址,譯者)。這些就是所謂的內部本地地址。
這家公司將其路由器配置了 NAT。這個路由器有一段由 IANA 分配給這家公司的*** IP 地址。這些地址就是內部全局地址。
然后在這個存根域中的一臺計算機試圖連接一臺處于外部網絡的計算機,比如一臺網絡服務器。
這臺路由器收到了來自存根域的這臺計算機的數據包。
路由器在檢查了路由表之后,轉換規則的驗證程序就會開始執行,若通過,則路由器會將這臺計算機的不可路由的 IP 地址保存到一張地址轉換表中。路由器用內部全局地址中***個可用 IP 地址替換發送計算機的不可路由的 IP 地址。現在,地址轉換表就擁有了這臺計算的不可路由 IP 地址到一個*** IP 地址的匹配映射。
當一個數據包從目的計算機 (如網絡服務器) 發送回來時,路由器檢查數據包的目的地址。然后它查看地址轉換表確定數據包是屬于哪一臺存根域中的計算機。路由器將其目的地址換成它保存在地址轉換表中的那個,然后將數據包發送到那臺計算機。如果它沒有在表中找到一條匹配,它就會丟棄這個數據包。
這臺計算機收到來自路由器的數據包。只要有計算機想要和外部網絡通信,它們將重復這個過程。
這是 NAT 過載如何工作的:
假設一個公司的內部網絡 (存根域) 已經被設置了未被 IANA 專門分配的不可路由的 IP 地址。
這家公司將路由器設置為 NAT 可用的。路由器擁有一個***由 IANA 分給這家公司的的 IP 地址。
在存根域中的一臺計算機試圖連接外部網絡中的一臺計算機,例如一臺網絡服務器。
路由器收到來自存根域的這臺計算機發送的數據包。
在進行轉換之前,路由器查找路由并驗證數據包是否合乎規則,然后路由器保存這臺計算機的不可路由的 IP 地址和其端口號到一張地址轉換表中。路由器將發送計算機的不可路由的 IP 地址替換路由器的 IP 地址,將發送計算機源端口號替換成能夠匹配地址轉換表中所存的發送計算機地址信息位置的端口號。現在這張轉換表就將這臺計算機的不可路由的 IP 地址及其端口號與路由器的 IP 地址綁定起來了。
當一個數據包從目的計算機發送回來時,路由器檢查其目的端口號 (不用檢查其 IP 地址,因為全部內部網絡都只用路由器的 IP 地址,路由器用端口號映射不同的計算機,譯者)。然后路由器查看地址轉換表,找到這個數據包所對應的存根域中的計算機。如果有,則路由器替換其目的地址和目的端口號,然后發送到那臺計算機。#p#
這臺計算機接收來自路由器的數據包, 并且只要這臺計算和外部網絡通信,此過程就會重復執行。
由于 NAT 路由器現在已經擁有了這臺計算機保存在地址轉換表中的的源地址和源端口號,它將會在有效期內繼續使用同一個端口號進行轉換。每當一個新的條目加入到路由器的轉換表中時,計數器就會重置。如果在計數器到期之前連接就不可用了,其對應條目就會從表中刪除。
下面這張表顯示了一臺處于存根域的計算機對外部網絡將會如何表現:
源計算機 | 源計算機 IP 地址 | 源計算機 端口號 | NAT路由器 IP 地址 | NAT路由器分配的端口號 |
---|---|---|---|---|
A |
192.168.32.10 |
400 |
215.37.32.203 |
1 |
B |
192.168.32.13 |
50 |
215.37.32.203 |
2 |
C |
192.168.32.15 |
3750 |
215.37.32.203 |
3 |
D |
192.168.32.18 |
206 |
215.37.32.203 |
4 |
就如你說見, NAT 路由器將每一臺計算機的 IP 地址和端口號都保存在地址轉換表中。然后它用它自己注冊的 IP 地址替換發送來的數據包的 IP 地址,并將端口號替換為該數據包的源計算機信息條目在表中的相應位置號。這樣任何一臺處于外部網絡的計算機都會在發送給它的數據包里找到 NAT 的 IP 地址和由路由器分配的端口號。
你也可以給存根域中的一些計算機指定 IP 地址。你可以創建一個 IP 地址列表來告訴路由器網路中的哪些計算機需要 NAT 服務。這樣,所有其他 IP 地址的計算機都不會執行轉換了。
一臺路由器能同時執行地址轉換的個數主要取決對于它擁有的DRAM (動態隨機存儲器, Dynamic Random Access Memory) 。但是由于通常的地址轉換條目是160字節,而一臺有4MB 大小 DRAM 的路由器理論上可以同時執行 26214 個地址轉換!這對大多數應用都已經足已。
IANA 事實上專門給不可路由的網絡指定了一段 IP 地址。這些地址是未注冊的 (關于這些地址的范圍定義請參見 RFC 1918: Address Allocation for Private Internets) ,也就是說沒有任何一家公司或機構有權利聲稱他們擁有這些地址并在公共網絡上使用。路由器并不會直接轉發數據包到未注冊地址,因為它們使用未注冊地址就意味著這些網絡是私有的,并不想被外界所知道。這就是說一個數據包從一個未注冊地址能夠達到一臺有注冊地址的計算機,但是其響應數據包將會在它到達的***個路由器就被丟棄 (這里說的是不是用 NAT 的情況,譯者) 。
這是在三類 IP 地址中用于私有網絡的地址段:
地址段1用于 A 類地址:10.0.0.0 到 10.255.255.255
地址段2用于 B 類地址: 172.16.0.0 到 172.31.255.255
地址段3用于 C 類地址: 192.168.0 到 192.168.255.255
雖然每一段都位于不同類地址中,但是在你的內部網絡中你用那一段并沒有限制。但它是一個很好的減少 IP 地址沖突的方式。
安全和管理
在你的內部網絡和外部網絡 (或者說因特網) 之間使用動態 NAT 相當于自動建立了一個防火墻。動態 NAT 僅僅允許來自內部存根域發起的連接。本質上就是說,一臺處于外部網絡的計算機將不能連接到你的計算機,除非你的計算機已經建立了連接。所以你可以瀏覽因特網,連上一個站點,甚至可以下載文件。但是其他人卻不能像這樣簡單的獲取到你的 IP 地址并用它連接上你的計算機上的端口。
靜態 NAT ,也就是所謂的入站映射,允許在特殊情況下來自外部設備發起的連接到處于存根域中的計算機。例如,你或許希望映射一個內部全局地址到一個指定的內部本地地址,它指向你的網絡服務器。
靜態 NAT (入站映射) 允許當一臺在存根域中的計算機與外部網絡中的設備通信時維持一個指定的地址:
一些 NAT 路由器還提供額外的過濾和流量記錄功能。過濾功能讓你的公司能控制公司雇員能夠訪問哪些網站,阻止他們查看可疑的資源。你可以運用流量記錄來創建一個記錄文件,記錄哪些網站被訪問了,并根據它生成報告。#p#
網絡地址轉換常常和代理服務搞混,但是它們之間有明確的不同。NAT 對源和目的計算機都是透明的。沒有任何一方會意識到它正在和第三方設備打交道。但是代理服務卻不是透明的。源計算機知道它正向代理服務器發起一個請求,而且你還必須進行配置才能這樣做。目的計算機會認為代理服務器就是與它直接通信的源計算機。還有,代理服務通常工作在 OSI 參考模型的第 4 層 (傳輸層) 或更高,而 NAT 工作在第 3 層 (網絡層)。由于代理服務工作在更高層,所以通常它將比 NAT 要慢。
NAT 工作在 OSI 參考模型的網絡層 (第3層) 是有道理的,因為路由器就工作在這一層:
NAT 真正的好處是它在網絡中是透明的。例如,你可以將你的 Web 服務器或 FTP 服務器移到另一臺主機上而不用擔心會破壞連接。只需簡單地修改入站映射,將路由器映射到你的新內部本地地址就行了。你也可以很容易地改變你的內部網絡,因為***的外部 IP 地址不是屬于路由器就是來自一段分配的全局地址。
NAT 和 DHCP 簡直就是天作之合,你可以為你的存根域選擇一段未注冊 IP 地址然后用 DHCP 服務將它們分發出去。這也使你想擴大網絡規模時變得更加容易。你不再需要向 IANA 請求更多的 IP 地址,你只需增加配置在 DHCP 中的可用 IP 地址段,這樣你網絡中的新增計算機立即就有了地址空間了。
多宿主
由于商業現在正越來越依賴于因特網,擁有多個連接點到因特網正快速成為他們的網絡策略中的一部分。多鏈路,就是所謂的多宿主,當其中一條鏈路崩潰時,它減少了潛在的災難性崩潰的可能。
為了維持一條可靠的連接,多宿主允許一家公司通過減少在單條鏈路上連接到因特網的計算機數量,以此來達到負載平衡。通過多鏈路而達到分布式負載將會提高性能,并且能夠顯著地減少等待時間。 多宿主網絡通常是連接到不同的 ISP (Internet Service Providers,網絡服務供應商)。每一個 ISP 都分配一個 (或一段) IP 地址給這家公司。路由器用 BGP (Border Gateway Protocol,邊界網關協議),TCP/IP 協議棧的一部分,在運行不同網絡協議的網絡之間進行路由。在一個多宿主網絡中,路由器在存根域中利用 IBGP (Internal Border Gateway Protocol,內部邊界網關協議) ,在與其他路由器之間通信時利用 EBGP (External Border Gateway Protocol,外部邊界網關協議)。當多宿主網絡用到 NAT 時,NAT 路由器會被配置來自不同 ISP 分配的多個內部全局地址段。同樣的內部本地地址將會被映射到多個不同的來自 NAT 的內部全局地址,這取決于流量將被路由到哪一個目的地址。這就是所謂的目的地的 NAT,查看 NAT - Ability to Use Route Maps with Static Translations 獲得跟多信息。
多宿主對于連接到一個 ISP 的鏈接崩潰時很有效。一旦路由器連接到的那個 ISP 的鏈接崩潰了,它將馬上將所有經過它的流量重定向到其他路由器。
NAT 可用于緩解對于多宿主多用戶延伸的可預測路由。
[1] inside global(內部全局地址):私有主機在非自有網絡中使用的地址,通常情況下inside global地址是從合法的全球統一可尋址空間中分配的地址,也就是通常所說的共有IP。inside global地址的特點是只會出現在非自有網絡中并且一定是給私有主機使用的。
[2] outside local(外部本地地址):非私有主機在自有網絡內表現出來的IP地址。該地址是自有網絡的管理員為本網絡以外的設備所準備的用于在自有網絡內使用的 IP地址。outside local地址的特點是只會出現在自有網絡內但是是供給非私有主機使用的。
[3] inside local(內部本地地址):在自有網絡中分配給私有主機的地址,一般情況下該地址是RFC1918中定義的私有地址。inside local地址的特點是只會出現在自有網絡中并且一定是給私有主機使用的。
[4] outside global(外部全局地址):非私有主機在自有網絡以外的區域使用的IP地址,是非私有主機所在網絡的管理員負責管理個分配的。outside global地址的特點是不會出現在自有網絡中而且不是給私有主機使用,不歸自有網絡的管理員負責。
[5] 存根網絡(stub network):只有一條連接到其鄰居網絡的網絡。