You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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安全组的允许列表里,因此出现超时。

修复步骤

  1. 修正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)
    
  2. 验证SSH隧道的可用性
    在代码中添加打印,确认本地绑定端口:

    ssh_tunnel.start()
    print(f"本地转发端口: {ssh_tunnel.local_bind_port}")
    

    用命令行工具测试本地端口连通性:

    psql -h localhost -p <本地端口> -U exampleusername exampledb
    

    若能连通,说明隧道正常,问题出在Python连接代码;若不能连通,再排查隧道配置。

  3. 检查EC2到RDS的网络通路
    登录EC2服务器,直接测试EC2到RDS的连通性:

    telnet example-rds-host.com 5432
    

    确保EC2安全组允许出站到RDS的5432端口,同时RDS安全组允许EC2的IP访问5432端口。

  4. 私钥权限检查(可选)
    若使用Linux/macOS,确保SSH私钥权限为600(避免权限过高被拒绝):

    chmod 600 xRedactedx/Desktop/examplekey
    

内容的提问来源于stack exchange,提问作者Jason Chan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:46:00