【发布时间】: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 有一个 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