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

psycopg2连接Redshift超时,SQL客户端却可正常连接的排查求助

Redshift连接问题排查与网络分析

问题背景

我能通过账号密码+SSH方式用SQL客户端正常连接VPC内的Redshift实例,实例关联的安全组允许特定IP的SSH连接且支持公开访问。我额外添加了允许自身IP访问5439端口TCP流量的入站规则,但Python的psycopg2代码始终超时,错误信息如下:

connection to server at "redshift-instance.asdf.us-west-14.redshift.amazonaws.com" (xx.xx.xxx.xxx), port 5439 failed: Operation timed out
Is the server running on that host and accepting TCP/IP connections?

使用的代码如下:

import psycopg2


conf = {
    "dbname": "something",
    "host": "something",
    "port": 5439, # 试过这个和SSH转发的4450端口
    "user": "something",
    "password": "something",
}


def create_conn(*args, **kwargs):
    config = kwargs["config"]
    try:
        conn = psycopg2.connect(
            dbname=config["dbname"],
            host=config["host"],
            port=config["port"],
            user=config["user"],
            password=config["password"],
        )
    except Exception as err:
        print(err, err)
    return conn


print("start")
conn = create_conn(config=conf)
cursor = conn.cursor()
cursor.execute("SELECT * FROM `pg_group`;")
rows = cursor.fetchall()
for row in rows:
    print(row)

额外信息:

  • 运行代码时已开启SSH隧道,尝试过用SSH转发端口4450和Redshift默认端口5439,SSH配置如下:
Host staging-bridge
  HostName xx.xx.xxx.xx
  User user
  LocalForward 4450 redshift-instance.asdf.us-west-14.redshift.amazonaws.com:5439
  IdentityFile ~/.ssh/jumphost_key
  • 控制台显示的节点公网、私网IP与错误信息中的IP不匹配
  • 将conf中的host改为localhost、port设为4450后连接成功,推测是对SSH配置理解有误

排查步骤

1. 验证SSH隧道有效性

  • 用telnet localhost 4450或nc -zv localhost 4450测试本地转发端口是否连通,确认隧道未中断
  • 检查SSH进程状态:运行ps aux | grep staging-bridge确认隧道进程存在,或查看SSH日志(/var/log/auth.log)排查连接异常

2. 修正连接配置

使用SSH隧道时,psycopg2必须指向本地转发端口,正确配置如下:

conf = {
    "dbname": "something",
    "host": "localhost",  # 必须是本地主机,流量通过隧道转发
    "port": 4450,         # 对应SSH配置中的LocalForward端口
    "user": "something",
    "password": "something",
}

错误配置会直接请求Redshift公网IP,因网络路径不通导致超时

3. 排查网络链路

  • 用nslookup redshift-instance.asdf.us-west-14.redshift.amazonaws.com验证域名解析IP是否与控制台一致,若不一致清理本地DNS缓存
  • 用traceroute redshift-instance.asdf.us-west-14.redshift.amazonaws.com排查公网链路是否有丢包或中断

可能的网络问题

  • 公网路径拦截:即使安全组开放5439端口,VPC网络ACL、本地防火墙/代理可能拦截了该端口的出站流量,导致直接连接超时
  • SSH隧道配置错误:LocalForward目标主机填写错误(如跳板机无法解析的私网IP)、本地端口被占用,都会导致隧道转发失效
  • DNS解析异常:第三方DNS或过期缓存导致Redshift域名解析出错误IP,进而连接到无效地址
  • 实例IP变更:Redshift节点IP发生变动,但控制台未及时同步,导致解析IP与实际节点IP不匹配

SSH隧道核心理解纠正

SSH的LocalForward是将本地机器端口映射到跳板机可访问的目标主机端口。配置LocalForward 4450 redshift-instance.asdf.us-west-14.redshift.amazonaws.com:5439后,所有发往localhost:4450的请求会通过SSH隧道转发到跳板机,再由跳板机转发至Redshift的5439端口。

直接连接Redshift域名+5439端口会绕过SSH隧道走公网请求,这就是代码超时的核心原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:55:17