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

如果我查看目标组下的运行状况检查,它会将所有三个私有子网中的所有实例都显示为运行状况良好。 除非我遗漏了什么,否则根据文档 referenced above,负载均衡器实际上可以连接到私有子网。

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"
          
        ]
      
    

子网AppServerSubnetAZ0AppServerSubnetAZ1AppServerSubnetAZ2 是私有子网,其路由指向前面所述的 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 网关

AWS ECS:VPC 终端节点和 NAT 网关

通过 VPC 将 AWS *** NAT 到 AWS IOT

aws lambda函数调用内部负载均衡器

AWS VPC - 通过堡垒主机访问在私有子网中运行的 webapp