【问题标题】:How expose different ports on the same IP at GCE如何在 GCE 上暴露同一 IP 上的不同端口
【发布时间】:2016-09-12 05:08:21
【问题描述】:

我们正在尝试托管一个服务,该服务需要在 GCE 上的同一地址上公开至少两个不同的端口

在我们的例子中,这是 GitLab,它至少应该提供 SSH(端口 22)和 HTTPS(端口 443)访问。但实际上,这可能是任何需要同一域或 IP 地址上的两个或多个端口的服务。

该服务在 GCE VM 实例中运行良好,我正在寻找最明智的方式将其公开给全世界。当然 HTTPS 是强制性的,对于像这样的任何生产部署。出于方便和安全原因,我不想在实例上处理 TLS。

我们发现公开此服务的所有不同选项都不完美:

  • 在实例上使用公共 IP
  • 使用 L4 负载均衡器 (TCP)
  • 使用 L7 负载平衡器 (HTTPS)

在实例上使用公共 IP

这意味着直接暴露服务端口。在这种情况下,VM 上的服务需要绑定到众所周知的端口(22、443)。在我们的例子中,这有点烦人,因为服务在 Docker 中运行,并且端口 22 与主机上的 SSH 服务器发生冲突。所以我们必须为主机使用另一个 SSH 端口并自己处理 TLS 证书。不太好。

使用 L4 负载平衡器 (TCP)

基本上,同样的限制也适用,因为 L4 LB 似乎将流量转发到它接收流量的相同端口。此选项还为 LoadBalancer 配置增加了相当多的开销。而且我们仍然需要在实例上管理 HTTPS。

使用 L7 负载平衡器 (HTTPS)

这是一个相当灵活的方法,但我们会失去提供 SSH 的能力,这对我们来说是不行的。

我的问题有没有更好的方法在 GCE 上公开这种服务?

在 AWS 上,您可以只拥有一个带有多个侦听器(HTTPS 和 TCP:22)的 ELB,指向单个实例上的任意端口。 ELB 也可以为您终止 HTTPS。我真的无法想象 GCE 不提供这样的功能。

【问题讨论】:

    标签: gitlab google-compute-engine google-cloud-platform


    【解决方案1】:

    如果我理解正确,您正在寻找的是端口重定向,例如,向公众公开端口 2443,但您的服务在内部侦听 443。你可以这样做:

    1) 在您的虚拟机上配置 iptables 以进行端口重定向:

    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport <public-port> -j REDIRECT --to-port <internal-port>
    

    http://www.cyberciti.biz/faq/linux-port-redirection-with-iptables/

    2) 创建 GCE 防火墙规则以允许公共端口:

    gcloud compute firewall-rules create <name> --allow tcp:<public-port> --network <network> --source-ranges "0.0.0.0/0"
    

    【讨论】:

    • 我对 GCE 怀念的是一种将公共端口重定向到另一个内部端口的方法。我可能会将请求重定向到特定的 IP 地址(iptables -d),但这听起来很脆弱。我实际上是在寻找 GCE 解决方案。
    • 我同意,它应该是托管服务,但此时我们必须在 GCE 上使用 iptables。
    猜你喜欢
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 2018-12-28
    • 2018-02-25
    • 1970-01-01
    • 2023-04-03
    • 2018-09-03
    • 1970-01-01
    相关资源
    最近更新 更多