在无法直接访问目标机器 ip 时,是无法直接进行 VNC 登录的。一种常见的情况是可以通过跳板机进行 ssh,但无法直接 VNC。 VNC 其实就是对机器的特定端口进行专有协议通信。所以只要在自己机器和目标机器的特定端口间,建立一个信道,就可以通过这个信道进行 vnc 通信。而我们与目标机器都可以进行 ssh 通信(即使跳过多个跳板机),且 ssh 协议本身提供了代理转发的功能,所以我们可以 VNC through SSH。
1. 建立 SSH 代理转发
ssh -L <local_port>:<target_host:target_port> <jumper_host>
这条命令会建立一个代理,使得发送至本地 <local_port>
的数据,会通过 <jumper_host>
转发到 <target_host>
的 <target_port>
端口。注意这个命令是启动一个代理服务,代理服务本身需要一直运行,本条命令是不会自己结束的。
2. 多个跳板机转发
例如,我们登录 <target_host>
之前,还需要先登录到跳板机 <jumper_host>
。此时我们可以通过配置 ~/.ssh/config
,实现自动通过跳板机登录 <target_host>
。
HOST jumper # 你给机器起的名字
HostName 1.2.3.4
User AAA
HOST remote_machine # 你给机器起的名字
HostName 10.20.30.1
User BBB
ProxyJump jumper
# ProxyCommand ssh jumper -W %h:%p
在 ~/.ssh/config
配置这样的内容后,就可以通过下面的方式,直接登录 10.20.30.1
这个机器了
ssh remote_machine # 会通过 1.2.3.4 登录 10.20.30.1 的 BBB 账户
这里的跳板机是可以嵌套使用的,上面 config 里 remote_machine 也可以作为另外机器的跳板机。
3. 通过跳板机建立代理,进行 VNC
把 1 和 2 结合其他就可以实现 VNC through SSH tunnel。
ssh -L 5001:<target vnc machine ip>:5900 remote_machine
运行这段命令后,发送到本地的 5001 端口的数据,会转发到 <target vnc machine ip>
的 5900 端口,5900 即是 VNC 协议使用的端口。所以打开 vnc://localhost:5001
即等于打开 vnc://<target vnc machine ip>:5900
。
Done!