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

Python使用SSH隧道连接PostgreSQL数据库超时问题求助

问题分析与解决

核心代码错误:数据库连接参数配置错误

你的代码里建立SSH隧道后,直接尝试连接远程数据库的IP和端口,完全没用到SSH隧道的转发功能。SSH隧道的作用是把远程数据库的端口映射到本地机器的某个端口,你应该连接本地映射后的端口,而非直接连远程数据库地址。

修正后的代码示例

with SSHTunnelForwarder(
    ('10.132.230.2', 22),
    ssh_username="<usrnm>",
    ssh_password="<psswrd>", 
    remote_bind_address=('10.9.8.5', 5433)) as server:
    # 隧道启动后,server.local_bind_port是本地映射的端口
    print(f"隧道已启动,本地映射端口:{server.local_bind_port}")
    params = {
        'database': "<dbnm>",
        'user':  "postgres",
        'password':  "<dbpsswrd>",
        'host': '127.0.0.1',  # 必须连本地,因为隧道映射到本地
        'port': server.local_bind_port  # 用隧道提供的本地端口,不是远程5433
    }
    conn = psycopg2.connect(**params)
    curs = conn.cursor()
    # 后续操作...
    conn.close()

验证PostgreSQL配置的关键点

你已修改postgresql.conf和pg_hba.conf,但需确认以下内容是否正确:

  • postgresql.conf:确保listen_addresses设置为'*'或包含10.9.8.5,让PostgreSQL监听外部连接。
  • pg_hba.conf:必须添加允许SSH服务器(10.132.230.2)访问的规则,比如:
    host    all             all             10.132.230.2/32        md5
    
    该规则允许SSH服务器IP以md5密码验证方式访问所有数据库和用户。修改后务必重启PostgreSQL服务生效。

防火墙与网络连通性验证

  1. 在SSH服务器(10.132.230.2)上执行以下命令,测试能否连通数据库服务器的5433端口:
    telnet 10.9.8.5 5433
    # 或用nc
    nc -zv 10.9.8.5 5433
    
    如果连接失败,说明数据库服务器防火墙未开放5433端口给SSH服务器,需调整规则允许来自10.132.230.2的TCP 5433端口入站请求。
  2. 确认数据库服务器(10.9.8.5)的PostgreSQL服务正常运行:
    systemctl status postgresql
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:35:25