我想详细说明@vahdet 的答案。试图协调 NAT 网关应该如何同时位于公共子网和私有子网中的方式让我失去了理智。似乎官方 AWS 文档 here 是错误的,但当然不是。我和其他人都错过了一个非常微妙的细节。
NAT 网关必须同时跨两个不同的子网“热连线”,以便将私有地址桥接到面向互联网的公共地址。
首先,我尝试将 NAT 网关与 IGW 放在同一个路由表中,但这当然行不通,因为您不能有两个具有不同目标的相同路由 (0.0.0.0/0)。
指南说要将 NAT 网关放在专用网络的路由表中,我这样做了,但似乎没有用。
我遗漏的关键细节是 NAT 网关必须在公共子网中创建。文档实际上是这么说的,但它似乎令人困惑,因为后来我们被告知将 NAT 网关的 路由 放在 private table 中。
这两件事都是真的。在公有子网中创建NAT网关,然后在私有路由表中只添加一个路由表条目。
文档告诉您在 VPC 中创建以下网络资源:
- 两个新子网
- 两个新的路由表
- 一个新的 NAT 网关
我已经有一个路由表和一些子网,所以我尝试只添加一个新子网和一个新路由表,这就是我遇到麻烦的地方。最好按照文档创建两个。
这是子网对我来说的样子:
subnet-public 10.8.9.0/24 us-east-1a
subnet-private 10.8.8.0/24 us-east-1a
然后在 subnet-public 中创建 NAT 网关。
它将等待几分钟,这很重要,因为它必须进入可用状态才能在路由表条目中被引用。
这里是路由表:
route-table-public
10.8.0.0/16 local
0.0.0.0/0 igw-xyz
subnet-association: subnet-public
route-table-private
10.8.0.0/16 local
0.0.0.0/0 nat-abc
subnet-association: subnet-private
你看到那里发生了什么吗?这真的很微妙。 NAT 网关是交叉连接的。它“存在”在创建它的公共子网中,但私有子网中的所有流量都被路由到它。
如果您像我一开始那样在私有子网中创建 NAT 网关,那么 NAT 网关与私有子网中的其他所有东西一样隔离,并且无法将流量路由到互联网。它必须在公共子网中创建才能访问互联网,因为它必须在公共子网中有一个 IP 地址。我的 NAT 网关获得了 10.8.9.127 的内部 IP 和 54.X.X.X 范围内的外部 IP。
通过使 NAT 网关成为私有路由表中的 0.0.0.0/0 路由,我们告诉所有非 10.8.0.0/16 流量直接进入 NAT 网关,即使它不是实际上在私有子网内。
VPC 本身知道如何跨自己的子网桥接流量,并且能够将 10.8.8.X 流量发送到 NAT 网关的 10.8.9.X IP。然后,它充当桥接器,并将通过其内部 IP 的所有流量转换为其外部 IP。因为它位于带有互联网网关的路由表中的公共子网中,所以外部 IP 具有通往互联网的清晰路径。
现在我在 subnet-private 中的私有 VPC lambda 已通过 NAT 网关验证了互联网访问。