我正在尝试将来自亚马逊网络负载均衡器的传入流量传递到应用程序负载均衡器,我正在使用 NLB,因为它具有弹性 IP 附件,并且我希望它充当 ALB 的代理。这甚至可能吗?
3 回答
2021 年 9 月更新: AWS 已宣布为 NLB 提供 ALB 目标组的本地可用性。这不仅降低了需要基于 Lambda 的解决方法的复杂性,而且消除了有关客户端 IP 保留的限制。以这种方式定位的 ALB 将提供X-Forwarded-For
包含最初调用 NLB 的外部 IP 地址的标头。
这是可能的,但它有点混乱。
问题在于 Application Load Balancer 可以向上、向外、向内和/或向下扩展,并且在每种情况下,平衡器的内部 IP 地址都可以更改……但是 NLB 需要其目标的静态地址。
因此,在较低级别上,这意味着每次 ALB 的 IP 更改时都必须修改 NLB 目标组。
AWS 已经发布了一个官方解决方案来实现这一点,它按计划使用 Lambda 函数来捕获 ALB 的地址,并在结果发生变化时更新 NLB 配置。
这里一个值得注意的限制是,此解决方案不允许您识别客户端 IP 地址。当流量通过 NLB 时丢失,因为 NLB 仅在目标是实例(不是 IP 地址)或目标理解客户端的代理协议并且在 NLB 上启用该功能时保留源 IP ,但 ALB 不支持这样的配置。X-Forwarded-For
通过上面链接中显示的设置,ALB 将把最右边的地址设置为 NLB 的内部地址。
这是对的。ALB(或 ALB 本身)后面的应用服务器将始终将源 IP 视为 NLB 的源 IP。
作为适用于某些用例的解决方法,您可以强制 HTTPS 并在 NLB 上配置访问日志。然后访问日志将具有原始源 IP。
如果不清楚,我的意思是:
- 确保在您的 NLB 上启用访问日志
- 确保将您的 NLB 侦听器配置为使用 TLS
如果您想接受纯 HTTP 并将重定向发送到 HTTPS,则会有一些额外的复杂性。在这种情况下,您将有 2 个侦听器和 2 个目标组,因此您需要启动 Lambda 的 2 个副本来监控(并最终更新)两个目标组,或者您需要修改 Lambda 代码(这就是我所做的) .
此外,IMO 该示例中的代码还远未准备好生产(尤其是对于规模化-如果您有许多此设置的实例),因此我不得不实际重写它。
CloudFormation 模板的相关摘录如下:
NLB:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
IpAddressType: ipv4
Scheme: internet-facing
Type: network
LoadBalancerAttributes:
- Key: load_balancing.cross_zone.enabled
Value: 'true'
- Key: access_logs.s3.enabled
Value: 'true'
# make sure the bucket policy grants access - https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-access-logs.html
- Key: access_logs.s3.bucket
Value: !Ref S3BucketForNLBAccessLogs
- Key: access_logs.s3.prefix
Value: !Sub 'raw/${AppInstance}'
nlbHTTPSListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
Certificates:
- CertificateArn: !Ref FrontEndSSLCertificateArn
LoadBalancerArn: !Ref NLB
Port: 443
Protocol: TLS
DefaultActions:
- Type: 'forward'
TargetGroupArn: !Ref nlbHTTPSTargetGroup
As of 27th September 2021, AWS launched Application Load Balancer(ALB)-type target groups for Network Load Balancer (NLB). With this launch, you can register ALB as a target of NLB to forward traffic from NLB to ALB without needing to actively manage ALB IP address changes through Lambda.