如何从云环境直连私有网络内的PostgreSQL(不对外开放端口)
可行方案及代码示例
1. 反向SSH隧道(推荐,无需额外云服务)
这种方案利用DB机主动发起的SSH连接建立反向端口映射,让APP机可以通过本地端口直连DB机的PostgreSQL,全程不需要暴露DB机的公网端口,安全性和稳定性都有保障。
操作步骤
- 在APP机上配置SSH服务,建议使用密钥认证(禁用密码登录),确保DB机可以正常SSH登录
- 在DB机上执行反向隧道命令,将APP机的本地端口映射到DB机的PostgreSQL端口:
参数说明:ssh -fN -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -R 127.0.0.1:54320:localhost:5432 app_user@app_host_ip-fN:后台运行SSH进程-R [APP机IP:端口]:[DB机本地IP:端口]:建立反向隧道,将APP机的54320端口转发到DB机的localhost:5432ServerAliveInterval和ServerAliveCountMax:防止SSH连接因闲置断开
- 若要隧道永久稳定运行,可以用
autossh工具自动重连,或者配置systemd服务
Python连接示例
使用psycopg2库连接APP机本地映射的端口:
import psycopg2 from psycopg2 import OperationalError def connect_db(): conn = None try: conn = psycopg2.connect( dbname="your_database", user="your_db_user", password="your_db_password", host="127.0.0.1", port="54320" # 对应APP机上映射的端口 ) print("连接成功") # 执行测试查询 with conn.cursor() as cur: cur.execute("SELECT NOW();") result = cur.fetchone() print("当前时间:", result[0]) except OperationalError as e: print(f"连接失败: {e}") finally: if conn: conn.close() print("连接已关闭") if __name__ == "__main__": connect_db()
2. 云厂商VPC对等连接
如果APP和DB分别在同一云厂商的不同VPC,或者跨云支持对等连接,可以通过VPC对等连接打通两个私有网络,让APP机直接访问DB机的内网IP。
操作步骤
- 在云控制台发起VPC对等连接请求,关联APP所在VPC和DB所在VPC
- 配置双方VPC的路由表,添加指向对方网段的路由规则
- 调整DB机的安全组/防火墙,允许APP所在VPC网段访问5432端口
- APP机直接用DB机的内网IP和默认5432端口连接PostgreSQL
Python连接示例
import psycopg2 from psycopg2 import OperationalError def connect_db(): conn = None try: conn = psycopg2.connect( dbname="your_database", user="your_db_user", password="your_db_password", host="db_private_ip", # DB机的私有网络IP port="5432" ) print("连接成功") with conn.cursor() as cur: cur.execute("SELECT current_user;") user = cur.fetchone()[0] print("当前用户:", user) except OperationalError as e: print(f"连接失败: {e}") finally: if conn: conn.close() print("连接已关闭") if __name__ == "__main__": connect_db()
3. 站点到站点VPN
如果DB机在本地私有网络,APP在云端,可以部署站点到站点VPN(如OpenVPN、IPsec),将本地网络与云端VPC打通,APP机即可通过VPN访问DB机的本地私有IP。
核心要点
- 在本地部署VPN服务器,云端配置VPN客户端或利用云厂商提供的VPN网关
- 配置VPN隧道参数,确保两端网络可以互相通信
- 调整DB机的防火墙规则,允许VPN网段访问5432端口
- APP机直接使用DB机的本地私有IP连接PostgreSQL
内容的提问来源于stack exchange,提问作者James De Souza
相关产品推荐
相关产品推荐

