AWS ELB允许VPC公网IPv4但不支持安全组的预期行为确认
同一AWS账号VPC内EC2通过安全组访问ELB的预期行为解析
让我帮你理清这个场景下的预期结果和背后的AWS安全组逻辑:
当你完成第四步(移除EC2-B的公网IP规则,添加EC2-B的安全组sg-xxxxxx到ELB-A的入站规则)后,请求是否成功取决于你的ELB-A是公网型还是内网型:
情况1:ELB-A是公网型负载均衡(ALB/NLB/CLB公网模式)
此时从EC2-B发起的wget请求会失败,原因如下:
- 公网ELB的DNS解析结果是其公网IP,EC2-B在VPC内访问该公网IP时,默认会使用自身的公网IP作为请求源IP(这是VPC的默认路由行为,流量会走互联网网关出站再返回)。
- AWS安全组的入站规则中,当你指定另一个安全组(比如
sg-xxxxxx)时,它只会匹配来自该安全组内实例的私有IP流量,而不是公网IP。所以EC2-B的公网IP源流量不会被这个安全组规则放行,请求被ELB-A的安全组拦截。
情况2:ELB-A是内网型负载均衡(ALB/NLB内网模式)
此时从EC2-B发起的wget请求会成功,原因很直接:
- 内网ELB仅在VPC内可见,EC2-B访问它时会使用自身的私有IP作为请求源IP,而这个IP属于
sg-xxxxxx安全组覆盖的实例范围,ELB-A的入站规则会匹配该流量,允许请求通过。
补充:如何让公网ELB也支持安全组规则匹配?
如果你必须使用公网ELB,同时想用安全组控制EC2-B的访问,可以这么做:
- 直接让EC2-B通过ELB-A的私有IP发起请求(公网ELB也会分配VPC内的私有IP),此时请求源IP是EC2-B的私有IP,会被
sg-xxxxxx的安全组规则匹配。 - 或者在ELB-A的入站规则中,允许EC2-B所在VPC的私有IP段(比如
10.0.0.0/16),但这个范围比单个安全组更大,需要根据你的安全需求权衡。
内容的提问来源于stack exchange,提问作者art vanderlay




