網路地址轉換

網路地址轉換（Network Address Translation，縮寫：NAT），又稱IP動態偽裝（IP Masquerade），是一種在IP封包通過路由器或防火牆時重寫來源或目的IP位址或埠的技術。這種技術普遍應用於有多台主機，但只通過一個公有IP位址訪問網際網路的私有網路中。

NAT技術部署方便，且得到了廣泛應用。然而，NAT也讓主機之間的通信變得複雜，導致了通信效率的降低。

## 概述

<image>

<image>

1990年代中期，NAT是作為一種解決IPv4地址短缺以避免保留IP位址困難的方案而流行起來的。網路地址轉換在很多國家廣泛使用。所以NAT就成了家庭和小型辦公室網路連接上的路由器的一個標準特徵，因為對他們來說，申請獨立的IP位址的代價要高於所帶來的效益。

在一個典型的配置中，一個本地網路使用一個專有網路的指定子網（比如192.168.x.x或10.x.x.x）和連在這個網路上的一個路由器。這個路由器占有這個網路地址空間的一個專有地址（比如192.168.0.1），同時它還通過一個或多個網際網路服務提供商提供的公有的IP位址（叫做「過載」NAT）連接到網際網路上。當資訊由本地網路向網際網路傳遞時，源地址從專有地址轉換為公用地址。由路由器跟蹤每個連接上的基本數據，主要是目的地址和埠。當有回覆返迴路由器時，它通過輸出階段記錄的連接跟蹤數據來決定該轉發給內部網的哪個主機；如果有多個公用地址可用，當數據包返回時，TCP或UDP客戶機的埠號可以用來分解數據包。對於網際網路上的通信，路由器本身充當源和目的。

流行在網路上的一種看法認為，IPv6的廣泛採用將使得NAT不再需要，因為NAT只是一個處理IPv4的地址空間不足的方法。

### 缺點

在一個具有NAT功能的路由器下的主機並沒有建立真正的對外IP位址，並且不能參與一些網際網路協議。一些需要初始化從外部網絡建立的TCP連接和無狀態協議（比如UDP）無法實現。除非NAT路由器管理者預先設置了規則，否則送來的數據包將不能到達正確的目的地址。一些協議有時可以在應用層網關（見下）的輔助下，在參與NAT的主機之間容納一個NAT的實例，比如FTP。NAT也會使安全協議變得複雜，比如IPsec。

端對端連接是被IAB委員會支持的核心網際網路協議之一，因此有些人據此認為NAT是對公用網際網路的一個破壞。一些網際網路服務提供商（ISP）只向他們的客戶提供本地IP位址，所以他們必須通過NAT來訪問ISP網路以外的服務，並且這些公司能不能算得上真正的提供了網際網路服務的話題也被談起。

## 類型

### 基本網路地址轉換（Basic NAT）

這一種也可稱作NAT或「靜態NAT」，在中提供了資訊。它在技術上比較簡單，僅支持地址轉換，不支持埠映射。Basic NAT要求對每一個當前連接都要對應一個公網IP位址，因此要維護一個公網的地址池。寬頻（broadband）路由器通常使用這種方式來允許一台指定的設備去管理所有的外部連結，甚至當路由器本身只有一個可用外部IP時也如此，這台路由器有時也被標記為DMZ主機。由於改變了IP源地址，在重新封裝數據包時候必須重新計算校驗和，網路層以上的只要涉及到IP位址的頭部校驗和都要重新計算。

Basic NAT要維護一個無埠號NAT表，結構如下。

內網IP｜外網IP

192.168.1.55｜219.152.168.222

192.168.1.59｜219.152.168.223

192.168.1.155｜219.152.168.224

### 網路地址埠轉換（NAPT）

這種方式支持傳輸層協議（例如TCP、UDP等）的埠映射，並允許多台主機共享一個公網IP位址。

支持埠轉換的NAT又可以分為兩類：源地址轉換和目的地址轉換。前一種情形下發起連接的電腦的IP位址將會被重寫，使得內網主機發出的數據包能夠到達外網主機。後一種情況下被連接電腦的IP位址將被重寫，使得外網主機發出的數據包能夠到達內網主機。實際上，以上兩種方式通常會一起被使用以支持雙向通信。

NAPT維護一個帶有IP以及埠號的NAT表，結構如下。

內網IP｜外網IP

192.168.1.55:5566｜219.152.168.222:9200

192.168.1.59:80｜219.152.168.222:9201

192.168.1.59:4465｜219.152.168.222:9202

### 受到NAT影響的應用程式

一些高層協議（比如FTP、Quake、SIP）在IP包的有效數據內發送網路層（第三層）資訊。比如，主動模式的FTP使用單獨的埠分別來控制命令傳輸和數據傳輸。當請求一個文件傳輸時，主機在發送請求的同時也通知對方自己想要在哪個埠接受數據。但是，如果主機是在一個簡單的NAT防火牆後發送的請求，那麼由於埠的映射，將會使對方接收到的資訊無效。

一個應用層閘道（Application Layer Gateway，ALG）可以修正這個問題。運行在NAT防火牆設備上的ALG軟體模塊可以更新任何由地址轉換而導致無效的資訊。顯然，ALG需要明白它所要修正的上層協議，所以每個有這種問題的協議都需要有一個單獨的ALG。

但是，除FTP外的大多數傳統的客戶機－伺服器協議不需要發送網路層（第三層）資訊，也就不需要ALG。

這個問題的另一個可能的解決方法是使用像STUN這樣的技術，但是這隻針對建立在UDP上的高層協議，並且需要它內建這種技術。這種技術對於對稱NAT也是無效的。還有一種可能的方案是UPnP，但它需要和NAT設備配合起來使用。

## 轉換和過濾方式

以下類型是基於RFC 3489所定義：

完全圓錐型NAT（Full cone NAT，也叫NAT1）、一旦內部地址（iAddr:iPort）映射到外部地址（eAddr:ePort），所有發自iAddr:iPort的封包都經由eAddr:ePort向外發送。、任意外部主機都能經由發送封包給eAddr:ePort到達iAddr:iPort。｜

<image>

受限圓錐型NAT（Restricted cone NAT，也叫NAT2）、一旦內部地址（iAddr:iPort）映射到外部地址（eAddr:ePort），所有發自iAddr:iPort的封包都經由eAddr:ePort向外發送。、唯iAddr:iPort曾經發送封包到外部主機（nAddr:any），外部主機才能經由發送封包給eAddr:ePort到達iAddr:iPort。（註：any指外部主機源埠不受限制。）｜

<image>

埠受限圓錐型NAT（Port-Restricted cone NAT，也叫NAT3）類似受限制錐形NAT，但是還有埠限制。、一旦內部地址（iAddr:iPort）映射到外部地址（eAddr:ePort），所有發自iAddr:iPort的封包都經由eAddr:ePort向外發送。、在受限圓錐型NAT基礎上增加了外部主機源埠必須是固定的。｜

<image>

對稱NAT（Symmetric NAT，也叫NAT4）、每一個來自相同內部IP與埠，到一個特定目的地IP和埠的請求，都映射到一個獨特的外部IP和埠。、:同一內部IP與埠發到不同的目的地和埠的資訊包，都使用不同的映射。、只有曾經收到過內部主機數據的外部主機，才能夠把封包發回。｜

<image>

## 其他用途

- 負載均衡：目的地址轉換NAT可以重定向一些伺服器的連接到其他隨機選定的伺服器。
- 失效終結：目的地址轉換NAT可以用來提供高可靠性的服務。如果一個系統有一台通過路由器訪問的關鍵伺服器，一旦路由器檢測到該伺服器當機，它可以使用目的地址轉換NAT透明的把連接轉移到一個備份伺服器上。
- 透明代理：NAT可以把連接到網際網路的HTTP連接重定向到一個指定的HTTP代理伺服器以緩存數據和過濾請求。一些網際網路服務提供商就使用這種技術來減少帶寬的使用而不用讓他們的客戶配置他們的瀏覽器支持代理連接。
- P2P 聯機：在純 IPv4 網路中，進行點對點聯機，例如 VoIP 應用，遊戲機聯機，或者 Tailscale 等異地組網（不同於內網穿透，內網穿透對應埠轉發，例如 FRP，需要 1 台具有全球唯一單播地址的伺服器）工具（基於 WireGuard）等網路嘗試打通 STUN 直連時，需要考慮雙方的 NAT 類型。例如針對埠受限錐型到埠受限錐型，通常能夠成功建立 對等網路，因為二者都屬於 EIM 錐型家族（RFC 5780 定義），即 Easy-NAT。而針對對稱型和埠受限錐型，會比對稱型到全錐型 困難很多，這和對稱型的特徵有關，部分 ISP 在外部埠或 IP 變化時會使用遞增埠，而部分 ISP 會使用隨機埠，甚至有可能需要利用 生日攻擊來進行 NAT 穿透。RFC 5780 本身為對 RFC 3489 的改進，但現實中的網路地址轉換，比映射規則和過濾規則還要複雜得多。在開源社區有部分針對 RFC 5780 和 3489 規則開發的 NAT 類型和特徵測試器，供專業網路工程人員使用。