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)访问的规则,比如:
该规则允许SSH服务器IP以md5密码验证方式访问所有数据库和用户。修改后务必重启PostgreSQL服务生效。host all all 10.132.230.2/32 md5
防火墙与网络连通性验证
- 在SSH服务器(10.132.230.2)上执行以下命令,测试能否连通数据库服务器的5433端口:
如果连接失败,说明数据库服务器防火墙未开放5433端口给SSH服务器,需调整规则允许来自10.132.230.2的TCP 5433端口入站请求。telnet 10.9.8.5 5433 # 或用nc nc -zv 10.9.8.5 5433 - 确认数据库服务器(10.9.8.5)的PostgreSQL服务正常运行:
systemctl status postgresql
内容的提问来源于stack exchange,提问作者user19381782
相关产品推荐
相关产品推荐

