繁体   English   中英

如果 EC2 实例未对公众开放,AWS 网络负载均衡器无法连接到 EC2 实例

[英]AWS Network Load Balancer failed to connect with EC2 instance if EC2 instance is not open to public

我一直在为这个问题苦苦挣扎 2 天,但无法让它工作。

我有这个流程:

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

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

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

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

这是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。 请求 go 从 API 网关到 NLB,然后从 NLB 到 EC2 实例。 因此,从 EC2 实例的角度来看,请求来自 VPC 中的实体。 所以第一条规则应该有效,对吧?

否则,AWS 为什么要为 NLB 分配一个 VPC?

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

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

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

在此处输入图像描述

如果 go 到我们的目标组 -> 操作 -> 编辑目标属性,可以找到此设置。

在此处输入图像描述

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM