【问题标题】:Google App Engine firewall and internal accessGoogle App Engine 防火墙和内部访问
【发布时间】:2018-09-16 01:15:19
【问题描述】:

我在 Google App Engine 上运行了两项服务(flex,同一个项目),我希望一项服务使用 HTTPS 调用另一项服务。

除此之外,我还设置了防火墙,只允许0.1.0.4010.0.0.1

我还在请求中设置了X-Appengine-Inbound-Appid 标头。

很遗憾,我收到“403 访问被禁止”错误(禁用防火墙后该错误消失)。

现在,我使用xxx.appspot.com URL 来调用服务。我应该改用一些内部 URL 吗?似乎该请求被防火墙视为外部请求。

谢谢!

【问题讨论】:

  • 请问您是用哪种语言做的?另外,您是否使用 URL Fetch 进行通信?
  • Javascript,因为我将 Node 与 apollo-server 一起使用。至于通信,它使用的是原生的 apollo-server 函数。
  • 您使用的端口是否正确?应该是 8080。
  • 是的,因为禁用防火墙有效。此外,它不是 8080 而是 443 (HTTPS)。
  • 你看到接收端的X-Appengine-Inbound-Appid请求头了吗?

标签: google-app-engine google-cloud-platform firewall


【解决方案1】:

the page 告诉您如何允许来自不同 App Engine 服务的请求,据说 IP、0.1.0.4010.0.0.1 是您必须考虑的,但不是唯一的 一个:

要控制来自其他 App Engine 应用或服务的请求的访问权限,您可能需要创建规则来容纳用于服务到服务通信的 IP 地址。如果您的应用与 App Engine 中的其他应用或服务进行通信,您必须考虑如何处理来自以下 IP 地址的请求:...(简称:0.1.0.4010.0.0.1

为了允许来自不同灵活服务的传入请求,您可以阅读this answer

关于X-Appengine-Inbound-Appid 标头,它们在向其他 Google 标准或灵活服务发出请求时由 App Engine 标准服务自动设置,但您的应用程序无法添加它,因为当您使用时,Google 会自动删除它们根据thisthisthis,您可以自行设置它们,或者当请求来自 GCP 外部时出于安全原因设置。

设置

为了查看发生了什么,我创建了两个 App Engine Flex 服务,A 和 B。Cron 会向 A 发送一个请求,然后 A 会向 B 发送一个请求。A 和 B 都会打印出它们之间所有交互的标头.这些打印输出可以在 Stackdriver Logging 中读取。

观察

默认防火墙规则设置为允许时

  • 对 A 的 Cron 请求具有以下标头
X-Appengine-Cron: true
X-Appengine-Queuename: __cron
X-Forwarded-For: 10.0.0.1, 10.0.0.1
  • 从 B 到 A 的答案具有以下标题:
X-Forwarded-For: xxx.xxx.xxx.xxx, yyy.yyy.yyy.yyy

默认防火墙规则设置为拒绝时

  • 事实证明,如果 10.0.0.1 被阻止,则 cron 作业会失败,这与 this guide 所说的相反:

防火墙将允许任务队列和 Cron 流量,即使默认规则设置为拒绝。

  • 只有在 App Engine 防火墙允许 xxx.xxx.xxx.xxx(来自灵活实例的 IP)时,来自 A 的请求才到达 B。

【讨论】:

  • 我对 OP 提出了同样的问题。我拒绝所有 IP (*) 并将所有内部应用程序引擎 IP(10.1.0.41、0.1.0.40、10.0.0.1 和 0.1.0.30)列入白名单。然而我也有一个403错误。这个经过审查的 ip xxx.xxx.xxx.xxx 是什么?我还能做什么?
【解决方案2】:

我们的团队遇到了类似的问题。我们拒绝所有外部访问,但我们的其他 App Engine 服务除外,其中一些服务位于不同的 GCP 项目中。允许通过防火墙从您的其他 App Engine 服务进行访问的唯一方法是让消费服务使用 URL Fetch Service 并传入您提到的 appspot.com URL。您还可以将 followRedirects 设置为 false。

但是,在您的情况下,这是行不通的。据此:https://cloud.google.com/appengine/docs/flexible/nodejs/glossary 它仅适用于 Java、Python、PHP 和 Go。在这些情况下,您只需为 0.1.0.40 和 10.0.0.1 添加白名单规则。

如果您不想在 Google Compute Engine 中创建代理服务(如 here 所述),则必须添加一组非常大的 CIDR 范围,如下所示:https://cloud.google.com/appengine/kb/

【讨论】:

    【解决方案3】:

    任务队列方法

    您可以使用任务队列在服务之间进行对话。 让我们在同一个项目中考虑这两个服务

    服务 1:https://service1.appspot.com

    服务 2:https://service2.appspot.com/recieve-task-endpoint

    流程:

    service1 -> 创建任务 [service2 endpoint] -> 云任务队列 -> service2 作为 [GET] 请求接收

    尽管有防火墙规则,应用引擎服务仍可以在内部与云任务和云调度程序进行对话。

    将任务推送到队列 Refer this code for Python。这里可以指定服务2的公共urlhttps://service2.appspot.com/recieve-task-endpoint

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多