如何在GCP Cloud Run中允许TCP流量以支持SSH连接?
解决Cloud Run允许SSH流量的方法
Cloud Run默认仅支持HTTP/HTTPS协议的流量(端口80/443),直接通过TCP协议的SSH连接会被拦截,你可以通过以下两种方式解决:
方法一:用HTTP隧道封装SSH流量
把SSH流量封装在HTTP请求中,让Cloud Run识别为合法的HTTP流量,具体实现有两种方式:
- 使用现成工具(如
sshuttle)或自定义HTTP代理,将SSH流量通过POST请求转发到Cloud Run服务 - 在你的Go服务中新增HTTP端点,接收POST请求后,把请求体数据转发到SSH处理逻辑,再将SSH响应返回给客户端
示例Go代码片段:
// 处理封装SSH流量的HTTP请求 func sshTunnelHandler(w http.ResponseWriter, r *http.Request) { input, _ := io.ReadAll(r.Body) // 调用你已有的SSH处理逻辑 output := yourSSHProcessingFunc(input) w.Write(output) } func main() { http.HandleFunc("/ssh-tunnel", sshTunnelHandler) http.ListenAndServe(":8080", nil) }
客户端连接时,需要通过自定义工具或代理将SSH流量封装为POST请求,发送到https://***.run.app/ssh-tunnel
方法二:基于私有VPC的TCP端口转发
如果你的Cloud Run服务部署在私有VPC网络内,可以通过VPC负载均衡器转发TCP流量:
- 创建TCP负载均衡器,将外部端口(如22)映射到Cloud Run服务的内部端口
- 配置Cloud Run服务的VPC访问权限,允许负载均衡器的流量进入
- 客户端通过负载均衡器的IP和端口发起SSH连接,而非直接连接Cloud Run公共域名
关键提示
- Cloud Run公共域名仅支持HTTP/HTTPS协议,无法直接通过该域名走纯TCP的SSH流量
- 方法一无需额外VPC配置,但需要修改客户端和服务端逻辑实现流量封装
- 方法二需要配置VPC和负载均衡器,成本更高,但更接近原生SSH使用体验
内容的提问来源于stack exchange,提问作者Anton Medvedev
相关产品推荐
相关产品推荐

