在日常工作中,对于需要远程连接到主机的需求,无论是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.
如果更改 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,设置路径和参数
实际运行环境中,由于历史问题或项目特点需要,多种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的远程控制的功能。