AWS NLB配置安全组限制后Fargate目标健康检查失败问题
问题结论
Network Load Balancer 完全支持配置安全组仅允许NLB私有IP段访问健康检查端口,你配置失败并非功能不支持,是参数配置与网络规则存在冲突。
核心根因
你在目标组配置中开启了preserve_client_ip = true(客户端IP保留),该参数开启后会改变NLB转发流量的源IP逻辑:
- 所有转发到Fargate任务的流量,包括AWS发起的健康检查流量、公网用户的访问流量,源IP都会被保留为原始请求发起方的IP,健康检查流量的源IP不会是NLB自身的私有IP
- 这种场景下,你在安全组中放通VPC CIDR、NLB私有IP的规则无法匹配到健康检查流量,自然会导致健康检查失败
- 同时你当前部署Fargate的私网路由表没有配置0.0.0.0/0的公网回包路由,就算放通公网网段,健康检查的回包也无法正常返回,会进一步加剧连通性问题。
可选解决方案
方案1:关闭客户端IP保留(最匹配你的访问限制需求)
将目标组的preserve_client_ip参数修改为false,此时:
- 所有转发到Fargate的流量(含健康检查)源IP都会替换为NLB网卡的私有IP,你当前配置的放通VPC CIDR
10.167.0.0/16的安全组规则会直接生效,健康检查可正常通过 - Fargate任务部署在私网子网无公网IP,安全组也未放通公网网段,公网用户无法直接访问8080端口,所有访问必须经过NLB,符合你的安全预期
- 注意:关闭客户端IP保留后,应用层无法直接读取到用户真实公网IP,需要在目标组开启
proxy_protocol_v2 = true,同时在应用侧配置支持Proxy Protocol v2协议解析,即可获取真实客户端IP。
对应Terraform配置修正
仅需调整目标组参数即可:
resource "aws_lb_target_group" "test_http_nlb_target_group" { name = "${var.prefix}-target-group-http" port = 8080 protocol = "TCP" vpc_id = aws_vpc.test_vpc.id target_type = "ip" preserve_client_ip = false proxy_protocol_v2 = true }
额外配置提示:你当前私网路由表没有配置公网出口,如果Fargate任务需要拉取公网镜像、调用外部公网API,需要为私网路由表添加指向NAT网关的0.0.0.0/0路由,不要直接绑定互联网网关,避免任务直接暴露公网。
方案2:保留客户端IP透传能力
如果你必须保留preserve_client_ip = true来直接透传客户端真实IP,无法通过安全组实现"仅允许NLB访问、阻断公网直连"的需求:
- 此时健康检查和公网访问流量的源IP都是公网地址,安全组无法区分两类流量,放通规则要么同时允许两类流量,要么同时拦截
- 你需要先为私网子网配置NAT网关作为公网出口,保证流量回包正常,再通过应用层ACL、NLB附加WAF的方式做访问控制,安全组层面无法实现你要的隔离效果。
内容的提问来源于stack exchange,提问作者Asterix Assa
相关产品推荐
相关产品推荐

