最近在看一些虚拟化解决方案方面的工作,每次都被开网页的虚拟机界面提示安装JRE搞的精神都不好了,因此希望能在浏览器上远程操作虚拟机,不想安装任何插件。
通过搜索发现了Guacamole,一个提供远程桌面的解决方案的开源项目,通过浏览器就能操作虚拟机,适用于Chrome、Firefox、IE9+等浏览器(浏览器需要支持HTML5), 由于使用 HTML5,Guancamole 只要在一个服务器安装成功,你访问你的桌面就是访问一个 web 浏览器。它目前是一个开源的项目,我们可以对Guacamole做修改,适配成我们需要的项目,比如做成自动登录的,加上项目权限验证等。
Guacamole一基于HTML5的远程桌面控制框架,性能较高,官方说接近于原生的VNC,Guacamole不是一个独立的Web应用程序,而是由许多部件组成的。Web应用程序实际上是整个项目里最小最轻量的,大部分的功能依靠Guacamole的底层组件来完成,整个项目的构建如下图:
从上图可以看出,guacamole结构上分为4层,建议先阅读下http://guac-dev.org/doc/gug/guacamole-architecture.html和http://guac-dev.org/doc/gug/guacamole-protocol.html,就可以对Guacamole的架构和协议有个基本的认识。
guacamole程序的流程如下:用户通过浏览器连接到Guacamole的服务端,Guacamole的客户端是用javascript编写的,Guacamole Server通过Web容器(比如Tomcat)把服务提供给用户。一旦加载,客户端通过http承载着Guacamole自己的定义的协议与服务端通信。部署在Guacamole Server这边的Web应用程序,解析到的Guacamole protocal,就传给Guacamole的代理guacd,这个代理(guacd)实际上就是解析Guacamole protocal,替用户连接到远程机器,Guacamole protocal协议本身以及guacd的存在,实现了协议的透明:Guacamole客户端(浏览器运行的JS)和Web应用程序,都不需要知道远程桌面具体用哪个协议(VNC,RDP etc),分为4个大的部分:
①. JS (WebSocket/xmlhttprequest + canvas),普通的用户看到的部分,使用的HTML5与后台进行交互
②. JavaServlet:处理与用户的交互,将页面上的操作请求处理下,再直接与下层的guacd来交互
③. guacd, 底层的daemon,封装了各种RDP协议的中间层,如VNC等。
④. libfreerdp,libssh等,各种通信协议,会被封装成Guacamole的协议
而关于Guacamole的协议 ,JS与JavaServlet, Servlet与guacd交互,都是采用这种格式。这是网上有人从guacd中抓下来的部分日志,与原文一致
远程访问Windows如下图所示:
1. Guacamole完全基于浏览器,不必安装JRE、RDP、VNV等客户端插件,不需要考虑客户的机器环境
其实远程桌面本身有很多实现和协议,可以通过Applet、VNC Viewer、RDP等进行管理,但是都需要客户安装一些插件或者软件,还要区分用户是32位或者64位系统等等,比较繁琐,
而有的客户只是临时使用一下,也不想为自己的机器装一堆软件.
2. Guacamole可以通过一台授权机器管理多台服务器,免于多个管理端登录.
一些复杂的网络环境,可能有很多台服务器,比如防火墙、路由器、文件服务器、路由服务器等等,用户如果想要管理,需要多次打开远程工具,连接不同的设备进行管理,
繁琐而且容易出现密码忘记等问题
3. Guacamole可以穿透防火墙,通过一台服务器管理内容的其它不对外提供网络服务的设备,如下图所示:
除了挂在公网上的服务器,其它设备是没办法直接连接公网的,这时候如果一台设备出现问题,我们是没办法远程调试的,但是通过Guacamole,我们可以管理内网
的多台机器,只要保证Guacamole服务器和内网是可以进行数据通信的,如下图所示:
4. 在云项目中,我们需要面对的就是一个个虚拟机器,我们没办法通过真实的设备查看,只能通过虚拟桌面,而目前远程虚拟桌面大部分都是通过安装各种客户端,
而这里我们可以通过数据库或者XML文件,配置KVM虚拟机的端口,直接通过网页管理虚拟机,设置都不需要再次进行验证,直接登录
5. Guacamole一基于HTML5的远程桌面控制框架,性能较高,官方说接近于原生的VNC,对于一些临时性管理和查看任务足够了.
我安装是基于CentOS6.5 X86_64位进行的,其它版本也相差不大,主要区别也就是编译server的一些依赖库不同.下面的图是安装所需要的所有文件:
其中Maven是client端的编译工具,JDK和Tomcat是运行Client端的环境,mysql、noauth和xml分别是不同授权模式下的配置文件;
而guacamole-server-0.9.6.tar.gz和guacamole-client-0.9.6.tar.gz就是源码了.
开始编译Sever端了:
首先解压压缩包:
进入解压缩后的目录,以后对server端的操作,我们都基于这个目录:
首先我们安装编译必须的gcc make等工具:
安装所有依赖库,主要是RDP、VNC、SSH、TELENT等,不需要那个协议可以不安装:
这里不同的CenOS可能有的装不上:
Telnet协议CentOS已经不能在线安装了,因为安全性太差,这里为了测试,我去RedHat上下的安装包:
安装完成后可以进行Server端的编译了:
configure完成结果是这样,如果你有的协议不需要,support那里可能是no:
运行一下ldconfig命令,使配置生效:
通过脚本激动Server端,如果出现SUCCESS则是成功了
Server端至此编译和安装完成.
首先安装JDK:
安装完成后使用命令验证:
然后是Tomcat和Maven,它们都是绿色版的,只需要解压缩就可以了:
为了操作方便,简化一下目录名称:
启动tomcat,通过进程或者端口查看是否成功:
PS:这里修改了一下环境变量,因为我在后面启动client端的时候发现总是启动失败,查看代码发现这个:
它的代码里读取配置文件的方法有问题,除了改代码,只能先设置环境变量了:
使环境变量生效:
开始编译client端了:
首先解压压缩包:
直接调用mvn命令,这里没设置maven环境变量,只能使用全路径:
为了提高效率,可以跳过测试进行编译
已经开始编译了,扫描工程,共有11个子工程,其中postgresql、ldap工程我用不到,在导入工程时删除了:
编译完成的结果如下图所示:
编译出来的war包,在这个目录下,可以在tomcat中直接部署:
如果你想在eclipse修改代码,可以通过maven命令生成eclipse工程
工程结构如下(删除了ldap和postgresql):
最后我们把编译好的war包拷贝到tomcat的webapps目录下,建立配置文件的文件夹
最后启动tomcat,安装工作就完成了.
Guacamole提供了各种模式的登录和权限机制,这里我只测试我可能会用到的几种:XML、NoAuth、JDBC-Mysql,需要的配置文件如下:
先拷贝配置文件:
修改guacamole.properties如下所示:
添加xml/user-mapping.xml文件的选择,里面都是我们需要监控的机器:
用户名、密码可以有多个,可以明文也可以md5加密:
可以进行SSH、RDP、VNC、TELENT的远程桌面:
这就是登录界面了,用户名密码九就是XML里配置的:
主界面已经把我在xml里配置的主机都列出来了.
只需配置host和port,其它和shell工具一样:
可以命令、可以Tab补全,最牛的是可以VI,基本可以替换shell工具了:
这里用了一个远程的Ubuntu,也只需要主机和端口号:
这里我用的是ubuntu,安装了vnc4server,关于vmc server的安装就省略了:
Telnet不安全,官方不推荐使用了,这里只是测试:
输入用户名和密码就进入了远程主机的dos窗口:
RDP可以只需要主机和端口号,会出现输入用户和密码的界面,如果配置了用户和密码,会直接进入系统 :
输入我们的用户名和密码就可以了:
远程WEB桌面,操作还很流畅的。
Windows因为有了远程桌面,所以VNC只是测试,但是有很多坑啊.
我先用了RealVNC,直接下了专业版,我去,只有它自己的客户端可以连.
后来又用了 TigerVNC连接,页面很卡,后来网上有人说需要把JPEG关掉,页面好点了,但是没有RDP好, 而且有注销问题
NoAuth只是测试,因为没有密码,非常不安全:
配置文件如下所示:
配置基本和XML一样,只是tag标签不同:
只是变了随机的用户名,其它都是一样的
3. JDBC-Mysql模式测试
JDBC模式需要配置host、port、username和password,需要把sql导入数据库:
数据库表如下所示:
登录界面就是user表里的用户名和密码:
随手配置了2个:
配置也有界面了,不用修改xml文件了,直接根据远程主机配置就可以了,最后保存数据库:
连接效果一样:
VNC-Windows也测试一下:
其它远程虚拟桌面基于web的还有noVNC,而OpenStack 就是用noVNC。
noVNC的工作原理:noVNC提供一种在网页上通过html5的Canvas,访问机器上vncserver提供的vnc服务,需要做tcp到 websocket的转化,才能在html5中显示出来。网页就是一个客户端,类似win或linux下面的vncviewer,只是此时填的不是裸露的 vnc服务的ip+port,而是由noVNC提供的websockets的代理,在noVNC代理服务器上要配置每个vnc服务,noVNC提供一个标 识,去反向代理所配置的vnc服务。
noVNC主要问题是目前不支持其它的协议,比如RDP、NX以及Red Hat的Spice协议
来自为知笔记(Wiz)