SSH多跳场景下X11转发失败问题排查(旧版本无-J选项)
哥们,你的问题核心有两个:一是复杂的端口转发链里犯了SSH本地转发的基础错误,二是其实完全没必要搞这么多终端和端口转发——直接用嵌套SSH命令就能搞定X11转发,还更简单!
先说说你当前操作的问题出在哪:
你现在的端口转发链之所以失败,核心原因是SSH本地转发(-L)默认只绑定localhost(127.0.0.1)。比如你在TERMINAL2里,HostB上执行的ssh -L 3333:HostC:4444 root@HostC -N,这个命令只会让HostB的127.0.0.1:3333监听流量,而不是HostB的所有网卡地址。
而你的TERMINAL1里,在HostA上执行的ssh -L 2222:HostB:3333 root@HostB -N,是把HostA的2222端口流量转发到HostB的公共IP(或非localhost地址)的3333端口,但HostB的3333端口只监听localhost,自然会返回“Connection refused”——这就是TERMINAL1报错的根源。
如果一定要用你现在的端口转发思路修复,需要在每一层的-L命令里明确指定绑定所有地址,把命令改成这样:
- TERMINAL2(HostB上):
ssh -L *:3333:HostC:4444 root@HostC -N - TERMINAL3(HostC上):
ssh -L *:4444:HostD:22 user@HostD -N
这样每一层的转发端口会监听主机的所有网卡,上层转发的流量才能正常连通。
不过说实话,这个方法太繁琐了!既然你要的是X11转发,直接用嵌套SSH命令就能一步到位,完全不需要开4个终端和一堆端口转发:
# 在HostA的一个终端里直接执行 su - ssh -X root@HostB 'ssh -X root@HostC "ssh -X user@HostD"'
这个命令的逻辑很直白:
- 从HostA以root身份SSH到HostB,同时启用X11转发(-X)
- 在HostB的SSH会话里,自动以root身份SSH到HostC,同样启用X11转发
- 在HostC的SSH会话里,自动以user身份SSH到HostD,启用X11转发
执行完这个命令后,你会直接登录到HostD的user账号下,此时直接敲firefox,X11的画面就会自动转发回HostA的显示器——你已经确认过每台主机的sshd_config里X11Forwarding yes,所以这个方法肯定能行。
要是你还是想用端口转发的方式,除了修改-L的绑定地址,还要确保每一层的端口都没有被其他服务占用,不过嵌套SSH的方法显然更省心,也不容易出错~
备注:内容来源于stack exchange,提问作者robertinho

