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

如何从云环境直连私有网络内的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:5432
    • ServerAliveInterval和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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:07:41