AWS中国区NLB转ALB Terraform/Terragrunt架构保留客户端源IP实现白名单
可行的IP白名单实现方案
方案1:修改转发Lambda逻辑,直接在Lambda层做IP校验
这是改造成本最低的方案:
- NLB触发Lambda的事件 payload 中默认携带真实客户端源IP字段,你可以提前将白名单IP段配置在Lambda环境变量或AWS Parameter Store中
- Lambda收到请求后先做源IP白名单匹配,匹配失败直接返回403响应,匹配通过再转发请求到后端ALB
- 该方案不需要调整现有链路的其他配置,也不会有IP伪造的风险,完全符合AWS中国区的功能限制
方案2:Lambda传递真实源IP,配合ALB侧规则做校验
如果需要把白名单管控能力下沉到ALB侧统一管理,可以用该方案:
- 转发Lambda拿到客户端源IP后,在转发请求的头中主动添加
X-Forwarded-For字段为真实客户端IP - 配置ALB的安全组仅允许Lambda的VPC出口地址段访问,避免外部用户直接访问ALB伪造XFF头
- 在ALB关联的AWS WAF中配置IP白名单规则,指定校验
X-Forwarded-For头中的地址即可;如果不用WAF,也可以在ALB后的业务服务中读取该头字段做校验
方案3:修复Nginx部署配置,用Nginx做白名单管控
你遇到的Nginx作为NLB四层目标健康检查异常的问题可以通过配置修正:
- 将NLB绑定的IP目标组健康检查改为TCP类型,指定Nginx监听的业务端口即可,不需要用HTTP类型健康检查;如果需要HTTP健康检查,可以在Nginx中新增
/healthz路径规则默认返回200状态码,同时将NLB健康检查指定为该路径 - Nginx中开启
real_ip模块,配置信任NLB的私有地址段,即可拿到真实客户端源IP - 直接在Nginx中配置
allow/deny规则做IP白名单管控,校验通过后再转发请求到后端ALB
关于Ingress控制器的适用性说明
Nginx-ingress、AWS-load-balancer ingress控制器都适用于该场景:
- 如果你的业务部署在EKS集群中,可以直接将NLB绑定Nginx-ingress Controller的四层Service,在ingress规则中添加
nginx.ingress.kubernetes.io/whitelist-source-range注解即可实现白名单管控 - 只需额外配置ingress控制器的
real-ip相关参数,确保能拿到NLB传递的真实客户端源IP即可,不需要额外部署ALB也能实现全链路功能
内容的提问来源于stack exchange,提问作者symbolinsight
相关产品推荐
相关产品推荐

