什么是 NAT 協議
我們的計算機要想訪問互聯網上的信息,就需要一個地址,而且這個地址是大家(其他主機)所認可的,是公共的,這個地址也叫做公有 IP 地址。
與之相對的,除了公有 IP 地址外,還有私有 IP 地址,私有 IP 地址就是我們在私有網絡中使用的地址,比如局域網或者公司內部的網絡。不知道你沒有觀察過自己家路由器所分配的 IP 地址,當你登上路由器的網關 192.168.1.1 時,在分配的網絡下面一般會看到一些 IP 地址,都是 192.168.1.x ,這種地址就是私有 IP 地址。
所以現在就會產生一個問題,比如 cxuan 的私有 IP 地址是 192.168.1.3 ,而隔壁 cuanxi 哥的 IP 地址也是 192.168.1.3 ,那么他倆同時在網上沖浪的時候,不會產生 IP 沖突嗎?或者是把 cxuan 瀏覽的內容告訴給了 cxuanxi 哥?
這種問題遠不用擔心,因為我們有一個很靠譜的兄弟 --- NAT(Network Address Translator),當我們的計算機連接到 Internet 的同時,NAT 就會把我們的私有地址直接轉換成互聯網上的公有 IP 地址,那么下面我們就來了解一下這個協議和它的工作機制。
我們現在就可以給 NAT 協議下一個定義,即 NAT 協議是將在本地網絡中使用的私有地址,在連接互聯網的同時轉換成為公共 IP 地址的技術。實際上,轉換的不僅僅只有 IP 地址,還有 TCP 、UDP 端口號,不過這種協議叫做 NAPT 協議。通常情況下,我們所說的 NAT 其實指的就是 NAPT。
NAT 的工作機制
下面我們來聊一下 NAT 具體的工作機制,如下圖所示。
私有網絡中的客戶端 A (IP 192.168.1.6)想向公共網絡中的服務器(IP 122.122.122.122)發送數據包,當這個數據包經過 NAT 路由器的時候,就會把它的私有 IP 192.168.1.6 轉換為公有的 IP 12.34.56.78,然后這個數據包的源地址就變為 12.34.56.78 ,它經由 Internet 發送給 IP 為 122.122.122.122 的目標服務器。
NAT 路由器其實就是相當于在路由器上安裝的 NAT 軟件,裝有 NAT 軟件的路由器就叫做 NAT 路由器。
NAT 路由器不僅可以把私有 IP 轉換為公有 IP ,還可以把公有 IP 轉換為私有 IP ,這種轉換是雙向的。
拿上圖來說,意思就是服務器 122.122.122.122 發送一個數據包,這個數據包通過 Internet 發送給 NAT 路由器,NAT 路由器把它轉換為目標地址是 192.168.1.6 的數據包,然后再發送給客戶端 A。
這里有個問題,服務器是發送的數據包,是如何把目標地址的公有 IP 地址轉換為私有 IP 地址的呢?
我們上面在引用中說到,NAT 路由器其實就是在路由器上裝的 NAT 軟件,所以 NAT 路由器它本身就是一臺路由器設備,而路由器是有路由表的,路由表中記錄一些源地址和目標地址項,數據包根據這些項來進行路由轉發。
(我們可以使用 netstat -nr 來顯示路由表的信息)
所以,NAT 路由器內部有一張用來記錄轉換地址的表,也就是一件可以解釋的事情了,所以 NAT 路由器在進行地址轉換時,會按照其內部的映射關系來進行處理。
上面只是一臺客戶端進行 NAT 轉換的情形,但是現實生活中我們私有網絡中不可能只有一臺客戶端進行通信,所以當私有網絡中所有的客戶端都需要上網,進行 NAT 轉換的時候,是不是 NAT 路由器會為每一個客戶端生成一個 IP 地址呢?如果全世界范圍內的私有網絡都這么轉換的話,那么公有 IP 地址的數量勢必會承受非常大的壓力。
針對這種情況,提出了使用 IP 地址和端口號一起轉換的方式(NAPT),如下圖所示。
這個大致過程和上面 NAT 的轉換模式相同,不一樣的是,使用 NAPT 會把客戶端 A 和客戶端 B 的數據包源地址 192.168.1.6:80、192.168.1.7:80 轉換為 12.34.56.78:80 和 12.34.56.78:90 ,然后再發送給目標服務器。在轉換的過程中,NAT 路由器會生成轉換表,通過轉換表就可以正確地轉換地址和端口的組合,使客戶端 A 和客戶端 B 與服務器之間進行通信。
轉換表是在 NAT 路由器上自動生成的,當 TCP 開始建立連接的時候,就會生成對應的映射,斷開連接時,會刪除對應的映射。
什么是 NAT - PT
現在互聯網情況是一部分 IPv4 的主機和 IPv6 的主機共存的情況,IPv6 作為 IPv4 的替代者,已經越來越多的主機選擇升級到了 IPv6 協議,但是羅馬不是一日建成的,也不可能全世界范圍的計算機都在某幾天停機進行升級,這是不現實的,而且很多服務是基于 IPv4 協議建立的,如果升級到 IPv6 不兼容的話,使用 IPv6 的優勢也就無從談起,所以為了解決這個問題,就產生了 NAT-PT 規范。
NAT-PT 是一種將 IPv6 首部轉換為 IPv4 首部的一種技術,通過 NAT-PT ,IPv6 的主機能夠和 IPv4 主機進行通信,同時某些 IPv4 的服務也能夠讓 IPv6 的主機使用。
注意這里的 IPv6 只能轉換為 IPv4 ,不能反向轉換,那么要實現雙向通信,該如何做呢?
支持 NAT-PT 的路由器要 DNS-ALG 的支持來實現 IPv4 向 IPv6 的轉換。
NAT-PT 機制定義了以下 3 種不同類型的操作:
靜態 NAT - PT
靜態 NAT - PT 模式主要是一對一映射的。IPv6 網絡內的節點要訪問的 IPv4 網絡內都必須在 NAT-PT 設備中設置。每一個目的 IPv4 地址在 NAT-PT 設備中被映射為一個具有預定義 NAT-PT 前綴的 IPv6 地址。
動態 NAT - PT
動態模式也提供了一對一映射,只不過這種動態模式是有一個 IPv4 地址池的,池中的 IPv4 地址數量決定了并發IPv6 到 IPv4 轉換的最大數目。
NAPT - PT
網絡地址端口轉換--協議轉換模式提供多個有 NAT-PT 前綴的 IPv6 地址和一個源 IPv4 地址間的多對一動態映射。
NAT 的潛在問題
聊到現在,我們可以推斷出,NAT(NAPT)其實最關鍵的也是路由器中的轉換表,過度依賴轉換表會造成下面這些問題
- NAT 無法從外部向內部服務器建立連接。
- 生成轉換表存在一定的開銷。
- NAT 路由一旦遇到異常情況需要重啟,所有的 TCP 連接都會丟失。
- 即使做了災備,TCP 連接還是會斷開。
那么針對這些問題,該如何解決呢?
第一種是直接升級到 IPv6,因為在 IPv6 的環境中可用的 IP 地址的數量有了極大的擴展,現在看來,怎么造都沒事兒。還有一種解決辦法是一種叫做 NAT 穿越的技術。
NAT 的應用
NAT 主要可以實現以下幾個功能:數據包偽裝、負載均衡、端口轉發和透明代理。
- 數據偽裝:可以將內網數據包中的地址信息更改成統一的對外地址信息,不讓內網主機直接暴露在因特網上,保證內網主機的安全。同時,該功能也常用來實現共享上網。例如,內網主機訪問外網時,為了隱藏內網拓撲結構,使用全局地址替換私有地址。
- 負載均衡:目的地址轉換 NAT 可以重定向一些服務器的連接到其他隨機選定的服務器。
- 端口轉發:當內網主機對外提供服務時,由于使用的是內部私有 IP 地址,外網無法直接訪問。因此,需要在網關上進行端口轉發,將特定服務的數據包轉發給內網主機。
- 透明代理:例如自己架設的服務器空間不足,需要將某些鏈接指向存在另外一臺服務器的空間;或者某臺計算機上沒有安裝 IIS 服務,但是卻想讓網友訪問該臺計算機上的內容,這個時候利用 IIS 的 Web 站點重定向即可輕松的幫助我們搞定。
使用 NAT 的意義
NAT(NAPT)實際上是為了解決 IPv4 枯竭而開發的技術,不過,現在隨著 IPv6 的開發,在 IPv6 中為了提高網絡安全也在使用 NAT,在 IPv4 和 IPv6 的通信中經常使用 NAT-PT。然而在安全機制上 IPv4 也潛在著威脅,在配置和管理上也是一個挑戰。如果要從根本上解決 IP 地址資源的問題,IPv6 才是最根本之路。
原文鏈接:NAT 協議???
如果對你有幫助,還希望讀者朋友能夠一鍵三連!