我已经使用AWS ECS Fargate部署了我的容器化应用程序。我的设置包括:
- 在端口 8000上运行的FastAPI Web服务器。
- 在端口 8080上运行的NGINX服务器。
出于安全原因,我阻止了通过安全组的直接访问- 这意味着没有人可以通过端口 80、443、8080 或 8000访问我的实例的公共 IP 。
相反,我使我的应用程序只能通过AWS 应用程序负载均衡器 (ALB)访问,该均衡器处理基于域的流量。我的假设是,由于无法访问公共 IP ,除非机器人知道我的域名,否则它们将无法发送自动请求。
然而,我仍然看到机器人请求不断涌入。
我的问题:
- 如果直接 IP 访问被阻止,机器人如何仍向我的服务发送请求?
- 有没有办法在不使用 AWS WAF 或其他 AWS 安全服务的情况下完全阻止机器人流量?
- 阻止直接公共 IP 访问是否意味着只有知道我的域的用户才能访问该服务?
希望大家能对发生这种情况的原因以及可能的解决方案有所了解。
ALB 不会过滤机器人流量。它只是将其传递给您的容器。如果机器人知道您的域名,它可以直接向您的 ALB 发送请求。域和 ALB 不会仅仅因为位于 SG 后面而免受机器人流量的影响。
从问题中很难理解‘机器人’是什么以及‘请求’是什么,但安全组“不生效”的一个可能原因可能是修改安全组的工作方式。
当您修改安全组时,更改仅对发起的新连接生效,这意味着如果客户端与目标建立了开放的 TCP 连接,则修改规则以阻止该连接不会终止现有连接(但是来自同一客户端的新 TCP 连接将被阻止)。
应用网络 ACL 是一种“更强大”的选项,可确保连接被阻止(并且立即应用于现有连接)。
另一个可能的原因是:您的 VPC 路由表允许到目标的意外连接路径,绕过您的规则。
最后,您可以通过启用 CloudWatch 指标和负载均衡器访问日志来验证是否有任何请求到达您的负载均衡器。
@Mark B 找到了解决方案,感谢 Stackoverflow 的 @Mark B。
有两个解决方案。
1)(如果您使用 Cloudflare 会更好):将负载均衡器的安全组更改为仅接受来自 Cloudflare 的 IP 地址的请求。然后您可以确保所有请求都经过 Cloudflare 及其 WAF。Cloudflare IP 范围允许 ipv4 地址添加安全组。
2)请求仍然到达我们的负载均衡器,但如果标头名称不匹配,则被拒绝: 负载均衡器默认返回 404,如果主机标头与我的域匹配,它会将请求转发到目标组。