【问题标题】:Cloud Run static outbound IP address does not go through Google App Engine firewallCloud Run 静态出站 IP 地址不通过 Google App Engine 防火墙
【发布时间】:2021-04-14 08:30:15
【问题描述】:

我有一个在 Google App Engine (flex) 上运行的 python (flask) 应用程序;应用程序受 GAE 防火墙保护,其中:

  • 默认规则是“拒绝”所有入口
  • 有一个允许流量来自的 IP 地址白名单。

我在 Cloud Run(完全托管)上​​部署了一些微服务:

  • 接收来自 GAE 应用的请求(例如繁重任务)
  • 将他们处理的任何结果作为 http 请求发送回 GAE 应用程序中的处理程序/端点

因此,GAE 应用程序是与客户端交互的主要点和繁重任务的调度程序,而这些任务的处理由微服务执行。我已经设置了 Cloud Run 托管服务的static outbound IP address,它可以正常工作,并且流量按照文档中的要求通过 NAT 网关路由。相应的 NAT IP 地址在防火墙白名单中。

问题是防火墙仍然不允许 Cloud Run >>> GAE 应用程序请求以 403 状态反弹(当然,如果我将默认防火墙规则更改为“允许”,流量就会通过)。如果我在 GCE VM 上的 docker 容器中托管相同的微服务,并使用像 this 这样的静态 IP 地址,那么一切都会完美无缺。这让我假设,尽管 Cloud Run 出站流量确实是通过静态 IP 地址路由的,但当流量流向 GCP 外部的收件人时,当我尝试 ping 内部(项目方面)资产时,它仍然会通过一些动态选择的 IP(即静态 IP 解决方案根本不起作用)。不幸的是,日志没有显示 403-ed 尝试,所以我无法看到这些请求似乎来自哪些 IP 地址(从 GAE 的角度来看)。

我将非常感谢您提出如何解决此问题的想法,因为它大大降低了为 Cloud Run 提供静态出站 IP 地址的绝妙想法的价值。

【问题讨论】:

  • 您的出口流量参数值是多少?运行命令gcloud run services describe <service name> 并分享Egress:
  • 所有流量都通过 Cloud NAT 路由 - `Egress: All, VPC connector: the_name_of_my_connector'

标签: google-app-engine google-cloud-platform firewall google-cloud-run static-ip-address


【解决方案1】:

你说得对,当数据包在内部路由到 GCP 时,静态 IP 不受支持。

我认为this 是您想要的。您必须在防火墙中允许其中提到的 IP 之一(现在不确定是哪一个)。

【讨论】:

  • Cloud Run 文档中的内容与在这种情况下的实际工作方式之间似乎存在差异。关于上面的链接,“任务队列流量将被防火墙允许,即使默认规则设置为拒绝”参数不成立(不允许通过队列的流量通过)。有趣的是,将“0.0.0.0”列入白名单是可行的(我尝试了这个,因为我看到 GAE 端点“看到传入的请求是由 '0.0.0.0' 发送的东西,但对我来说,这很危险。
【解决方案2】:

正如您和@Ema 所提到的,考虑到从 Cloud Run 到 App Engine 的流量是实习生,这是一种预期行为。

当您在那里使用 Cloud Nat 到 send all traffic 时,它确实会发生。如果您创建一个容器并 ping,让我们说www.github.com。您会发现流量通过您设置的IP。另一方面,如果您 p​​ing 到 www.google.com,鉴于流量是内部流量,并且要访问的站点位于同一基础架构中,则请求甚至不会通过公共互联网。

另外,请记住,Static outbound IP address 仍处于 Beta 阶段,不建议在生产环境中使用 Beta 功能/产品。

正如你所提到的,正如Allowing requests from your services 所述:

为 IP 0.0.0.0 创建规则将适用于所有启用了 Private Google Access 的 Compute Engine 实例,而不仅仅是您拥有的实例。同样,允许来自 0.1.0.40 或 10.0.0.1 的请求将允许任何 App Engine 应用向您的应用发出 URL Fetch 请求。

您可能对以下问题感兴趣:

【讨论】:

  • 感谢您的全面回答@Joss Baron - 它准确地描述了我在进行的实验中观察到的行为。然而,到目前为止,Cloud Run 静态出站 IP 地址功能似乎无法将请求路由到 GAE 应用程序(至少在同一个项目中)。我正在研究涉及 Cloud Run 托管微服务和 GAE 托管应用程序之间的 Cloud Tasks 队列的解决方案,当我有结果时会更新。
【解决方案3】:

首先,感谢您的帮助和建议,他们非常有帮助。我在 Google 的帮助下找到了解决方案:

  • 当 Cloud Run 微服务和 GAE 应用程序托管在同一个项目中时,流量仍通过内部通道路由,并且似乎来自 IP 地址 0.0.0.0此地址包含 GCP 资产,这些资产也是其他项目的一部分(据我所知)
  • 一个更强大的解决方案似乎是设置一个面向外部的负载平衡器,如here 所述,并将其放在 GAE 应用程序前面;在这种情况下,Cloud Run 确实会按照文档中的说明始终如一地使用其 static outbound IP address

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 2020-07-19
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2016-06-12
    相关资源
    最近更新 更多