首页 文章

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

提问于
浏览
1

我们是 trying to host a service ,其中 needs to expose at least two different ports on the same address 在GCE上 .

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

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

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

  • 在实例上使用公共IP

  • 使用L4 LoadBalancer(TCP)

  • 使用L7 LoadBalancer(HTTPS)

Using a public IP on the instance

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

Using a L4 LoadBalancer (TCP)

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

Using a L7 LoadBalancer (HTTPS)

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

我的 QuestionIs there a better way to expose this kind of service on GCE?

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

1 回答

  • 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"
    

相关问题