基于TCP的服务部署在Network Load Balancer后,如何获取客户端IP?
解决Fargate+NLB环境下获取真实客户端IP的问题
要在ECS Fargate任务中获取通过NLB转发的真实客户端IP,核心是利用NLB的客户端IP保留功能——因为NLB在TCP模式下不会像ALB那样添加HTTP头,只能通过TCP层传递源IP。以下是具体步骤和验证方法:
1. 配置NLB目标组开启客户端IP保留
NLB的IP类型目标组(Fargate服务必须使用该类型)支持保留客户端IP,默认关闭,需手动开启:
- 进入AWS控制台「目标组」页面,找到Fargate服务关联的目标组
- 确认目标组类型为IP(实例类型目标组不支持Fargate)
- 编辑目标组,找到「客户端IP保留」选项,设置为启用
- 注意:启用该功能要求Fargate任务所在子网为公有子网;若为私有子网,需确保NLB能直接路由到任务的弹性网络接口(ENI),且任务安全组允许NLB流量
2. 验证代码逻辑
你的现有代码无需修改,配置正确后,socket.getInetAddress().getHostAddress()就能直接获取真实客户端IP:
socket = serverSocket.accept(); socket.setSoTimeout(defaultDisconnectionTimeout); out = new PrintWriter(socket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); InetAddress remoteAddress = socket.getInetAddress(); clientIp = remoteAddress.getHostAddress(); // 此时将返回真实客户端IP
开启客户端IP保留后,NLB会直接将TCP连接的源IP传递给Fargate任务的监听Socket,而非用NLB自身IP作为源。
3. 额外排查点
如果供应商仍无法连接,除IP验证外还可:
- 检查Fargate任务安全组是否允许外部客户端的SMTP端口流量(默认25/587/465),同时允许NLB的健康检查流量
- 确认NLB监听配置正确绑定对应TCP端口,且目标组关联无误
- 在Fargate任务中开启详细TCP日志,记录连接建立时间、源IP及SMTP命令交互,排查是否为协议层面问题(如EHLO命令不兼容、TLS配置错误等)
内容的提问来源于stack exchange,提问作者Lester Gray
相关产品推荐
相关产品推荐

