use*_*042 7 nat amazon-web-services amazon-vpc
我在 Amazon Web Services 中有一个 VPC,子网为 172.31.0.0/16。我在这个子网中创建了一个 EC2 实例,并为其提供了一个公共弹性 IP。此 VPC 上有一个 Internet 网关。所以,我的路由表如下所示:
172.31.0.0/16 local
0.0.0.0/0 igw-b4ac67d0
Run Code Online (Sandbox Code Playgroud)
为了解决我无法控制的外部服务上的一些 IP 访问问题,我向该 VPC 添加了一个 NAT 网关,以便到单个外部地址 ABCD 的所有流量都将通过 NAT 网关路由。也就是说,我希望路由表看起来像这样:
# GOAL
172.31.0.0/16 local
A.B.C.D/32 nat-451b3be9
0.0.0.0/0 igw-b4ac67d0
Run Code Online (Sandbox Code Playgroud)
但是,尽我所能,当我单击“保存”时,AWS 界面会切换顺序,因此我总是以
# What AWS gives me
172.31.0.0/16 local
0.0.0.0/0 igw-b4ac67d0
A.B.C.D/32 nat-451b3be9
Run Code Online (Sandbox Code Playgroud)
这个路由表看起来很傻:NAT 网关永远不会被使用,我的流量A.B.C.D
似乎仍然来自 EC2 实例的弹性 IP。
如何获取路由表 GOAL?
注:外部服务将允许我补充一个单一的IP地址,这将允许访问。如果我只有一个 EC2 实例,我可以简单地向他们提供 EC2 实例的弹性 IP 地址。但是,我想添加多个以相同方式设置的 EC2 实例。因此,NAT 网关。此外,我不能简单地放弃 Internet 网关而只使用 NAT 网关,因为我需要 EC2 实例上的服务可供外部世界访问。
这个路由表看起来很傻
是的,在你对它的解释中……但你的解释是不正确的。VPC 中的路由表条目实际上没有顺序。
始终选择最具体的路线。
表中的每条路由都指定了目标 CIDR 和目标(例如,发往外部公司网络 172.16.0.0/12 的流量的目标是虚拟专用网关)。我们使用与流量匹配的最具体的路由来确定如何路由流量。
http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Route_Tables.html
但是,如果 NAT 网关实际上位于使用此路由表的子网上,您的配置仍然不起作用。NAT 网关必须位于其路由表中没有任何指向 NAT 网关的路由的子网上——否则,这是一个路由循环。对于 Internet,NAT 网关使用它实际连接到的子网的 VPC 路由表来访问 Internet 网关……因此它必须与要访问的实例位于不同的子网上使用它,因为此/32
路由不能放置在它会影响来自 NAT 网关的出站流量的地方。
对于没有意识到 VPC 网络不是带有路由器的传统以太网网络的人来说,这是违反直觉的。整个网络是软件定义的,而不是物理的,因此当流量跨越可用区内的子网边界时不会有性能损失,例如一个子网上的 EC2 实例在一个子网上使用 NAT 网关(或 NAT 实例)不同的子网,或者一个子网上的弹性负载均衡器连接到不同子网上的 EC2 实例。事实上,在这些情况下,从一个子网到另一个子网的流量是标准配置,将 NAT 网关和 ELB 放在公共子网上(默认路由是 IGW),将 EC2 实例放在私有子网上(默认路由是 NAT 设备)。
进一步注意,您尝试的配置将允许出站,但绝不允许从A.B.C.D
地址到此子网上任何内容的入站连接(从外部发起),因为返回路由通过 NAT 网关是非对称的。