聊一聊 NAT 協議

Hey 各位小夥伴大家好啊,這裏是 cxuan,今天我們來聊一聊什麼是 NAT 協議。

什麼是 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)其實最關鍵的也是路由器中的轉換表,過度依賴轉換表會造成下面這些問題

那麼針對這些問題,該如何解決呢?

第一種是直接升級到 IPv6,因爲在 IPv6 的環境中可用的 IP 地址的數量有了極大的擴展,現在看來,怎麼造都沒事兒。還有一種解決辦法是一種叫做 NAT 穿越的技術。

NAT 的應用

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

使用 NAT 的意義

NAT(NAPT)實際上是爲了解決 IPv4 枯竭而開發的技術,不過,現在隨着 IPv6 的開發,在 IPv6 中爲了提高網絡安全也在使用 NAT,在 IPv4 和 IPv6 的通信中經常使用 NAT-PT。然而在安全機制上 IPv4 也潛在着威脅,在配置和管理上也是一個挑戰。如果要從根本上解決 IP 地址資源的問題,IPv6 纔是最根本之路。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/_Sw_FStGbxlA8VoEFiKyFQ