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

使用Parallel-SSH建立SSH隧道遇Socket连接被拒绝问题求助

问题原因分析及解决办法

核心问题1:TunnelServer参数顺序理解错误,本地监听端口未正确配置

parallel-ssh的TunnelServer构造函数参数顺序是固定的:

TunnelServer(client, remote_host, remote_port, bind_address=('127.0.0.1', 0))
  • remote_host/remote_port:是你要通过SSH隧道访问的远程目标服务的地址和端口
  • bind_address:是本地要绑定监听的地址和端口,默认是('127.0.0.1', 0)(0表示系统随机分配端口)

你的代码里把HOST/PORT传给了remote_host/remote_port,同时bind_address=HOST只指定了地址,端口用默认的随机值,之后你去连接(HOST, PORT),但本地根本没监听这个PORT,自然会触发连接拒绝错误。

如果你的需求是本地监听指定PORT,将流量通过SSH转发到远程服务,代码应修改为:

# 替换为实际要访问的远程目标服务地址和端口
serv = TunnelServer(client, REMOTE_TARGET_IP, REMOTE_TARGET_PORT, bind_address=(HOST, PORT))
serv.start()

核心问题2:未等待TunnelServer完全启动

TunnelServer.start()是异步启动的,调用后立刻执行sock.connect(),可能本地监听端口还未完全就绪,导致连接失败。可以通过以下方式确认服务状态:

serv.start()
# 获取本地实际绑定的地址和端口,确认服务已监听
local_host, local_port = serv.sock.getsockname()
print(f"隧道已在本地 {local_host}:{local_port} 启动监听")
# 短暂等待服务就绪(按需调整时长)
import time
time.sleep(1)
# 连接本地监听的端口
sock.connect((local_host, local_port))

其他排查方向

  • 本地防火墙规则是否阻止了对指定PORT的访问
  • 若HOST设置为公网/非本地地址,检查本地进程是否有权限绑定该地址,建议先测试用127.0.0.1作为bind_address的地址

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:22:40