网络地址转换

**網路位址轉譯**（英語：**N**etwork **A**ddress **T**ranslation，縮寫：**NAT**；又稱**網路掩蔽**、**IP 掩蔽**）在計算機網路中是一種在 IP 封包通過路由器或防火牆時重寫來源 IP 地址或目的 IP 位址的技術。這種技術被普遍使用在有多台主機但只通過一個公有 IP 位址存取網際網路的私有網路中。它是一個方便且得到了廣泛應用的技術。當然，NAT 也讓主機之間的通信變得複雜，導致了通信效率的降低。

## 概述

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 委員會（Internet Architecture Board）支援的核心網際網路協定之一，因此有些人據此認為 NAT 是對公用網際網路的一個破壞。一些網際網路服務提供商（ISP）只向他們的客戶提供本地 IP 位址，所以他們必須通過 NAT 來存取 ISP 網路以外的服務，並且這些公司能不能算得上真正的提供了網際網路服務的話題也被談起。

### 優點

NAT 除了帶來方便和低成本之外，對全雙工連接支援的缺少在一些情況下可以看作是優點而不是限制。在一定程度上，NAT 依賴於本地網路上的一台機器來初始化和路由器另一邊的主機的所有連接，它可以阻止外部網路上的惡意活動。這樣就可以阻止網路蠕蟲病毒來提高本地系統的可靠性，阻擋惡意瀏覽來提高本地系統的私密性。很多具有 NAT 功能的防火牆都是使用這種功能來提供核心保護的。另外，它也為 UDP 的跨局域網的傳輸提供了方便性。

## 基本 NAT 和埠號轉換

### 基本網路位址轉譯（Basic NAT）

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

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

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

這種方式支援埠的對映，並允許多台主機共享一個公網 IP 位址。

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

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

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

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

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

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

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

## 不同類型的 NAT

## NAT 其他用途實例

* 負載均衡：目的位址轉換 NAT 可以重新導向一些伺服器的連接到其他隨機選定的伺服器。
* 失效終結：目的位址轉換 NAT 可以用來提供高可靠性的服務。如果一個系統有一台通過路由器存取的關鍵伺服器，一旦路由器檢測到該伺服器當機，它可以使用目的位址轉換 NAT 透明的把連接轉移到一個備份伺服器上。
* 透明代理：NAT 可以把連接到網際網路的 HTTP 連接重新導向到一個指定的 HTTP 代理伺服器以快取資料和過濾請求。一些網際網路服務提供商就使用這種技術來減少頻寬的使用而不用讓他們的客戶組態他們的瀏覽器支援代理連接。

## 參見

* NAT 穿越
* 埠位址轉換
* 防火牆
* 路由
* IPv4
* IPv6
* IPv4 位址枯竭
* 專用網路
* 網際網路連接共享
* 代理伺服器
* 通訊埠轉發
* 電信級 NAT
* STUN：NAT 的 UDP 簡單穿越
* TURN：NAT 的 UDP 簡單中繼
* ICE：結合 STUN 與 TURN 的 NAT 的 UDP 簡單穿越與中繼

## 外部連結

* Network Address Translation Traversal of MSDN （頁面存檔備份，存於網際網路檔案館）
* http://www.windowsnetworking.com/articles\_tutorials/NAT\_Windows\_2003\_Setup\_Configuration.html （頁面存檔備份，存於網際網路檔案館）–這篇文章介紹了怎樣在 Windows 2003 中建立和組態 NAT
* http://www.cisco.com/en/US/about/ac123/ac147/archived\_issues/ipj\_7-3/anatomy.html （頁面存檔備份，存於網際網路檔案館）
* http://computer.howstuffworks.com/nat.htm/printable （頁面存檔備份，存於網際網路檔案館）
* RFC 4008–Standards Track – NAT 中的被管理物件的定義
* RFC 3022–傳統 NAT
* RFC 1631–已作廢–IP NAT
* http://freshmeat.net/projects/nat-traverse/ （頁面存檔備份，存於網際網路檔案館）