【问题标题】:AWS Network Load Balancer failed to connect with EC2 instance if EC2 instance is not open to public如果 EC2 实例未对公众开放,AWS 网络负载均衡器无法连接到 EC2 实例
【发布时间】:2021-12-28 13:30:12
【问题描述】:

我已经为这个问题苦苦挣扎了 2 天,但无法正常工作。

我有这个流程:

外部世界 --> AWS API 网关 ---> VPC 链接 ---> 网络负载均衡器 ---> 我的单个 EC2 实例

在介绍 API 网关之前,我想首先确保 Network Load Balancer --> my single EC2 instance 部分有效。

我已正确设置 EC2 实例。有一个 Typescript / ExpressJS api 服务在端口3001 上运行

我还设置了网络负载均衡器和目标组,NLB 正在监听并将请求转发到目标组(包含 EC2 实例)的端口 3001

这是 NLB:

请注意,NLB 有一个 VPC!这提出了下面的问题,我觉得很困惑。

听众:

可以看到它正在向docloud-backend-service转发请求,描述如下:

可以看到健康检查通过了。

我已使用此规则配置了我的 EC2 实例的安全组:

1. Allow All protocol traffic on All ports from my VPC 
(specified using CIDR notation `171.23.0.0/16`);

现在,当我执行curl docloud-backend-xxxxx.elb.ap-northeast-1.amazonaws.com:3001/api/user 时,命令因超时而失败。

那么,在我添加这条规则之后:

2. Allow All protocol traffic on All ports from ANY source (`0.0.0.0/0`);

现在,当我做curl docloud-backend-xxxxx.elb.ap-northeast-1.amazonaws.com:3001/api/user

api 服务收到请求,我可以看到 EC2 实例中生成的日志。

问题:

第二条规则向公众开放 EC2 实例,这很危险。

我想限制对我的 EC2 实例端口 3001 的访问,以便只有 AWS API 网关或 NLB 可以访问它。

NLB 没有要配置的安全组。虽然它有一个 VPC。如果我将 EC2 实例限制为只有它自己的 VPC 可以访问它,那应该没问题吧?

第一条规则就是这样做的。为什么会失败?

NLB 有一个 VPC。请求从 API Gateway 到 NLB,然后从 NLB 到 EC2 实例。因此,从 EC2 实例的角度来看,请求来自 VPC 中的实体。所以第一条规则应该有效,对吧?

否则,AWS 为何还要将 VPC 分配给 NLB?

为什么我会在 NLB 的描述控制台上看到 VPC?

【问题讨论】:

  • “这很好,因为我可以限制 EC2 实例,使其只有它自己的 VPC 可以访问它。” 不,不是。流量来自 API 网关,而不是来自 VPC 内部,因此 IP 地址不会来自内部 VPC IP。
  • @MarkB NLB 有一个 VPC。请求从 API Gateway 到 NLB,然后从 NLB 到 EC2 实例。所以第一条规则应该有效,对吧?否则他们为什么还要为 NLB 分配一个 VPC?
  • @MarkB 请阅读更新后的帖子。
  • @Kid_Learning_C 不,您忽略了对先前问题之一的部分答案:stackoverflow.com/questions/70493992/…“源 IP 是从 NLB 中保留的”。流量永远不会“看起来”像来自 NLB,因为 NLB 保留了请求来自的原始 IP 地址。在 VPC 中拥有 NLB 的意义在于,它可以向 VPC 内的 EC2 实例发送请求。 NLB 可以向没有公共 IP 地址,只有私有 VPC IP 地址的 EC2 实例发送请求。

标签: amazon-web-services amazon-ec2 aws-security-group aws-load-balancer


【解决方案1】:

我想限制对我的 EC2 实例端口 3001 的访问,以便只有 AWS API 网关或 NLB 可以访问它。

对于基于实例的目标组和基于 IP 的目标组,如果要保留请求者的 IP 地址,我们可以启用/禁用:

进入我们的目标组->动作->编辑目标属性可以找到这个设置。

从我们应用程序的安全组的角度来看,这意味着什么?

如果我们启用它(这是实例类型目标组的默认设置),应用程序将看到直接来自终端客户端的流量。这意味着,我们必须为0.0.0.0:3001 启用入站流量。

如果我们禁用它,应用程序将看到源流量,因为它来自网络负载均衡器的私有 IP 地址。在这种情况下,我们可以将入站流量限制在 NLB 的私有 IP 地址或放置 NLB 的子网的 CIDR 范围内。

【讨论】:

    猜你喜欢
    • 2020-02-12
    • 2015-07-03
    • 2019-03-26
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    相关资源
    最近更新 更多