如何在GCE上暴露同一IP上的不同端口

时间:2016-09-11 05:17:42

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

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

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

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

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

  • 在实例上使用公共IP
  • 使用L4 LoadBalancer(TCP)
  • 使用L7 LoadBalancer(HTTPS)

在实例上使用公共IP

这意味着直接公开服务端口。在这种情况下,VM上的服务需要绑定到众所周知的端口(22,443)。在我们的情况下,由于服务在Docker中运行,而端口22与主机上的SSH服务器共存,因此有点烦人。所以我们必须为主机使用另一个SSH端口并自己处理TLS证书。不太好。

使用L4 LoadBalancer(TCP)

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

使用L7 LoadBalancer(HTTPS)

这是一个相当灵活的但我们没有能力提供SSH,这对我们来说是不行的。

我的问题是否有更好的方式在GCE上公开此类服务?

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

1 个答案:

答案 0 :(得分:2)

如果我理解正确,你要找的是端口重定向,例如,将端口2443暴露给公众,但你的服务正在内部监听443。你可以这样做:

1)在VM上配置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"