在日常工作中,对于需要远程连接到主机的需求,无论是Windows ,Mac,Linux平台,还是移动端等平台,都有相应的整套解决方案,其中基于标准的协议实现的,有大名鼎鼎的VNC,使用的RFB协议,和Windows远程服务客户端(mstsc),使用的RDP协议 。



但是作为使用者来访问时,都需要安装对应的client,在跨平台使用上会有些许的不便,甚至一些小众的平台无法使用。在如今web大行其道背景下,就有一款产品实现的VNC client的web化,并且免费开源-它就是 noVNC ,先来看看效果,

什么是VNC 和 noVNC?

VNC (Virtual Network Console)是虚拟网络控制台的缩写,分为server端和client端两部分,分别部署完成后在server端简单的配置即可使用,基于TCP的通信。noVNC项目是通过取消VNC Client的安装,直接通过浏览器访问noVNC,然后由noVNC间接访问VNC server来达到client web化。从上面部署方式看到,VNC server仍然保留且没有任何修改,处理的始终是TCP流量,但是浏览器和noVNC之间是在http基础上使用WebSocket交互,由于VNC server 无法处理websocket流量,因此引入了 websockify ,noVNC的姐妹项目,负责把WebSocket流量转换为普通的TCP流,使VNC server正常工作。noVNC其实是一个HTML形式的APP,websockify并充当了一个mini web server的角色,当浏览器访问时,会通过网络加载运行noVNC。

部署 noVNC

单节点架构

现在我们按照上图的架构图来部署看看, websockify 和 VNC Server 安装在同一台服务器上。

需要的材料:

python-3.8.10 该版本和以下版本组件组合,验证过能正常运行(python 3.6.8测试异常)

websockify-0.10.0 该项目有python版本和node js版本

noVNC-1.3.0 HTML 形式的app

UltraVNC_1_3_42_X64 适合Windows的VNC,当然也可以试试TightVNC

在服务端安装python,安装UltraVNC,解压noVNC 和 websockify

cmd下,cd到websockify根目录,执行:

python setup.py install

完毕后,任意目录 执行 websockify --help 确认是否安装成功。

然后开启websockify:

websockify.exe 5901 127.0.0.1:5900 --web C:\xxxx\noVNC\noVNC-1.3.0

会有如下输出:
WARNING: no 'resource' module, daemonizing is disabled
WebSocket server settings:
  - Listen on :5901
  - Web server. Web root: C:\Users\Administrator\Desktop\noVNC\noVNC-1.3.0
  - No SSL/TLS support (no cert file)
  - proxying from :5901 to 127.0.0.1:5900

第一个参数 5901: 表示websockify 自身监听的端口,即自身作为min web server向浏览器提供服务的端口

第二个参数 127.0.0.1:5900 表示UltraVNC监听的端口

第三个参数 --web C:\xxxx\noVNC\noVNC-1.3.0 表示min web server(websockify)的网站服务的根目录,即为noVNC-1.3.0的根目录,且该目录下vnc.html文件为主页文件

最后设置UltraVNC密码,确认监听端口为5900:

以上,顺利的话就可以通过浏览器访问该服务器了,注意是此时是HTTP.

http://x.x.x.x:5901/vnc.html

如果更改 noVNC-1.3.0目录下vnc.html 为 index.html,则访问时不用输入vnc.html, 直接 http://x.x.x.x:5901 即可

如果需要部署https,Linux下执行:

openssl req -new -x509 -days 365 -nodes -out self.pem -keyout self.pem

将生成的证书文件self.pem导出到本地,添加到websockify的启动参数中:

websockify.exe 5901 127.0.0.1:5900 --web C:\xxxx\noVNC\noVNC-1.3.0 --cert=C:\xxxx\self.pem

多节点部署noVNC

如果有很多机器需要被远程,也不必每台都部署noVNC+websockify, 只需部署到一台设备,其他设备分别只安装VNC Server端即可,后续访问时在 浏览器请求地址中带上请求参数,送到noVNC,由websockify代理到实际被访问的设备。如下图:

这一块的详细部署请参考这个:https://github.com/novnc/websockify/wiki/Token-based-target-selection

多节点架构

one more things

前面讲到的部署中,websockify,还有UltraVNC 都需要一直运行着,那么把它们都做成Windows系统服务,后台运行,开机启动等 来管理最方便不过了,除了Windows sc命令用来创建系统服务外,还可以借助第三方工具来更方便的创建管理系统服务,

例如 NSSM(the Non-Sucking Service Manager), 比sc强大之处在于可以将任何需要运行的命令或脚本封装成系统服务,而没有sc只能封装exe文件的限制。

借由NSSM封装成系统服务:

解压NSSM,把nssm.exe文件放入c:/Windows文件夹下,cmd执行 nssm --help查看具体用法

nssm install 名称

nssm edit 名称

nssm remove 名称

例如我们运行的websockify,完整命令如下:

C:\Users\Administrator\AppData\Local\Programs\Python\Python38\Scripts\websockify.exe 5901 127.0.0.1:5900 --web C:\Users\Administrator\Desktop\noVNC\noVNC-1.3.0 --cert=C:\Users\Administrator\Desktop\noVNC\self.pem

执行 nssm install noVNC_websockify,弹出GUI,设置路径和参数

websockify.exe 后 全为参数

实际运行环境中,由于历史问题或项目特点需要,多种python版本需要共存,pyenv是一个python解释器版本管理工具,相比于virtualenv这种同一个解释器环境下的 包管理器,上升了一个维度,当然可以二者相结合使用。

pyenv除了隔离python解释器环境,也同步隔离pip包环境,通过pyenv下载指定的解释器版本,可以在各个版本之间方便切换。

Windows特供版本 pyenv-win

安装完毕后:

pyenv install -l 列出可下载的解释器版本

pyenv install 2.4.3 3.8.10

pyenv global 2.4.3 默认版本

pyenv local 3.8.10 特定路径环境下,执行python的版本

pyenv rehash 更新被管理的环境的目录树

pyenv versions 查看版本设定情况

以上,

noVNC 作为一个高性能,开源的项目,被集成到众多公司,项目的控制面板功能当中,例如VMware 的VM console桌面等,当然你也可以集成到任何个人的web项目中,来增加基于web的远程控制的功能。

最后修改:2022 年 08 月 13 日
如果觉得我的文章对你有用,请随意赞赏