SSH隧道搭建后RealVNC连接失败,报错“No route to host”求助
channel 3: open failed: connect failed: No route to host 问题描述
我使用以下SSH命令建立隧道以访问远程服务器的VNC服务:
ssh -g -L5912:server:5912 user@host
登录成功后,我能通过命令行正常访问目标服务器的文件,但用RealVNC Viewer连接localhost:12时,客户端提示:
The connection closed unexpectedly.
同时原命令行终端弹出错误:
channel 3: open failed: connect failed: No route to host
我试过更换端口,也查过相关报错帖子,但对SSH隧道不太熟悉,没法解决这个问题,恳请大家帮忙!
排查与解决步骤
让我们一步步拆解问题,从最容易忽略的细节入手:
1. 先检查端口号是否匹配!
你SSH隧道绑定的本地端口是5912,但你尝试连接的是localhost:12——这明显不对应啊!RealVNC应该连接localhost:5912才对。这大概率是导致错误的直接原因,先修正这个连接地址试试。
2. 确认隧道目标地址的可达性
SSH命令里的server:5912,指的是你登录的host服务器能访问到的目标VNC服务器的地址和端口。这里需要确认两个点:
- 如果你写的
server是另一台机器的主机名/IP,先在host服务器上执行telnet server 5912,看看能不能连通。如果连不通,说明host到server的5912端口没有路由,可能是server的防火墙拦截了,或者server的地址写错了。 - 如果你的目标VNC服务就在
host本机上,那应该把隧道目标写成localhost:5912,修改后的SSH命令是:ssh -g -L5912:localhost:5912 user@host
3. 检查目标VNC服务的状态
在目标server上,执行以下命令确认VNC服务是否在监听5912端口:
netstat -tulpn | grep :5912
如果没有任何输出,说明VNC服务要么没启动,要么监听的不是5912端口。你需要调整VNC的配置,或者把SSH隧道的目标端口改成VNC实际监听的端口。
4. 去掉不必要的-g参数
-g参数的作用是允许其他主机连接你的本地隧道端口,但如果你只是自己本机用RealVNC连接,这个参数完全没必要,反而可能带来权限问题。试试去掉它:
ssh -L5912:server:5912 user@host
5. 检查本地端口是否被占用
虽然你说换过端口,但还是可以确认下本地5912端口有没有被其他程序占用:
- Windows系统:打开命令提示符,执行
netstat -ano | findstr :5912 - Linux/macOS系统:执行
lsof -i :5912或netstat -tulpn | grep :5912
如果发现端口被占用,换一个未被使用的端口(比如5901),同时修改SSH命令和RealVNC的连接地址。
6. 排查目标服务器的防火墙规则
如果host能ping通server但连不上5912端口,那大概率是server的防火墙或者安全组拦截了来自host的请求。你需要在server上添加规则,允许host的IP访问5912端口。
内容的提问来源于stack exchange,提问作者Vicente Esnaola

