【问题标题】:Connecting to HTTPS server in Docker container running on Cloud GCE VM with external IP使用外部 IP 连接到在 Cloud GCE VM 上运行的 Docker 容器中的 HTTPS 服务器
【发布时间】:2021-05-15 23:02:34
【问题描述】:

我目前正在为应用程序部署构建云环境,但在通过 HTTP/S 连接到正在运行的 Node/Express REST API 服务器时遇到了问题。我使用 GCE 作为我的 VM 提供程序,并开始尝试从我的个人机器上测试 API 服务。如果可能的话,我现在想避免使用 Docker Compose,因为我想在习惯 Docker 之后构建 Kubernetes 部署。

另外,我的虚拟机防火墙设置确实允许 HTTP 和 HTTPS 请求进入机器。

我已经能够使用虚拟机的外部 IP SSH 到我的实例并设置一个正在运行的 docker 容器。然后我尝试使用运行命令在 XX.XXX.XX.XXX:81:81 发布相同的端口 443 和 81。

CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                         NAMES
cf3f315dd947   repo/dev-api:latest   "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes   0.0.0.0:81->81/tcp, 443/tcp   api

我想在此之后立即进行 HTTPS 设置,但希望首先解决此 HTTP。我的服务器运行正常,并在 HTTPS 的 443 端口和 HTTP 的 81 端口上侦听(端口 80 导致我的 VM 完全与 SSH 断开连接,但这是另一个问题的主题)。但是,使用我的浏览器直接连接到端口 443 或 81 的外部 IP,使用 https:// 或 http:// 的任意组合,我仍然收到“无法访问此站点”错误。

我也尝试过 ping 虚拟机 - 直接 ping 到外部 IP 时效果很好,但在 IP 前附加 http:// 时不行。

非常感谢您在这方面的帮助 - 感谢您抽出宝贵时间。

【问题讨论】:

  • 您的流量已被过滤。你能分享你的防火墙规则吗?
  • @guillaumeblaquiere 感谢您的回复!我回去查看了我的防火墙规则,这些规则在我更改了一些设置后已经过时了。

标签: docker gcc networking google-cloud-platform ip


【解决方案1】:

您的问题是端口 81 和 443 上的流量无法到达您的虚拟机。

你必须检查两个防火墙。

首先检查 GCP 防火墙,看看是否存在允许端口 81 和 443 上的传入流量的适当规则。

一个是VM防火墙。我有根据地猜测它是基于 Linux 的。默认大部分linux系统don't block any incoming traffic

如果没有,您可以使用 gcloud compute --project=my-proj-name firewall-rules create test-rule1 --direction=INGRESS --priority=1000 --network=default --action= 创建一个ALLOW --rules=tcp:81,tcp:443 --source-ranges=0.0.0.0/0 --target-tags=docker-test-vm (您必须将 docker-test-vm 网络标签添加到您的虚拟机它工作)。

如果您仍然无法连接,请检查您的虚拟机防火墙。我假设它是基于 Linux 的。

要验证这一点,请运行以下命令:sudo iptables -L;你应该看到这样的东西:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   

这是默认的防火墙配置,这意味着所有流量(进出)都是允许的。

您可以阅读more about iptables here

要进一步验证这一点,您可以运行 sudo netstat -tulpn | grep LISTEN 来获取开放端口列表(81 和 443 应该在列表中)。

如果他们不检查您的服务是否正常运行并在给定端口上侦听。如果没有,请尝试重新启动它并重复最后一步。

你可以看看我关于排除连接故障的类似答案:

【讨论】:

  • 谢谢!我的错误是在将 HTTP 端口从 80 更改为 81 后忘记更改防火墙设置,因为标准 GCE 'http-server' 标记仅适用于端口 80。
  • 很高兴听到我为您指出了解决方案 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2021-07-02
  • 2020-09-28
  • 2015-01-21
相关资源
最近更新 更多