带有互联网网关和NAT网关的AWS VPC路由表

Amazon Web Services中有一个VPC,子网为172.31.0.0/16。 我在这个子网中创build了一个EC2实例,并给它一个公共弹性IP。 这个VPC上有一个互联网网关。 所以,我的路由表如下所示:

172.31.0.0/16 local 0.0.0.0/0 igw-b4ac67d0 

为了解决一些我不能控制的外部服务的IP访问问题,我在这个VPC上添加了一个NAT网关,这样所有到单个外部地址ABCD的stream量都将通过NAT网关进行路由。 也就是说,我希望路由表看起来像这样:

 # GOAL 172.31.0.0/16 local ABCD/32 nat-451b3be9 0.0.0.0/0 igw-b4ac67d0 

但是,尽可能地尝试一下,当我点击“保存”时,AWS界面会切换顺序,以便始终以最终状态结束

 # What AWS gives me 172.31.0.0/16 local 0.0.0.0/0 igw-b4ac67d0 ABCD/32 nat-451b3be9 

这个路由表看起来很愚蠢:NAT网关永远不会被使用,我的stream量到ABCD仍然来自EC2实例的弹性IP。

我如何获得路由表GOAL?

注意:外部服务将允许我添加一个允许访问的IP地址。 如果我只有一个EC2实例,我可以简单地给他们提供EC2实例的弹性IP地址。 但是,我想添加更多的EC2实例设置相同的方式。 因此,NAT网关。 另外,我不能简单地放弃因特网网关,只使用NAT网关,因为我需要EC2实例上的服务,以便外部访问。

这个路由表看起来很愚蠢

是的,在你的解释中……但你的解释是不正确的。 VPC中的路由表条目实际上并没有订单。

最具体的路线总是被选中。

表中的每个路由指定目标CIDR和目标(例如,目标为外部公司networking172.16.0.0/12的stream量是虚拟专用网关的目标)。 我们使用匹配stream量的最具体的路线来确定如何路由stream量。

http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Route_Tables.html

但是,如果NAT网关实际位于使用此路由表的子网上,则configuration仍然不起作用。 NAT网关必须位于其路由表没有任何路由指向NAT网关的子网上 – 否则,这是一个路由循环。 对于互联网,NAT网关使用其实际连接的子网的VPC路由表来访问互联网网关…所以它必须位于具有将要到达的实例的不同子网上使用它,因为这个/32路由不能放在影响来自NAT网关的出站stream量的地方。

这对于不认识到VPCnetworking不是具有路由器的传统以太网networking的人来说是违反直觉的。 整个networking是软件定义的,而不是物理的,所以当stream量跨越可用区域内的子网域时,性能不会受到影响,例如在一个子网上使用NAT网关(或NAT实例)的EC2实例不同的子网或连接到不同子网上的EC2实例的一个子网上的Elastic Load Balancer。 事实上,在这些情况下,从一个子网到另一个子网的stream量是标准configuration,将NAT网关和ELB放置在公共子网(默认路由是IGW)和EC2实例在私有子网(默认路由是NAT设备)上。

进一步注意,你正在尝试的configuration将允许出站,但绝不允许从ABCD地址到该子网上的任何东西的入站连接(从外部发起),因为返回路由是通过NAT网关不对称的。