AWS VPC:将 NAT 和 Internet 网关与负载均衡器和私有子网一起使用时的奇怪行为
Posted
技术标签:
【中文标题】AWS VPC:将 NAT 和 Internet 网关与负载均衡器和私有子网一起使用时的奇怪行为【英文标题】:AWS VPC: Strange Behaviour when using NAT and Internet Gateway with Load Balancer and Private Subnets 【发布时间】:2017-01-24 02:45:50 【问题描述】:考虑以下基于this document 的设置:
具有四个子网的 AWS VPC。一个公共和三个私有(每个可用区一个) VPC 连接了一个 Internet 网关。 公有子网 (10.0.1.0/24) 有一个弹性负载均衡器 (V2)、一个 NAT 网关和一个用于 SSH 进入环境的堡垒服务器。该子网的路由表定义为:
10.0.0.0/16 -> local
0.0.0.0/0 -> igw-67e14203 (Internet Gateway)
三个私有子网(在每个可用区中)附有以下路由表:
10.0.0.0/16 -> local
0.0.0.0/0 -> igw-67e14203
通过上述设置,负载均衡器可以完美运行,我可以从公共 Internet 访问 Web 服务器 URL 和应用程序。但是,通过此设置,私有子网 (10.0.2.0/24,10.0.3.0/24,10.0.4.0/24) 中的服务器无法访问本地网络之外的任何内容 - 甚至 AWS yum 存储库也无法访问。
当我将私有子网的路由表更改为:
10.0.0.0/16 -> local
0.0.0.0/0 -> nat-0a71345c417d7758a
ELB的配置如下:
"AppServerLoadBalancer":
"Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
"Properties":
"Scheme": "internet-facing",
"Tags": [
"Key": "environment",
"Value":
"Ref": "Environment"
],
"SecurityGroups": [
"Ref": "LoadBalancerSecurityGroup"
],
"Subnets": [
"Ref": "AppServerSubnetAZ0"
,
"Ref": "AppServerSubnetAZ1"
,
"Ref": "AppServerSubnetAZ2"
]
子网AppServerSubnetAZ0
、AppServerSubnetAZ1
和AppServerSubnetAZ2
是私有子网,其路由指向前面所述的 NAT 网关。
私有子网中的实例可以访问外部 Internet,但随后 LoadBalancer 停止工作。我开始在负载平衡器上超时。
网络ACL设置正确,上述两种情况唯一的变化是路由表的变化。
只是似乎无法弄清楚出了什么问题?我会假设 NAT 网关会负责路由负载均衡器流量以及上面的文章/链接?
感谢您的帮助!
【问题讨论】:
您是否将私有子网 EC2 附加到 ELB? 您好,感谢您的快速回复。是的,带有到 NAT 网关的路由的私有子网。已使用相关详细信息更新了帖子。 【参考方案1】:我不知道让 NAT 网关和 ELB 同时为私有子网中的 EC2 实例工作的可行性。
我建议你的一个解决方法是保留你的路由表
10.0.0.0/16 -> local
0.0.0.0/0 -> igw-67e14203 (Internet Gateway)
并使用 EC2 实例而不是 NAT 网关来实现 NAT。
【讨论】:
【参考方案2】:您误解了引用的文档。
负载均衡器必须位于公共子网上,而实例应位于私有子网上。
当私有子网上的路由指向 Internet 网关时,为什么这会起作用?这是一个技巧问题。如果默认路由指向 Internet 网关,则它实际上不再是私有子网。这是一个公共子网。
不要从传统网络的角度来考虑,因为平衡器及其背后的实例通常位于一个公共子网上是有意义的。 VPC 不是这样工作的。跨可用区域内的子网边界的流量没有性能损失,单个子网内的流量也没有性能优势。
【讨论】:
我同意@Michael - sqlbot 的观点,NAT 应该在公共子网中,如果您想从以下位置连接到 Internet,则必须使用 nat id 和目标更新您的私有子网路由表为 0.0.0.0/0您的私有子网。以上是关于AWS VPC:将 NAT 和 Internet 网关与负载均衡器和私有子网一起使用时的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章
VPC 中的 AWS Lambda 在 NAT 之后没有互联网访问权限
AWS Lambda:如何为具有 VPC 访问权限的 lambda 函数设置 NAT 网关