【问题标题】:app engine unable to redirect traffic via cloud nat static ip address应用引擎无法通过云 nat 静态 IP 地址重定向流量
【发布时间】:2021-04-02 17:30:11
【问题描述】:

我正在尝试使用应用引擎标准使用客户端的本地 SMTP 服务器发送电子邮件。为此,我们在默认网络中创建了无服务器 VPC 访问连接器,并使用静态 IP 地址创建了 Cloud NAT 以发送出口流量。客户端已将静态 IP 地址和端口列入白名单。以下是应用引擎中的代码sn-p

    msg.set_content('This is a HTML email')

    msg.add_alternative(cleared_html_content, subtype='html')
    try:
        context = ssl._create_unverified_context()
        print("starting conectn")
        with smtplib.SMTP('xx.xxxx.edu', 2525) as server:
            server.starttls(context=context)
            server.send_message(msg)
        print("sent almost")
    except Exception as e:
        print('Error: ', e)

下面是app.yaml

runtime: python37
entrypoint: gunicorn -t 120 -b :$PORT main:app
vpc_access_connector:
  name: projects/xxxxxxxxx/locations/us-central1/connectors/yyyyyyyyy

当我使用应用程序引擎 url 运行我的应用程序时,我在日志查看器中收到以下错误

Error: (554, b"xxx.xxxxx.edu\nYour access to this mail system has been rejected due to the sending MTA's poor reputation. If you believe that this failure is in error, please contact the intended recipient via alternate means."

我还使用与应用程序引擎中相同的代码创建了云功能以进行测试,令人惊讶的是,电子邮件被发送到预期的收件人而没有任何问题。当我检查云 NAT 日志时,它具有通过云功能触发时的所有详细信息(简而言之,它使用静态 IP 地址)但没有与应用引擎触发器相关的日志。所以我认为我的应用引擎流量不是通过静态 IP 地址进行的,并且不知道如何在 app.yaml 中提及它

电子邮件功能中也可能存在代码问题,但由于它在云功能中工作,我真的怀疑我的 app.yaml 而不是电子邮件 python 代码。非常感谢任何帮助

【问题讨论】:

  • 您如何访问您的 SMTP 本地 smtp 服务器?在公共 IP 还是私有 IP 上?
  • 您正尝试以open relay 的身份向学校的电子邮件服务器发送电子邮件。这意味着您没有使用身份验证。如果您学校的电子邮件系统将 IP 地址列入白名单,则您连接的 IP 地址不在列表中。
  • @guillaumeblaquiere 我们为云 NAT 创建了静态公共 ip 并与学校共享,他们将其列入白名单。这就是云功能发送电子邮件没有任何问题的原因。
  • @JohnHanley 我同意。因此,当流量通过应用引擎时,它不使用被列入白名单的云 NAT IP 地址。但是通过云功能触发时使用白名单IP。那么为什么应用引擎不通过云 NAT 发送流量?

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


【解决方案1】:

我了解到您的 SMTP IP 是公开的。无服务器 VPC 连接器有一个注意事项。

使用 Cloud FunctionCloud Run,您可以选择是仅通过无服务器 VPC 连接器路由私有 IP 还是公共和私有 IP

对于应用引擎,我没有找到对出口控制的明确描述,但我猜只有私有 IP (RFC1918) 是通过 VPC 路由的,而不是公共 IP。因此,您的 Cloud Nat 没有被使用,因此您在学校的 SMTP 服务器上没有被授权。


编辑 1:

你有 3 个解决方案来解决这个问题

  • 您可以创建一个 Cloud Functions(或 Cloud Run 服务),当您需要发送电子邮件时,您的 App Engine 会调用它。
  • 您可以从 App Engine 切换到 Cloud Run(使用新的 beta 命令gcloud beta run deploy --source=. --region=<REGION> --platform=managed <Service Name>)。像这样,您可以像使用 App Engine 一样进行部署。使用与 App Engine 相同的容器引擎构建器 (Buildpack)。您必须调整 app.yaml 文件的内容(如果需要帮助,请分享)。但是,到目前为止,IAP 不兼容 Cloud Run。如果您想使用它,请稍候!
  • 在您的 VPC 和学校网络之间创建一个 VPN。像这样,您将使用私有 IP 调用您的 SMTP 服务器。在 smtp 服务器上,仅授予无服务器 VPC 连接器范围以访问它。而且您不再需要 Cloud NAT 配置。

【讨论】:

  • 感谢您的回答。我现在能做的最好的事情是什么?使用 2 项服务(用于当前内容的应用程序引擎和用于发送电子邮件的云功能)。这是我唯一的选择吗?
  • 我提出了解决方案。如果您需要详细信息,我们可以讨论更多
  • 感谢您的回答。我选择了选项 1。再次感谢所有选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2017-10-08
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 2014-04-08
相关资源
最近更新 更多