具有 Internet 网关和 NAT 网关的 AWS VPC 路由表

具有 Internet 网关和 NAT 网关的 AWS 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    

为了解决我无法控制的外部服务上的一些 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    

然而,尽管我尽力尝试,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

这个路由表看起来很愚蠢:NAT网关永远不会被使用,并且我的流量似乎A.B.C.D仍然来自EC2实例的弹性IP。

如何获取路线表目标?

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

答案1

这个路线表看起来很傻

是的,按照你的理解...但是你的解释并不正确。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 实例),或者一个子网上的 Elastic Load Balancer 连接到另一个子网上的 EC2 实例。事实上,在这些情况下,从一个子网到另一个子网的流量是标准配置,将 NAT 网关和 ELB 放置在公共子网上(默认路由是 IGW),将 EC2 实例放置在私有子网上(默认路由是 NAT 设备)。

还要注意,您尝试的配置将允许出站,但绝不允许从该A.B.C.D地址到该子网上的任何内容的入站连接(从外部发起),因为返回路由通过 NAT 网关是不对称的。

相关内容