配置VPC CIDR安全组规则后同子网NLB无法访问后端实例原因排查
问题根因
该问题是由AWS NLB的默认特性导致:网络负载均衡器(NLB)默认会保留请求的客户端原始源IP。
- 你从公网发起的测试请求经NLB转发到EC2时,请求的源IP仍然是你本地设备的公网IP,不属于VPC的
172.31.0.0/16网段,因此被安全组的入站规则拦截。当你将规则修改为0.0.0.0/0时所有源IP都被放行,请求自然恢复正常。 - NLB的健康检查是负载均衡服务本身使用VPC内网IP发起的,符合
172.31.0.0/16网段规则,因此54321端口的健康检查规则可以正常生效。
解决方案
你可以根据业务需求选择以下两种方案修复:
方案1:关闭NLB的客户端源IP保留
修改NLB目标组配置,关闭源IP保留特性,此时NLB转发请求到EC2时会将源IP替换为自身的VPC内网IP,即可匹配现有安全组的VPC网段规则。修改后的Terraform配置参考:
resource "aws_lb_target_group" "tg" { name = "lb-target-group" port = 3128 protocol = "TCP" vpc_id = aws_vpc.main.id health_check { port = 54321 } // 关闭客户端源IP保留 preserve_client_ip_enabled = false }
如果你的代理服务需要获取真实客户端IP,可以额外开启proxy_protocol_v2 = true,同时在代理服务中配置适配代理协议即可。
方案2:调整安全组规则
如果你需要保留客户端源IP用于业务日志审计等场景,可以将aws_security_group.instance_sg中3128端口的入站规则源地址修改为NLB所在子网的CIDR 172.31.0.0/20,即可只允许NLB转发的请求访问代理端口。
额外优化建议:你可以将EC2实例的
associate_public_ip_address参数改为false,彻底避免公网直接访问EC2实例的风险,所有流量仅能通过NLB转发进入。
内容的提问来源于stack exchange,提问作者Jonny Shanahan
相关产品推荐
相关产品推荐

