

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# NAT 執行個體
<a name="VPC_NAT_Instance"></a>

NAT 執行個體提供網路位址轉譯 (NAT)。若您使用 NAT 執行個體，即可允許私有子網路中的資源與虛擬私有雲端 (VPC) 外部的目的地通訊，例如與網際網路或內部部署網路通訊。私有子網路中的資源可以啟動流向網際網路的傳出 IPv4 流量，但無法接收在網際網路上啟動的傳入流量。

**重要**  
NAT AMI 建立在最新版本的 Amazon Linux AMI, 2018.03 上，該版本已於 2020 年 12 月 31 日終止標準支援，並於 2023 年 12 月 31 日結束維護支援。如需詳細資訊，請參閱下列部落格文章：[Amazon Linux AMI end of life](https://aws.amazon.com/blogs/aws/update-on-amazon-linux-ami-end-of-life/)。  
如果您使用現有的 NAT AMI， AWS 建議您[遷移到 NAT 閘道](vpc-nat-comparison.md#nat-instance-migrate)。NAT 閘道可提升可用性，提高頻寬並可減輕管理負擔。如需詳細資訊，請參閱[比較 NAT 執行個體和 NAT 閘道](vpc-nat-comparison.md)。  
如果與 NAT 閘道相比，NAT 執行個體更符合您的使用案例，您可以從 [3. 建立 NAT AMI](work-with-nat-instances.md#create-nat-ami) 中所述的當前版本的 Amazon Linux 建立自己的 NAT AMI。

**Topics**
+ [NAT 執行個體基本概念](#basics)
+ [啟用私有資源以在 VPC 外部通訊](work-with-nat-instances.md)

## NAT 執行個體基本概念
<a name="basics"></a>

下圖說明 NAT 執行個體基本概念。路由表與私有子網路相關聯，將網際網路流量從私有子網路的執行個體傳送至公有子網路的 NAT 執行個體。NAT 執行個體之後會將流量傳送至網際網路閘道。流量歸屬於 NAT 執行個體的公有 IP 地址。NAT 執行個體指定高連接埠號碼用於回應，如果傳回回應，NAT 執行個體會根據回應的連接埠號碼將它傳送到私有子網路的執行個體。

NAT 執行個體必須具有網際網路存取權，因此其必須位於公有子網路 (即具有路由表且具有通往網際網路閘道的子網路) 中，且必須具有公有 IP 地址或彈性 IP 地址。

![\[圖表顯示 VPC 中 NAT 執行個體的設定\]](http://docs.aws.amazon.com/zh_tw/vpc/latest/userguide/images/nat-instance_updated.png)


若要開始使用 NAT 執行個體，請先建立 NAT AMI，再為 NAT 執行個體建立安全群組，然後在 VPC 中啟動 NAT 執行個體。

您的 NAT 執行個體配額取決於該區域的執行個體配額。如需詳細資訊，請參閱《AWS 一般參考》**中的 [Amazon EC2 Service Quotas](https://docs.aws.amazon.com/general/latest/gr/ec2-service.html#limits_ec2)。

# 啟用私有資源以在 VPC 外部通訊
<a name="work-with-nat-instances"></a>

本節說明如何建立和使用 NAT 執行個體，以啟用私有子網路中的資源，以在虛擬私有雲端外部進行通訊。

**Topics**
+ [1. 為 NAT 執行個體建立 VPC](#create-vpc-subnets)
+ [2. 為 NAT 執行個體建立安全群組](#NATSG)
+ [3. 建立 NAT AMI](#create-nat-ami)
+ [4. 啟動 NAT 執行個體](#NATInstance)
+ [5. 停用來源/目標檢查](#EIP_Disable_SrcDestCheck)
+ [6. 更新路由表](#nat-routing-table)
+ [7. 測試 NAT 執行個體](#nat-test-configuration)

## 1. 為 NAT 執行個體建立 VPC
<a name="create-vpc-subnets"></a>

按照以下程序建立包含公有子網路和私有子網路的 VPC。

**若要建立 VPC**

1. 在 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 開啟 Amazon VPC 主控台。

1. 選擇**建立 VPC**。

1. 針對 **Resources to create** (建立資源)，選擇 **VPC and more** (VPC 等)。

1. 針對**自動產生名稱標籤**，輸入 VPC 的名稱。

1. 若要設定子網路，請執行下列動作：

   1. 對於 **Number of Availability Zones** (可用區域數量)，請根據您的需求選擇 **1** 或 **2**。

   1. 針對 **Number of public subnets** (公用子網路數量)，請確定每個可用區域有一個公用子網路。

   1. 針對 **Number of private subnets** (私有子網路數量)，請確定每個可用區域有一個私有子網路。

1. 選擇**建立 VPC**。

## 2. 為 NAT 執行個體建立安全群組
<a name="NATSG"></a>

按照下表所述的規則建立安全群組。這些規則可讓 NAT 執行個體接收從私有子網路中執行個體流向網際網路的流量，以及來自您網路的 SSH 流量。NAT 執行個體也可以傳送流量到網際網路，讓私有子網路中的執行個體能取得軟體更新。

下列是建議的傳入規則。


| 來源 | 通訊協定 | 連接埠範圍 | 評論 | 
| --- | --- | --- | --- | 
| 私有子網路 CIDR | TCP | 80 | 允許來自私有子網路伺服器的傳入 HTTP 流量 | 
| 私有子網路 CIDR | TCP | 443 | 允許來自私有子網路伺服器的傳入 HTTPS 流量 | 
| 您網路的公有 IP 地址範圍 | TCP | 22 | 允許傳入 SSH 從您的網路存取 NAT 執行個體 (透過網際網路閘道) | 

下列是建議的傳出規則。


| 目標 | 通訊協定 | 連接埠範圍 | 評論 | 
| --- | --- | --- | --- | 
| 0.0.0.0/0 | TCP | 80 | 允許傳出 HTTP 存取網際網路。 | 
| 0.0.0.0/0 | TCP | 443 | 允許傳出 HTTPS 存取網際網路。 | 

**建立安全群組**

1. 在 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 開啟 Amazon VPC 主控台。

1. 在導覽窗格中，選擇**安全群組**。

1. 選擇 **Create Security Group** (建立安全群組)。

1. 輸入安全群組的名稱和說明。

1. 在 **VPC** 欄位中選取 NAT 執行個體的 VPC ID。

1. 在**傳入規則**下新增傳入流量的規則，如下所示：

   1. 選擇**新增規則**。在**類型**欄位中選擇 **HTTP**，然後在**來源**欄位中輸入私有子網路的 IP 地址範圍。

   1. 選擇**新增規則**。在**類型**欄位中選擇 **HTTPS**，然後在**來源**欄位中輸入私有子網路的 IP 地址範圍。

   1. 選擇**新增規則**。在**類型**欄位中選擇 **SSH**，然後在**來源**欄位中輸入網路的 IP 地址範圍。

1. 在**傳出規則**下新增傳出流量的規則，如下所示：

   1. 選擇**新增規則**。在**類型**欄位中選擇 **HTTP**，然後在**目的地**欄位中輸入 0.0.0.0/0。

   1. 選擇**新增規則**。在**類型**欄位中選擇 **HTTPS**，然後在**目的地**欄位中輸入 0.0.0.0/0。

1. 選擇 **Create Security Group (建立安全群組)**。

如需詳細資訊，請參閱[Security groups (安全群組)](vpc-security-groups.md)。

## 3. 建立 NAT AMI
<a name="create-nat-ami"></a>

將 NAT AMI 設定為在 EC2 執行個體上執行 NAT。您必須先建立 NAT AMI，然後才能使用 NAT AMI 啟動 NAT 執行個體。

如果您計劃將 Amazon Linux 以外的作業系統用於 NAT AMI，則請參閱相應作業系統的說明文件，從中了解如何設定 NAT。請務必儲存這些設定，以便這些設定在執行個體重新啟動後仍然存在。

**為 Amazon Linux 建立一個 NAT AMI**

1. 啟動執行 AL2023 或 Amazon Linux 2 的 EC2 執行個體。請務必指定您為 NAT 執行個體建立的安全群組。

1. 連線到執行個體，並在執行個體上執行下列命令以啟用 iptables。

   ```
   sudo yum install iptables-services -y
   sudo systemctl enable iptables
   sudo systemctl start iptables
   ```

1. 在執行個體上執行下列操作以啟用 IP 轉送，以便在重新開機後持續進行：

   1. 使用 **nano** 或 **vim** 等文字編輯器，建立以下組態檔案：`/etc/sysctl.d/custom-ip-forwarding.conf`。

   1. 將以下行新增至組態檔案。

      ```
      net.ipv4.ip_forward=1
      ```

   1. 儲存組態檔案並關閉文字編輯器。

   1. 執行以下命令，套用組態檔案。

      ```
      sudo sysctl -p /etc/sysctl.d/custom-ip-forwarding.conf
      ```

1. 在執行個體上執行以下命令，並記下主要網路介面的名稱。下一個步驟您將需要這項資訊。

   ```
   netstat -i
   ```

   在下面的範例輸出中，`docker0` 是由 Docker 建立的網絡介面，`eth0` 是主要網路介面，`lo` 是迴路介面。

   ```
   Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
   docker0   1500        0      0      0 0             0      0      0      0 BMU
   eth0      9001  7276052      0      0 0       5364991      0      0      0 BMRU
   lo       65536   538857      0      0 0        538857      0      0      0 LRU
   ```

   在下列範例輸出中，主要網路介面為 `enX0`。

   ```
   Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
   enX0      9001     1076      0      0 0          1247      0      0      0 BMRU
   lo       65536       24      0      0 0            24      0      0      0 LRU
   ```

   在下列範例輸出中，主要網路介面為 `ens5`。

   ```
   Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
   ens5      9001    14036      0      0 0          2116      0      0      0 BMRU
   lo       65536       12      0      0 0            12      0      0      0 LRU
   ```

1. 在執行個體上執行下列命令以設定 NAT。如果主要網路介面不是 `eth0`，則使用您在上一個步驟中記下的主要網路介面來取代 *eth0*。

   ```
   sudo /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
   sudo /sbin/iptables -F FORWARD
   sudo service iptables save
   ```

1. 從 EC2 執行個體建立 NAT AMI。如需詳細資訊，請參閱*《Amazon EC2 使用者指南》*中的[從執行個體建立 Linux AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html#how-to-create-ebs-ami)。

## 4. 啟動 NAT 執行個體
<a name="NATInstance"></a>

按照下列步驟操作，透過您建立的 VPC、安全群組和 NAT AMI 來啟動 NAT 執行個體。

**啟動 NAT 執行個體**

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在儀表板上，選擇**啟動執行個體**。

1. 在**名稱**欄位中輸入 NAT 執行個體名稱。

1. 在**應用程式和作業系統映像**欄位中，選取 NAT AMI (依序選擇**瀏覽更多 AMI**、**我的 AMI**)。

1. 在**執行個體類型**欄位中，選擇提供 NAT 執行個體所需運算、記憶體和儲存資源的執行個體類型。

1. 對於**金鑰對**，請選取現有的金鑰對或**選擇建立新的金鑰對**。

1. 針對 **Network settings** (網路設定)，執行下列操作：

   1. 選擇**編輯**。

   1. 在 **VPC** 欄位選擇您建立的 VPC。

   1. 對於**子網路**，請選擇先前建立的公有子網路。

   1. 在 **Auto-assign public IP ** (自動指派公有 IP) 中，選擇 **Enable** (啟用)。此外，也可在啟動 NAT 執行個體之後，配置彈性 IP 地址並將其指派給 NAT 執行個體。

   1. 對於**防火牆**，請選擇**選取現有的安全群組**，然後選擇先前建立的安全群組。

1. 選擇**啟動執行個體**。選擇執行個體 ID 以開啟執行個體詳細資訊頁面。等待執行個體狀態變更為**執行中**，並等待狀態檢查成功。

1. 停用 NAT 執行個體的來源/目的地檢查 (請參閱 [5. 停用來源/目標檢查](#EIP_Disable_SrcDestCheck))。

1. 更新路由表以將流量傳送至 NAT 執行個體 (請參閱 [6. 更新路由表](#nat-routing-table))。

## 5. 停用來源/目標檢查
<a name="EIP_Disable_SrcDestCheck"></a>

每個 EC2 執行個體預設都會執行來源/目標檢查。這表示執行個體必須是其傳送或接收流量的來源或目標。但當它本身不是來源或目標時，NAT 執行個體必須能夠傳送並接收流量。因此，您必須停用 NAT 執行個體的來源/目標檢查。

**停用來源/目的地檢查**

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在導覽窗格中，選擇**執行個體**。

1. 選取 NAT 執行個體。

1. 選擇**動作**、**聯網**、**變更來源/目的地檢查**。

1. 在**來源/目的地檢查**欄位中選取**停止**。

1. 選擇 **Save** (儲存)。

1. 如果 NAT 執行個體具有次要網路介面，請從 **Networking** (聯網) 索引標籤的 **Network interfaces** (網路介面) 對其進行選擇。選擇界面 ID 以移至網路界面頁面。選擇 **Actions** (動作)、**Change source/dest. check** (變更來源/目標檢查)，清除 **Enable** (啟用)，選擇 **Save** (儲存)。

## 6. 更新路由表
<a name="nat-routing-table"></a>

私有子網路的路由表必須具有路由，能將網際網路的流量傳送至 NAT 執行個體。

**更新路由表**

1. 在 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 開啟 Amazon VPC 主控台。

1. 在導覽窗格中，選擇 **Route tables** (路由表)。

1. 選取私有子網路的路由表。

1. 在**路由**標籤上，選擇**編輯路由**，然後選擇**新增路由**。

1. 在**目的地**欄位中輸入 0.0.0.0/0，在**目標**欄位中輸入 NAT 執行個體的執行個體 ID。

1. 選擇**儲存變更**。

如需詳細資訊，請參閱[設定路由表](VPC_Route_Tables.md)。

## 7. 測試 NAT 執行個體
<a name="nat-test-configuration"></a>

在啟動 NAT 執行個體並完成上述設定步驟後，您就可以執行測試，檢查私有子網路中的執行個體是否可以將 NAT 執行個體作為堡壘伺服器使用，透過 NAT 執行個體存取網際網路。

**Topics**
+ [步驟 1：更新 NAT 執行個體安全群組](#nat-test-security)
+ [步驟 2：在私有子網路中啟動測試執行個體](#nat-test-launch-instance)
+ [步驟 3：Ping 到啟用 ICMP 的網站](#nat-test-ping)
+ [步驟 4：清理](#nat-test-clean-up)

### 步驟 1：更新 NAT 執行個體安全群組
<a name="nat-test-security"></a>

若要允許私有子網路中的執行個體傳送 ping 流量至 NAT 執行個體，請新增規則以允許傳入和傳出 ICMP 流量。若要允許 NAT 執行個體做為堡壘伺服器，請新增規則以允許傳出 SSH 流量至私有子網路。

**更新您的 NAT 執行個體安全群組**

1. 在 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 開啟 Amazon VPC 主控台。

1. 在導覽窗格中，選擇**安全群組**。

1. 選取與 NAT 執行個體關聯之安全群組的核取方塊。

1. 在**傳入規則**索引標籤上，選擇**編輯傳入規則**。

1. 選擇 **Add rule** (新增規則)。選擇 **Type** (類型) 的 **All ICMP - IPv4** (所有 ICMP - IPv4)。在**來源**欄位中選擇**自訂**，然後輸入私有子網路的 IP 地址範圍。選擇**儲存規則**。

1. 在**傳出規則**標籤上，選擇**編輯傳出規則**。

1. 選擇 **Add rule** (新增規則)。選擇 **Type** (類型) 的 **SSH**。在**目的地**欄位中選擇**自訂**，然後輸入私有子網路的 IP 地址範圍。

1. 選擇 **Add rule** (新增規則)。選擇 **Type** (類型) 的 **All ICMP - IPv4** (所有 ICMP - IPv4)。對於 **Destination** (目的地) 選擇 **Anywhere - IPv4** (隨處 - IPv4)。選擇**儲存規則**。

### 步驟 2：在私有子網路中啟動測試執行個體
<a name="nat-test-launch-instance"></a>

在您的私有子網路中啟動執行個體。您必須允許來自 NAT 執行個體的 SSH 存取，而且必須使用您用於 NAT 執行個體的相同金鑰對。

**在私有子網路中啟動測試執行個體**

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在儀表板上，選擇**啟動執行個體**。

1. 選取您的私有子網路。

1. 請勿將公有 IP 地址指派給此執行個體。

1. 務必確保此執行個體的安全群組允許來自 NAT 執行個體或公有子網路 IP 地址範圍的傳入 SSH 存取，以及傳出 ICMP 流量。

1. 選取用於 NAT 執行個體的相同金鑰對。

### 步驟 3：Ping 到啟用 ICMP 的網站
<a name="nat-test-ping"></a>

若要確認私有子網路中的執行個體是否可以使用 NAT 執行個體與網際網路通訊，請執行 **ping** 命令。

**測試來自私有執行個體的網際網路連線**

1. 從您的本機電腦設定 SSH 代理程式轉送，讓您可以使用 NAT 執行個體作為堡壘伺服器。

------
#### [ Linux and macOS ]

   ```
   ssh-add key.pem
   ```

------
#### [ Windows ]

   [下載並安裝 Pageant](https://www.chiark.greenend.org.uk/~sgtatham/putty/) (如果尚未安裝)。

   [使用 PuTTYgen 轉換私有金鑰](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-linux-inst-from-windows.html#putty-private-key)。

   啟動 Pageant，在任務列的 **Pageant** 圖示 (可能隱藏) 上按一下滑鼠右鍵，然後選擇 **Add Key** (新增金鑰)。選取您建立的 .ppk 檔案，如需要，則輸入密碼短語，然後選擇 **Open** (開啟)。

------

1. 從本機電腦連線到 NAT 執行個體。

------
#### [ Linux and macOS ]

   ```
   ssh -A ec2-user@nat-instance-public-ip-address
   ```

------
#### [ Windows ]

   使用 PuTTY 連線到 NAT 執行個體 針對 **Auth** (驗證)，您必須選取 **Allow agent forwarding** (允許代理程式轉送)，並將 **Private key file for authentication** (要驗證的私有金鑰檔案) 留空。

------

1. 在 NAT 執行個體中，執行 **ping** 命令，並指定啟用 ICMP 的網站。

   ```
   [ec2-user@ip-10-0-4-184]$ ping ietf.org
   ```

   若要確認您的 NAT 執行個體可以存取網際網路，請確認您收到如下的輸出，然後按 **Ctrl\$1C** 以取消 **ping** 命令。否則，請確認 NAT 執行個體位於公有子網路中 (其路由表具有通往網際網路閘道的路由)。

   ```
   PING ietf.org (104.16.45.99) 56(84) bytes of data.
   64 bytes from 104.16.45.99 (104.16.45.99): icmp_seq=1 ttl=33 time=7.88 ms
   64 bytes from 104.16.45.99 (104.16.45.99): icmp_seq=2 ttl=33 time=8.09 ms
   64 bytes from 104.16.45.99 (104.16.45.99): icmp_seq=3 ttl=33 time=7.97 ms
   ...
   ```

1. 從您的 NAT 執行個體，使用其私有 IP 地址連線到您私有子網路中的執行個體。

   ```
   [ec2-user@ip-10-0-4-184]$ ssh ec2-user@private-server-private-ip-address
   ```

1. 從您的私有執行個體執行 **ping** 命令，測試能否連線到網際網路。

   ```
   [ec2-user@ip-10-0-135-25]$ ping ietf.org
   ```

   若要確認您的私有執行個體可以透過 NAT 執行個體存取網際網路，請確認您收到如下的輸出，然後按 **Ctrl\$1C** 以取消 **ping** 命令。

   ```
   PING ietf.org (104.16.45.99) 56(84) bytes of data.
   64 bytes from 104.16.45.99 (104.16.45.99): icmp_seq=1 ttl=33 time=8.76 ms
   64 bytes from 104.16.45.99 (104.16.45.99): icmp_seq=2 ttl=33 time=8.26 ms
   64 bytes from 104.16.45.99 (104.16.45.99): icmp_seq=3 ttl=33 time=8.27 ms
   ...
   ```

**疑難排解**

如果從私有子網路中的伺服器執行 **ping** 命令失敗，請使用下列步驟對問題進行故障診斷：
+ 確認您是否已對啟用了 ICMP 的網站執行 Ping 動作。若未執行，伺服器則無法接收回覆封包。若要測試此作業，請從您電腦的命令列終端機執行相同的 **ping** 命令。
+ 確認 NAT 執行個體的安全群組是否允許來自您私有子網路的傳入 ICMP 流量。如不允許，您的 NAT 執行個體無法接收私有執行個體的 **ping** 命令。
+ 確認您是否已停用 NAT 執行個體的來源/目的地檢查。如需詳細資訊，請參閱[5. 停用來源/目標檢查](#EIP_Disable_SrcDestCheck)。
+ 確認您是否已正確設定路由表。如需詳細資訊，請參閱[6. 更新路由表](#nat-routing-table)。

### 步驟 4：清理
<a name="nat-test-clean-up"></a>

如果私有子網路中不再需要測試伺服器，請終止該執行個體，這樣您就不再需要支付該執行個體的費用。如需詳細資訊，請參閱*《Amazon EC2 使用者指南》*中的[終止您的執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html)。

如果您不再需要 NAT 執行個體，您可以停止或終止該執行個體，這樣您就不再需要支付該執行個體的費用。如果您已建立 NAT AMI，則可以在需要時建立新的 NAT 執行個體。