

# NAT 网关使用案例
<a name="nat-gateway-scenarios"></a>

以下是公有和私有 NAT 网关的使用案例示例。

**Topics**
+ [从私有子网访问互联网](#public-nat-internet-access)
+ [从允许列出的 IP 地址访问您的网络](#private-nat-allowed-range)
+ [实现重叠网络之间的通信](#private-nat-overlapping-networks)

## 从私有子网访问互联网
<a name="public-nat-internet-access"></a>

您可以使用公有 NAT 网关，以启用私有子网中的实例，将出站流量发送到互联网，同时防止互联网与这些实例建立连接。

**Topics**
+ [概述](#public-nat-gateway-overview)
+ [路由](#public-nat-gateway-routing)
+ [测试公有 NAT 网关](#public-nat-gateway-testing)

### 概述
<a name="public-nat-gateway-overview"></a>

下图阐明了此使用案例。有两个可用区，每个可用区都有两个子网。每个子网的路由表都决定了流量的路由方式。在可用区 A 中，公有子网中的实例可以通过到互联网网关的路由访问互联网，而私有子网中的实例没有到互联网的路由。在可用区 B 中，公有子网包含一个 NAT 网关，私有子网中的实例可以通过到公有子网中的 NAT 网关的路由来访问互联网。私有和公有 NAT 网关都会将实例的源私有 IPv4 地址映射到私有 NAT 网关的私有 IPv4 地址，但是对于公有 NAT 网关，互联网网关随后会将公有 NAT 网关的私有 IPv4 地址映射到与 NAT 网关关联的弹性 IP 地址。将响应流量发送到实例时，无论是使用公有还是私有 NAT 网关，NAT 网关都会将地址转换回原始源 IP 地址。

![具有公有和私有子网、NAT 网关和互联网网关的 VPC。](http://docs.amazonaws.cn/vpc/latest/userguide/images/public-nat-gateway-diagram.png)


请注意，如果可用区 A 中私有子网内的实例也需要访问互联网，您可以创建从该子网到可用区 B 中 NAT 网关的路由。或者，您也可以在包含需要访问互联网的资源的每个可用区创建一个 NAT 网关来提高故障恢复能力。有关示例图，请参见 [示例：在私有子网中部署服务器并且具有 NAT 中的 VPC](vpc-example-private-subnets-nat.md)。

### 路由
<a name="public-nat-gateway-routing"></a>

以下是可用区 A 中与公有子网关联的路由表。第一个条目是本地路由；它使子网中的实例能够使用私有 IP 地址与 VPC 中的其他实例进行通信。第二个条目将所有其他子网流量发送到互联网网关，从而使子网中的实例能够访问互联网。


| 目标位置 | Target | 
| --- | --- | 
| {{VPC CIDR}} | 本地 | 
| 0.0.0.0/0 | {{internet-gateway-id}} | 

以下是可用区 A 中与私有子网关联的路由表。该条目是本地路由，它使子网中的实例能够使用私有 IP 地址与 VPC 中的其他实例进行通信。此子网中的实例无法访问互联网。


| 目标位置 | Target | 
| --- | --- | 
| {{VPC CIDR}} | 本地 | 

以下是可用区 B 中与公有子网关联的路由表。第一个条目是本地路由，它使子网中的实例能够使用私有 IP 地址与 VPC 中的其他实例进行通信。第二个条目将所有其他子网流量发送到互联网网关，从而使子网中的 NAT 网关能够访问互联网。


| 目标位置 | Target | 
| --- | --- | 
| {{VPC CIDR}} | 本地 | 
| 0.0.0.0/0 | {{internet-gateway-id}} | 

以下是可用区 B 中与私有子网关联的路由表。第一个条目是本地路由；它使子网中的实例能够使用私有 IP 地址与 VPC 中的其他实例进行通信。第二个条目将所有其他子网流量发送到 NAT 网关。


| 目标位置 | Target | 
| --- | --- | 
| {{VPC CIDR}} | 本地 | 
| 0.0.0.0/0 | {{nat-gateway-id}} | 

有关更多信息，请参阅 [管理子网路由表](WorkWithRouteTables.md)。

### 测试公有 NAT 网关
<a name="public-nat-gateway-testing"></a>

创建 NAT 网关并更新路由表之后，您可以从私有子网中的实例对互联网 ping 一些远程地址以测试它是否可以连接到互联网。有关如何执行此操作的示例，请参阅 [测试互联网连接](#nat-gateway-testing-example)。

如果能够连接到互联网，还可以测试互联网流量是否通过 NAT 网关进行路由：
+ 跟踪来自私有子网中实例的流量的路由情况。为此，请从私有子网中的 Linux 实例运行 `traceroute` 命令。在输出中，应在一个跃点（通常是第一个跃点）中看到 NAT 网关的私有 IP 地址。
+ 从私有子网中的实例连接第三方网站或工具时，查看该网站或工具显示的源 IP 地址。源 IP 地址应是 NAT 网关的弹性 IP 地址。

如果这些测试失败，请参阅 [排查 NAT 网关的问题](nat-gateway-troubleshooting.md)。

#### 测试互联网连接
<a name="nat-gateway-testing-example"></a>

以下示例演示如何测试私有子网中的实例是否可以连接到互联网。

1. 在公有子网中启动实例（您使用此实例作为堡垒主机）。在启动向导中，确保选择一个 Amazon Linux AMI，并为实例分配公有 IP 地址。确保安全组规则允许来自本地网络的 IP 地址范围的入站 SSH 流量，以及发送到私有子网的 IP 地址范围的出站 SSH 流量（您也可以同时对入站和出站 SSH 流量使用 `0.0.0.0/0` 进行测试）。

1. 在您的私有子网中启动实例。在启动向导中，确保选择一个 Amazon Linux AMI。请勿向实例分配公有 IP 地址。应确保安全组规则允许来自在公有子网中启动的实例的私有 IP 地址的入站 SSH 流量以及所有出站 ICMP 流量。必须选择用于在公有子网中启动实例的相同密钥对。

1. 在本地计算机上配置 SSH 代理转发，并连接到公有子网中的堡垒主机。有关更多信息，请参阅 [为 Linux 或 macOS 配置 SSH 代理转发](#ssh-forwarding-linux) 或 [针对 Windows 配置 SSH 代理转发](#ssh-forwarding-windows)。

1. 在堡垒主机中，连接到私有子网中的实例，然后从私有子网中的实例测试 Internet 连接。有关更多信息，请参阅 [测试 Internet 连接](#test-internet-connection)。<a name="ssh-forwarding-linux"></a>

**为 Linux 或 macOS 配置 SSH 代理转发**

1. 在您的本地计算机上，将私有秘钥添加到身份验证代理。

   对于 Linux，请使用以下命令。

   ```
   ssh-add -c mykeypair.pem
   ```

   对于 macOS，请使用以下命令。

   ```
   ssh-add -K mykeypair.pem
   ```

1. 通过使用 `-A` 选项启用 SSH 代理转发来连接到公有子网中的实例，并使用该实例的公有地址，如以下示例所示。

   ```
   ssh -A ec2-user@{{54.0.0.123}}
   ```<a name="ssh-forwarding-windows"></a>

**针对 Windows 配置 SSH 代理转发**  
您可以使用 Windows 中提供的 OpenSSH 客户端，也可以安装您的首选 SSH 客户端（例如 PuTTY）。

------
#### [ OpenSSH ]

按照 [Getting started with OpenSSH for Windows](https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse) 一文中的说明，安装适用于 Windows 的 OpenSSH。然后将密钥添加到身份验证代理。有关更多信息，请参阅 [Key-based authentication in OpenSSH for Windows](https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement)。

------
#### [ PuTTY ]

1. 如果尚未安装 Pageant，请从 [PuTTY 下载页面](https://www.chiark.greenend.org.uk/~sgtatham/putty/)下载并安装 Pageant。

1. 将您的私有密钥转换为 .ppk 格式。有关更多信息，请参阅《*Amazon EC2 用户指南*》中的[使用 PuTTYgen 转换私有密钥](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/connect-linux-inst-from-windows.html#putty-private-key)。

1. 启动 Pageant，右键单击任务栏上的 Pageant 图标（可能已隐藏），并选择 **Add Key**（添加）。选择您创建的 .ppk 文件，输入密码（如果需要），然后选择 **Open**（打开）。

1. 启动 PuTTY 会话，并使用公有 IP 地址连接到公有子网中的实例。有关更多信息，请参阅[使用 PuTTY 连接到 Linux 实例](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/connect-linux-inst-from-windows.html)。在 **Auth** 类别中，确保选中 **Allow agent forwarding**（允许代理转发）选项，并将 **Private key file for authentication**（用于验证的私有密钥文件）框留空。

------<a name="test-internet-connection"></a>

**测试 Internet 连接**

1. 从公有子网中的实例，使用私有 IP 地址连接到私有子网中的实例，如以下示例所示。

   ```
   ssh ec2-user@{{10.0.1.123}}
   ```

1. 从私有实例，通过对启用了 ICMP 的网站运行 `ping` 命令来测试是否可以连接到 Internet。

   ```
   ping ietf.org
   ```

   ```
   PING ietf.org (4.31.198.44) 56(84) bytes of data.
   64 bytes from mail.ietf.org (4.31.198.44): icmp_seq=1 ttl=47 time=86.0 ms
   64 bytes from mail.ietf.org (4.31.198.44): icmp_seq=2 ttl=47 time=75.6 ms
   ...
   ```

   按键盘上的 **Ctrl\+C** 以取消 `ping` 命令。如果 `ping` 命令失败，请参阅 [实例无法访问 Internet](nat-gateway-troubleshooting.md#nat-gateway-troubleshooting-no-internet-connection)。

1. （可选）如果您不再需要实例，请将其终止。有关更多信息，请参阅《Amazon EC2 用户指南》中的 [终止实例](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/terminating-instances.html)**。

## 从允许列出的 IP 地址访问您的网络
<a name="private-nat-allowed-range"></a>

您可以通过私有 NAT 网关，使用允许列出的地址池来实现 VPC 与本地网络的通信。您可以通过私有 NAT 网关（具有来自允许列出的 IP 地址范围的 IP 地址）来路由发往本地网络的子网中的流量，而不是为每个实例分配一个来自允许列出的 IP 地址范围的单独 IP 地址。

**Topics**
+ [概述](#private-nat-allowed-range-overview)
+ [资源](#private-nat-allowed-range-resources)
+ [路由](#private-nat-allowed-range-routing)

### 概述
<a name="private-nat-allowed-range-overview"></a>

下图显示了实例如何通过 Amazon VPN 访问本地资源。来自实例的流量通过 VPN 连接路由到虚拟私有网关，到达客户网关，然后到达本地网络中的目标。但是，假设目标仅允许来自特定 IP 地址范围（例如 100.64.1.0/28）的流量。这可防止来自这些实例的流量到达本地网络。

![使用 Amazon VPN 连接访问本地网络。](http://docs.amazonaws.cn/vpc/latest/userguide/images/allowed-range.png)


下表展示了此场景配置的主要组成部分。VPC 具有原始 IP 地址范围和允许的 IP 地址范围。VPC 有一个来自允许的 IP 地址范围的子网和一个私有 NAT 网关。来自实例的发往本地网络的流量会先发送到 NAT 网关，然后再路由到 VPN 连接。本地网络接收来自具有 NAT 网关源 IP 地址的实例的流量，该地址来自允许的 IP 地址范围。

![使用私有 NAT 网关路由的 VPC 子网流量](http://docs.amazonaws.cn/vpc/latest/userguide/images/private-nat-allowed-range.png)


### 资源
<a name="private-nat-allowed-range-resources"></a>

按如下方式创建或更新资源：
+ 将允许的 IP 地址范围与 VPC 关联。
+ 在 VPC 中从允许的 IP 地址范围创建子网。
+ 在新子网中创建私有 NAT 网关。
+ 使用实例更新子网的路由表，以将发往本地网络的流量发送到 NAT 网关。将路由添加到具有私有 NAT 网关的子网的路由表，该网关会将发往本地网络的流量发送到虚拟私有网关。

### 路由
<a name="private-nat-allowed-range-routing"></a>

以下是与第一个子网关联的路由表。每个 VPC CIDR 都有一个本地路由。本地路由使子网中的资源能够使用私有 IP 地址与 VPC 中的其他资源进行通信。第三个条目会将发往本地网络的流量发送到私有 NAT 网关。


| 目标位置 | 目标 | 
| --- | --- | 
| {{10.0.0.0/16}} | 本地 | 
| {{100.64.1.0/24}} | 本地 | 
| {{192.168.0.0/16}} | {{nat-gateway-id}} | 

以下是与第二个子网关联的路由表。每个 VPC CIDR 都有一个本地路由。本地路由使子网中的资源能够使用私有 IP 地址与 VPC 中的其他资源进行通信。第三个条目会将发往本地网络的流量发送到虚拟私有网关。


| 目标位置 | 目标 | 
| --- | --- | 
| {{10.0.0.0/16}} | 本地 | 
| {{100.64.1.0/24}} | 本地 | 
| {{192.168.0.0/16}} | {{vgw-id}} | 

## 实现重叠网络之间的通信
<a name="private-nat-overlapping-networks"></a>

即使网络具有重叠的 CIDR 范围，也可以使用私有 NAT 网关来启用网络之间的通信。例如，假设 VPC A 中的实例需要访问 VPC B 中的实例提供的服务。

![具有重叠 CIDR 范围的两个 VPC。](http://docs.amazonaws.cn/vpc/latest/userguide/images/overlapping-networks.png)


**Topics**
+ [概述](#private-nat-overlapping-networks-overview)
+ [资源](#private-nat-overlapping-networks-resources)
+ [路由](#private-nat-overlapping-networks-routing)

### 概述
<a name="private-nat-overlapping-networks-overview"></a>

下表展示了此场景配置的主要组成部分。首先，您的 IP 管理团队需要确定哪些地址范围可以重叠（不可路由的地址范围），哪些地址范围不能重叠（可路由的地址范围）。IP 管理团队根据请求将可路由地址范围池中的地址范围分配给项目。

每个 VPC 都有其原始 IP 地址范围（不可路由）以及由 IP 管理团队分配给它的可路由 IP 地址范围。VPC A 有一个来自可路由范围的子网和一个私有 NAT 网关。私有 NAT 网关从其子网获取其 IP 地址。VPC B 有一个来自可路由范围的子网和一个应用程序负载均衡器。应用程序负载均衡器从其子网获取 IP 地址。

来自 VPC A 的不可路由子网中的实例的流量（将发往 VPC B 的不可路由子网中的实例）通过私有 NAT 网关发送，然后路由到中转网关。中转网关将流量发送到应用程序负载均衡器，后者将流量路由到 VPC B 的不可路由子网中的其中一个目标实例。从中转网关到应用程序负载均衡器的流量具有私有 NAT 网关的源 IP 地址。因此，来自负载均衡器的响应流量使用私有 NAT 网关的地址作为其目的。响应流量将发送到中转网关，然后路由到私有 NAT 网关，该网关会将目标转换为 VPC A 的不可路由子网中的实例。

![具有私有 NAT 网关和中转网关的 VPC，用于实现具有重叠 CIDR 的 VPC 间通信](http://docs.amazonaws.cn/vpc/latest/userguide/images/private-nat-overlapping-networks.png)


### 资源
<a name="private-nat-overlapping-networks-resources"></a>

按如下方式创建或更新资源：
+ 将分配的可路由 IP 地址范围与各自的 VPC 关联。
+ 在 VPC A 中从可路由的 IP 地址范围创建子网，然后在此新子网中创建私有 NAT 网关。
+ 在 VPC B 中从可路由的 IP 地址范围创建子网，然后在此新子网中创建应用程序负载均衡器。将不可路由子网中的实例注册到负载均衡器的目标组。
+ 创建中转网关以连接 VPC。确保禁用路由传播。将每个 VPC 连接到中转网关时，请使用 VPC 的可路由地址范围。
+ 更新 VPC A 中不可路由子网的路由表，以将发往 VPC B 的可路由地址范围的所有流量发送到私有 NAT 网关。更新 VPC A 中可路由子网的路由表，以将发往 VPC B 的可路由地址范围的所有流量发送到中转网关。
+ 更新 VPC B 中可路由子网的路由表，以将发往 VPC A 的可路由地址范围的所有流量发送到中转网关。

### 路由
<a name="private-nat-overlapping-networks-routing"></a>

以下是 VPC A 中不可路由子网的路由表。


| 目标位置 | 目标 | 
| --- | --- | 
| {{10.0.0.0/16}} | 本地 | 
| {{100.64.1.0/24}} | 本地 | 
| {{100.64.2.0/24}} | {{nat-gateway-id}} | 

以下是 VPC A 中可路由子网的路由表。


| 目标位置 | 目标 | 
| --- | --- | 
| {{10.0.0.0/16}} | 本地 | 
| {{100.64.1.0/24}} | 本地 | 
| {{100.64.2.0/24}} | {{transit-gateway-id}} | 

以下是 VPC B 中不可路由子网的路由表。


| 目标位置 | 目标 | 
| --- | --- | 
| {{10.0.0.0/16}} | 本地 | 
| {{100.64.2.0/24}} | 本地 | 

以下是 VPC B 中可路由子网的路由表。


| 目标位置 | 目标 | 
| --- | --- | 
| {{10.0.0.0/16}} | 本地 | 
| {{100.64.2.0/24}} | 本地 | 
| {{100.64.1.0/24}} | {{transit-gateway-id}} | 

以下是中转网关路由表。


| CIDR | 附件 | 路由类型 | 
| --- | --- | --- | 
| {{100.64.1.0/24}} | {{VPC A 的连接}} | 静态 | 
| {{100.64.2.0/24}} | {{VPC B 的连接}} | 静态 | 