You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 CIDR10.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 00:09:33