AWS NLB在公共子网中,与位于私有子网中的EC2配合使用

20

是否有人在您的VPC的公共子网中配置了NLB以将流量路由到位于私有子网中的EC2实例?

使用ELB时,一个好的解决方案是为ELB创建一个安全组,然后为私有EC2实例创建另一个安全组,允许来自该ELB安全组的入站流量,如此处所述:

https://aws.amazon.com/premiumsupport/knowledge-center/public-load-balancer-private-ec2/

“您还可以在实例的安全组上添加规则,以允许来自分配给负载均衡器的安全组的流量。例如,如果负载均衡器上的安全组为sg-1234567a,则对与私有实例相关联的安全组进行以下更改”

由于您无法将安全组关联到NLB,那么如何使用相同类型的安全性来完成这项任务呢?

谢谢!

3个回答

47
由于您无法将安全组与NLB关联,因此如何使用相同类型的安全性来完成此操作?
安全方面并未更改。
NLB是一种不同的负载均衡器,与经典负载均衡器不同。对于经典负载均衡器,从实例的角度来看,流量似乎来自VPC内部。从外部来看,流量会转到由AWS提供给您的DNS记录解析出的(随机且变化的)IP地址列表。
网络负载均衡器完全不同。从实例的角度来看,它们是完全不可见的。如果是外部网络负载均衡器,则流量似乎直接来自互联网上的实例(尽管这是一种幻觉)。因此,如果要与互联网上的所有人交谈,则应将其打开到0.0.0.0/0。
事实上,文档中就是这么说的:

https://docs.aws.amazon.com/elasticloadbalancing/latest/network/target-group-register-targets.html#target-security-groups

Recommended Rules

Inbound Source      Port Range        Comment
Client IP addresses instance listener Allow traffic from clients on the instance listener port

VPC CIDR            health check      Allow traffic from the load balancer on the health check port

客户端IP地址就是你的客户端IP。如果它们在公网上,那么就是0.0.0.0/0。添加NLB私有IP地址并没有什么作用。就实例而言,流量不是从那里来的。在安全方面,没有任何改变。由于您的实例位于私有子网中,流量无法直接流向它们,因为中间有一个NAT网关。它只能从它们流向互联网(通过NAT网关,然后是互联网网关)。即使您指定允许来自任何地方的所有流量,流量也不会到达。它将不得不通过另一种方式。在您的情况下,这种方式是NLB,它有一定数量的端口监听,并且只将流量发送到您指定的实例上的目标端口。
如果您要从经典负载均衡器转移到NLB,则将安全组规则从负载均衡器移动到实例中。或者更好的方法是,由于您可以拥有多个安全组,只需将当前用于经典LB的SG添加到实例中(并根据需要更新任何ASG)。您的安全姿态将完全相同。还有一个额外的好处,现在您的应用程序不需要像代理协议那样去找出流量来自哪里,因为它不再被负载均衡器混淆。

15

根据 AWS 文档的说法,这是确实的:

网络负载均衡器没有关联的安全组。因此,目标的安全组必须使用 IP 地址来允许来自负载均衡器的流量。

因此,如果您不想授予对整个 VPC CIDR 的访问权限,您可以授予对负载均衡器节点使用的私有 IP 地址的访问权限。每个负载均衡器子网有一个 IP 地址。

在 NLB 标签页中,每个负载均衡器有一个网络接口,从那里:

对于每个网络接口的详细信息选项卡,请复制主要私有 IPv4 IP 的地址。

您可以将此私有 IP 地址添加到 EC2 实例的 SG 中。

请参阅 AWS 文档


2
谢谢Kush。我尝试了一下,它对于NLB健康检查是有效的。对于来自客户端的HTTP流量,它不起作用。您仍然需要在私有EC2实例的安全组中从任何地方打开HTTP流量。这是否违背了让那些私有EC2实例只接受来自ELB/NLB/ALB的流量的想法? - Luis
是的,这就是为什么您需要将 NLB 的私有 IP 添加到 EC2 安全组中允许的原因。 - Kush Vyas
2
但是,即使您添加了NLB的私有IP(用于健康检查),您还必须从源0.0.0.0/0(任何地方)打开HTTP流量。 - Luis
1
我认为这里的诀窍是,这些EC2实例应该只有私有IP,因此添加源0.0.0.0/0没有太大意义,除非NLB发送流量(从其私有IP),但源IP显示为公共IP。 - Zoltan Fedor
这是错误的,分配给 NLB 的 IP 周期性地轮换..... - furydrive

0

跟踪您的HTTP访问日志,您会发现网络负载均衡器的源IP地址没有变化,这意味着如果互联网需要访问您的端点,您需要在端点安全组中允许0.0.0.0/0。

如果您使用的是私有子网,那么这样做是可以的,但如果您将此服务器放在公共子网上,则不建议使用此解决方案。在这种情况下,只需使用应用程序负载均衡器即可。您仍然可以设置相同的监听器,并按实例配置目标组。应用程序负载均衡器将更新源IP地址为其自己的私有地址,如果您跟踪访问日志的话。这样做的好处是您只需要允许应用程序负载均衡器的HTTPS流量,然后您可以从负载均衡器接受目标组的HTTP流量(如果需要的话)。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接