VNC through SSH tunnel


在无法直接访问目标机器 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!