如何将Cloud SQL(PostgreSQL)作为SSH主机实现Datastream连接?
解决Datastream通过SSH隧道连接Cloud SQL PostgreSQL的问题
首先纠正一个关键误解:Cloud SQL实例默认没有运行SSH服务,无法直接作为SSH隧道的终端节点。你需要部署一台Google Compute Engine(GCE)虚拟机作为SSH堡垒机,Datastream先连接堡垒机,再通过堡垒机转发流量到Cloud SQL实例。
以下是分步解决方案:
一、部署并配置GCE SSH堡垒机
- 创建一台GCE虚拟机,建议与Cloud SQL实例处于同一VPC网络(或通过VPC peering连通),若使用公网连接则需为堡垒机分配外部IP。
- 为堡垒机添加实例标签(如
datastream-bastion),方便后续配置防火墙规则。 - 在堡垒机的操作系统中启用SSH服务(默认已启用),并确保系统防火墙允许22端口入站:
- Ubuntu/Debian:
sudo ufw allow 22 && sudo ufw reload - CentOS/RHEL:
sudo firewall-cmd --add-port=22/tcp --permanent && sudo firewall-cmd --reload
- Ubuntu/Debian:
二、配置堡垒机的防火墙规则
在VPC网络控制台创建 ingress 防火墙规则:
- 目标:选择“指定目标标签”,填入堡垒机的实例标签(如
datastream-bastion) - 来源IP范围:填入Datastream服务的出口IP段(可在Google Cloud控制台的Datastream区域设置中查询,或通过
gcloud datastream locations describe <区域>命令获取) - 协议和端口:选择
tcp:22 - 优先级:设置为低于默认拒绝规则的数值(如1000)
三、Cloud SQL端的必要配置
- 授权堡垒机访问:在Cloud SQL控制台的“连接”>“授权网络”中,添加堡垒机的内部IP(同VPC时)或外部IP(公网连接时),允许其访问5432端口。
- SSL证书配置:
- 在Cloud SQL控制台“连接”>“SSL证书”中,创建新的客户端证书,下载客户端证书(
.crt)、客户端密钥(.key)和服务器CA证书(.pem)。 - 确保Cloud SQL的SSL设置为“要求SSL连接”(已配置的话再次确认)。
- 在Cloud SQL控制台“连接”>“SSL证书”中,创建新的客户端证书,下载客户端证书(
四、Datastream的SSH隧道连接配置
在Datastream创建数据源连接时:
- SSH隧道设置:
- 隧道服务器地址:填写堡垒机的外部IP
- SSH端口:默认22(若修改了堡垒机SSH端口则对应调整)
- SSH用户名:填写堡垒机的SSH登录用户名(如
ubuntu) - SSH私钥:上传堡垒机的SSH私钥(需提前生成密钥对,公钥已添加到堡垒机的
~/.ssh/authorized_keys中)
- 数据库连接设置:
- 主机名:填写Cloud SQL的内部IP(同VPC时)或公网IP
- 端口:
5432 - SSL证书:上传之前下载的Cloud SQL客户端证书、客户端密钥和CA证书
- 数据库用户名、密码:填写Cloud SQL的数据库账户信息
五、连通性验证步骤
- 测试堡垒机22端口可达性:在本地终端执行
nc -zv <堡垒机IP> 22,若返回succeeded!则端口已开放;若失败,检查VPC防火墙规则和堡垒机系统防火墙。 - 测试堡垒机到Cloud SQL的连接:在堡垒机上执行
psql "host=<Cloud SQL IP> port=5432 dbname=<数据库名> user=<用户名> sslmode=verify-ca sslrootcert=server-ca.pem sslcert=client-cert.pem sslkey=client-key.pem",确认能成功连接数据库。
内容的提问来源于stack exchange,提问作者IvarAlek
相关产品推荐
相关产品推荐

