【问题标题】:AWS NLB in public subnets with EC2 in private subnets公有子网中的 AWS NLB,私有子网中的 EC2
【发布时间】:2018-07-24 18:29:33
【问题描述】:

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

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

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

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

由于您无法将安全组与 NLB 关联,您如何使用相同类型的安全性来完成此操作?

谢谢!

【问题讨论】:

    标签: amazon-web-services amazon-ec2 amazon-vpc vpc


    【解决方案1】:

    既然您无法将安全组与 NLB 关联,您怎么能 使用相同类型的安全性来完成此操作?

    安全方面没有改变。

    NLB 是一种不同的野兽,它与经典的负载均衡器不同。对于 Classic Load Balancer,从您的实例的角度来看,流量似乎确实来自 VPC 内部。从外部,流量进入(随机且可变的)IP 地址列表,由 AWS 提供给您的 DNS 记录解析。

    网络负载均衡器完全不同。从您的实例的角度来看,它们是完全不可见的。如果它是外部网络负载均衡器,则流量似乎直接来自 Internet 上的实例(尽管这是一种错觉)。因此,如果你想与互联网上的每个人交谈,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 地址。如果它们在开放的 Internet 上,则为 0.0.0.0/0。正如我在其他响应中看到的那样,添加 NLB 私有 IP 地址没有任何作用。就实例而言,流量并非来自那里。

    在安全角度,没有任何变化。由于您的实例位于私有子网中,因此流量无法直接流向它们,因为中间有一个 NAT 网关。它只能从它们流到互联网(通过 NAT 网关,然后是互联网网关)。即使您指定允许来自任何地方的所有流量,流量仍然不会到来。它必须通过另一种方式来实现。在您的情况下,这种方式是 NLB,它具有固定数量的侦听端口,并且仅将流量发送到您指定的实例上的目标端口。

    如果您要从经典负载均衡器迁移到 NLB,请将安全组规则从负载均衡器迁移到您的实例。或者更好的是,因为您可以拥有多个安全组,只需将您当前用于经典 LB 的 SG 添加到实例(并根据需要更新任何 ASG)。您的安全态势将完全相同。有了额外的好处,现在您的应用程序不需要代理协议之类的东西来确定流量来自哪里,负载均衡器不再混淆它。

    【讨论】:

      【解决方案2】:

      根据 AWS 文档确实如此:

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

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

      在 NLB 选项卡上,每个负载均衡器都有一个网络接口:

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

      您可以在添加 EC2 实例的 SG 时使用此私有 IP 地址。

      请参考AWS Documentation

      【讨论】:

      • 谢谢库什。我试过了,它适用于 NLB 健康检查。对于来自客户端的 HTTP 流量,它不起作用。您仍然必须从私有 EC2 实例的安全组中的任何位置打开 HTTP 流量。这不违背让那些私有 EC2 实例只接受来自您的 ELB/NLB/ALB 的流量的想法吗?
      • 是的,这就是为什么您将 nlb 的私有 IP 添加到 ec2 的 sg 中允许的原因
      • 但即使你添加了 NLB 的私有 IP(用于健康检查),你也必须从源 0.0.0.0/0(无处不在)打开 HTTP 流量
      • 我认为这里的诀窍是,那些 EC2 实例应该只有一个私有 IP,因此如果没有 NLB 发送流量(来自其私有 IP),添加源 0.0.0.0/0 并没有多大意义),但源 IP 显示为公开。
      【解决方案3】:

      跟踪您的 http 访问日志,您会看到网络负载均衡器的源 IP 地址没有更改,这意味着如果 Internet 需要访问您的端点,您需要在端点安全组上允许 0.0.0.0/0。 仅当您使用私有子网时才可以这样做,因此如果您将此服务器放在公共子网上,请小心,因为不建议使用此解决方案。在这种情况下,只需使用应用程序负载平衡器。您仍然可以设置相同的侦听器并按实例配置目标组。如果您跟踪访问日志,应用程序负载均衡器会将源 IP 地址更新为其自己的私有地址。这样做的好处是您只需要允许应用负载均衡器的 https 流量,然后您可以接受来自负载均衡器的目标组的 http。

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 2018-08-10
      • 2019-06-24
      • 2015-05-13
      • 1970-01-01
      • 2015-01-06
      相关资源
      最近更新 更多