圖文並茂詳解 NAT 協議!

程式設計師cxuan發表於2022-02-23

什麼是 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 具體的工作機制,如下圖所示。

image-20220221082848527

私有網路中的客戶端 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 ,這種轉換是雙向的。

image-20220221085746750

拿上圖來說,意思就是伺服器 122.122.122.122 傳送一個資料包,這個資料包通過 Internet 傳送給 NAT 路由器,NAT 路由器把它轉換為目標地址是 192.168.1.6 的資料包,然後再傳送給客戶端 A。

這裡有個問題,伺服器是傳送的資料包,是如何把目標地址的公有 IP 地址轉換為私有 IP 地址的呢?

我們上面在引用中說到,NAT 路由器其實就是在路由器上裝的 NAT 軟體,所以 NAT 路由器它本身就是一臺路由器裝置,而路由器是有路由表的,路由表中記錄一些源地址和目標地址項,資料包根據這些項來進行路由轉發。

(我們可以使用 netstat -nr 來顯示路由表的資訊)

image-20220221100722602

所以,NAT 路由器內部有一張用來記錄轉換地址的表,也就是一件可以解釋的事情了,所以 NAT 路由器在進行地址轉換時,會按照其內部的對映關係來進行處理。

上面只是一臺客戶端進行 NAT 轉換的情形,但是現實生活中我們私有網路中不可能只有一臺客戶端進行通訊,所以當私有網路中所有的客戶端都需要上網,進行 NAT 轉換的時候,是不是 NAT 路由器會為每一個客戶端生成一個 IP 地址呢?如果全世界範圍內的私有網路都這麼轉換的話,那麼公有 IP 地址的數量勢必會承受非常大的壓力。

針對這種情況,提出了使用 IP 地址和埠號一起轉換的方式(NAPT),如下圖所示。

image-20220221143753479

這個大致過程和上面 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 協議???

如果對你有幫助,還希望讀者朋友能夠一鍵三連!

另外,我自己彙總了一本網路的 PDF ,現在分享給你

相關文章