Python通过SSH连接PostgreSQL报错:端口连接超时
排查SSH隧道连接PostgreSQL端口超时问题
核心问题定位
你的代码中PostgreSQL连接的host参数错误,导致连接请求没有走SSH隧道,而是直接从本地机器发起对RDS的连接,被VPC/安全组拦截从而超时。
Postico的连接URL通过postgresql+ssh://协议实现了SSH中转,所有数据库请求先经过EC2服务器再转发到RDS;但你的Python代码如果把host变量设为example-rds-host.com,相当于绕过SSH隧道直接访问RDS——而你的本地IP大概率不在RDS安全组的允许列表里,因此出现超时。
修复步骤
修正PostgreSQL连接的host参数
将连接字符串中的host改为localhost(或127.0.0.1),因为SSH隧道已将本地端口转发到EC2,再由EC2中转到RDS:conn_string = "host='localhost' dbname='exampledb' user='exampleusername' password='examplepassword' sslmode='{}' port='{}'".format(ssl_mode, ssh_tunnel.local_bind_port)验证SSH隧道的可用性
在代码中添加打印,确认本地绑定端口:ssh_tunnel.start() print(f"本地转发端口: {ssh_tunnel.local_bind_port}")用命令行工具测试本地端口连通性:
psql -h localhost -p <本地端口> -U exampleusername exampledb若能连通,说明隧道正常,问题出在Python连接代码;若不能连通,再排查隧道配置。
检查EC2到RDS的网络通路
登录EC2服务器,直接测试EC2到RDS的连通性:telnet example-rds-host.com 5432确保EC2安全组允许出站到RDS的5432端口,同时RDS安全组允许EC2的IP访问5432端口。
私钥权限检查(可选)
若使用Linux/macOS,确保SSH私钥权限为600(避免权限过高被拒绝):chmod 600 xRedactedx/Desktop/examplekey
内容的提问来源于stack exchange,提问作者Jason Chan
相关产品推荐
相关产品推荐

