我想详细说明@vahdet 的答案。我试图协调 NAT 网关应该如何同时位于公共子网和私有子网中,但我却失去了理智。看起来像是AWS官方文档here https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/错了,但当然不是。我和其他人都忽略了一个非常微妙的细节。
NAT 网关必须同时跨两个不同的子网进行“热连线”,以便将私有地址桥接到面向互联网的公共地址。
首先,我尝试将 NAT 网关放在与 IGW 相同的路由表中,但这当然行不通,因为您不能有两条具有不同目标的相同路由 (0.0.0.0/0)。
该指南说将 NAT 网关放入专用网络的路由表中,我照做了,但这似乎不起作用。
我遗漏的关键细节是 NAT 网关必须是创建于公共子网。文档实际上是这么说的,但这似乎令人困惑,因为我们后来被告知将route对于 NAT 网关私人餐桌.
这两件事都是真的。在中创建 NAT 网关公有子网然后只添加一个路由表条目 in the 私有路由表.
文档告诉您在VPC中创建以下网络资源:
- 两个新子网
- 两个新的路由表
- 一个新的 NAT 网关
我已经有了一个路由表和一些子网,所以我尝试只添加一个新子网和一个新路由表,这就是我遇到麻烦的地方。按照记录,每个创建两个确实更好。
对于我来说,子网是这样的:
subnet-public 10.8.9.0/24 us-east-1a
subnet-private 10.8.8.0/24 us-east-1a
Then createNAT 网关在子网公共。
它将等待几分钟,这很重要,因为它必须进入可用状态才能在路由表条目中引用。
以下是路由表:
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 网关与私有子网中的其他所有内容一样隔离,并且无法将流量路由到 Internet。一定是created在公共子网中才能访问互联网,因为它必须拥有公共子网内的 IP 地址。我的 NAT 网关的内部 IP 地址为10.8.9.127以及 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。由于它位于具有 Internet 网关的路由表中的公有子网中,因此外部 IP 具有通往 Internet 的清晰路径。
现在我的私有 VPC lambda 位于子网专用已通过 NAT 网关验证互联网访问。