一. 介绍

       最近在看一些虚拟化解决方案方面的工作,每次都被开网页的虚拟机界面提示安装JRE搞的精神都不好了,因此希望能在浏览器上远程操作虚拟机,不想安装任何插件。

       通过搜索发现了Guacamole,一个提供远程桌面的解决方案的开源项目,通过浏览器就能操作虚拟机,适用于Chrome、Firefox、IE9+等浏览器(浏览器需要支持HTML5), 由于使用 HTML5,Guancamole 只要在一个服务器安装成功,你访问你的桌面就是访问一个 web 浏览器。它目前是一个开源的项目,我们可以对Guacamole做修改,适配成我们需要的项目,比如做成自动登录的,加上项目权限验证等。

        Guacamole一基于HTML5的远程桌面控制框架,性能较高,官方说接近于原生的VNC,Guacamole不是一个独立的Web应用程序,而是由许多部件组成的。Web应用程序实际上是整个项目里最小最轻量的,大部分的功能依靠Guacamole的底层组件来完成,整个项目的构建如下图:

        16112250_UeXI.png

        从上图可以看出,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如下图所示:

           16112251_WkKV.png


二. 部署环境和优势

       1. Guacamole完全基于浏览器,不必安装JRE、RDP、VNV等客户端插件,不需要考虑客户的机器环境

             其实远程桌面本身有很多实现和协议,可以通过Applet、VNC Viewer、RDP等进行管理,但是都需要客户安装一些插件或者软件,还要区分用户是32位或者64位系统等等,比较繁琐,

       而有的客户只是临时使用一下,也不想为自己的机器装一堆软件.

       2. Guacamole可以通过一台授权机器管理多台服务器,免于多个管理端登录.

             一些复杂的网络环境,可能有很多台服务器,比如防火墙、路由器、文件服务器、路由服务器等等,用户如果想要管理,需要多次打开远程工具,连接不同的设备进行管理,

       繁琐而且容易出现密码忘记等问题

      3. Guacamole可以穿透防火墙,通过一台服务器管理内容的其它不对外提供网络服务的设备,如下图所示:

             

             除了挂在公网上的服务器,其它设备是没办法直接连接公网的,这时候如果一台设备出现问题,我们是没办法远程调试的,但是通过Guacamole,我们可以管理内网

      的多台机器,只要保证Guacamole服务器和内网是可以进行数据通信的,如下图所示:

             

      4. 在云项目中,我们需要面对的就是一个个虚拟机器,我们没办法通过真实的设备查看,只能通过虚拟桌面,而目前远程虚拟桌面大部分都是通过安装各种客户端,

          而这里我们可以通过数据库或者XML文件,配置KVM虚拟机的端口,直接通过网页管理虚拟机,设置都不需要再次进行验证,直接登录

      5. Guacamole一基于HTML5的远程桌面控制框架,性能较高,官方说接近于原生的VNC,对于一些临时性管理和查看任务足够了.

三. 安装

1. 安装环境说明

        我安装是基于CentOS6.5 X86_64位进行的,其它版本也相差不大,主要区别也就是编译server的一些依赖库不同.下面的图是安装所需要的所有文件:

       16112254_BvWv.png

      其中Maven是client端的编译工具,JDK和Tomcat是运行Client端的环境,mysql、noauth和xml分别是不同授权模式下的配置文件;

      而guacamole-server-0.9.6.tar.gz和guacamole-client-0.9.6.tar.gz就是源码了.

2. 安装Server

     开始编译Sever端了:

     首先解压压缩包:

       7c7f08d3-13a6-435f-b0bf-cc713bc952ab.png

     进入解压缩后的目录,以后对server端的操作,我们都基于这个目录:

       3b3c5959-48d7-4278-ae5d-c3bc41e157f2.png

      首先我们安装编译必须的gcc make等工具:

       16112254_bZhO.png

       安装所有依赖库,主要是RDP、VNC、SSH、TELENT等,不需要那个协议可以不安装:

       

       

       16112255_1II8.png

      这里不同的CenOS可能有的装不上:

       16112255_4ate.png

      Telnet协议CentOS已经不能在线安装了,因为安全性太差,这里为了测试,我去RedHat上下的安装包:

       16112255_RSvd.png

      安装完成后可以进行Server端的编译了:

       16112255_jMWK.png

      configure完成结果是这样,如果你有的协议不需要,support那里可能是no:

        16112255_vKbm.png  

       16112255_eOPN.png

     运行一下ldconfig命令,使配置生效:

       16112255_GQvm.png

     通过脚本激动Server端,如果出现SUCCESS则是成功了

       16112255_cVVM.png

      Server端至此编译和安装完成.

3. 安装Client

     首先安装JDK:

      16112255_ODLg.png

      安装完成后使用命令验证:

       16112256_zTfY.png

     然后是Tomcat和Maven,它们都是绿色版的,只需要解压缩就可以了:

       16112256_lQmv.png

       16112256_4oax.png

      为了操作方便,简化一下目录名称:

        16112256_Biqk.png

        16112256_cj4X.png

       启动tomcat,通过进程或者端口查看是否成功:

         16112256_PtsU.png

         16112256_Kk2v.png

       PS:这里修改了一下环境变量,因为我在后面启动client端的时候发现总是启动失败,查看代码发现这个:

       3a9a5744-4f5c-4e9a-b9ff-e8821efd2999.png

     它的代码里读取配置文件的方法有问题,除了改代码,只能先设置环境变量了:

       16112257_Yt8p.png

       16112257_7Dry.png

     使环境变量生效:

       16112257_dBg9.png

      开始编译client端了:

      首先解压压缩包:

       16112257_aZI3.png

     直接调用mvn命令,这里没设置maven环境变量,只能使用全路径:

       16112257_wknK.png

      为了提高效率,可以跳过测试进行编译

        16112257_h6Ls.png

      已经开始编译了,扫描工程,共有11个子工程,其中postgresql、ldap工程我用不到,在导入工程时删除了:

        16112258_3Uvt.png

       编译完成的结果如下图所示:

        16112258_njfc.png

      编译出来的war包,在这个目录下,可以在tomcat中直接部署:

        16112258_1xrw.png

       如果你想在eclipse修改代码,可以通过maven命令生成eclipse工程

        

      工程结构如下(删除了ldap和postgresql):

        c8ec25eb-b8c6-4c6c-bbbf-2b2c043d7e32.png

      最后我们把编译好的war包拷贝到tomcat的webapps目录下,建立配置文件的文件夹

       16112259_RhfZ.png

       16112259_D9MW.png

      最后启动tomcat,安装工作就完成了.

        16112259_3Fsj.png

        16112259_Se5f.png

四. 测试

       Guacamole提供了各种模式的登录和权限机制,这里我只测试我可能会用到的几种:XML、NoAuth、JDBC-Mysql,需要的配置文件如下:

         37c5e2b2-ef96-45d9-98f7-58e3f13b5e96.png

1. XML模式测试

       先拷贝配置文件:

        16112300_XjrR.png

       修改guacamole.properties如下所示:

         16112300_XpQZ.png

         16112300_nCij.png

        添加xml/user-mapping.xml文件的选择,里面都是我们需要监控的机器:

          16112300_2zNV.png

        用户名、密码可以有多个,可以明文也可以md5加密:

          16112300_uhe8.png 

          16112300_GBp4.png

       可以进行SSH、RDP、VNC、TELENT的远程桌面:

         16112301_vTeW.png

       这就是登录界面了,用户名密码九就是XML里配置的:

         16112301_ok6J.png

       主界面已经把我在xml里配置的主机都列出来了.

         16112301_7SDN.png

①. 本地主机(Linux)SSH测试

        只需配置host和port,其它和shell工具一样:

          16112302_Bp0P.png

        可以命令、可以Tab补全,最牛的是可以VI,基本可以替换shell工具了:

          16112302_Oytc.png

②. 远程主机(Linux)SSH测试

        这里用了一个远程的Ubuntu,也只需要主机和端口号:

          16112303_eZjm.png

③. 远程主机(Linux)VNC测试

        这里我用的是ubuntu,安装了vnc4server,关于vmc server的安装就省略了:

          16112303_cB2H.png

④. 远程主机(Windows)TELNET测试

        Telnet不安全,官方不推荐使用了,这里只是测试:

          16112304_Nrn3.png

        输入用户名和密码就进入了远程主机的dos窗口:

           16112304_hV59.png

⑤. 远程主机(Windows)RDP测试

        RDP可以只需要主机和端口号,会出现输入用户和密码的界面,如果配置了用户和密码,会直接进入系统 : 

           

           

       输入我们的用户名和密码就可以了:

           16112305_bNMX.png

         远程WEB桌面,操作还很流畅的。

           16112306_6xan.png

⑥. 远程主机(Windows)VNC测试

       Windows因为有了远程桌面,所以VNC只是测试,但是有很多坑啊.

       我先用了RealVNC,直接下了专业版,我去,只有它自己的客户端可以连.

       后来又用了 TigerVNC连接,页面很卡,后来网上有人说需要把JPEG关掉,页面好点了,但是没有RDP好, 而且有注销问题

         16112307_mGfQ.jpg

2. NoAuth模式测试

       NoAuth只是测试,因为没有密码,非常不安全:

       配置文件如下所示:


         16112307_qJjL.png

         16112307_TZl2.png

        配置基本和XML一样,只是tag标签不同:

          16112307_vnTX.png

        只是变了随机的用户名,其它都是一样的

          

3. JDBC-Mysql模式测试

     JDBC模式需要配置host、port、username和password,需要把sql导入数据库:

       16112308_1Wn4.png

        16112308_pYvA.png

       数据库表如下所示:

          16112308_zKmK.png

        登录界面就是user表里的用户名和密码:

           16112309_LFGx.png

            16112309_t5rr.png

          随手配置了2个:

            16112309_OHTb.png

         配置也有界面了,不用修改xml文件了,直接根据远程主机配置就可以了,最后保存数据库:

          16112309_y7Ka.png

         连接效果一样:

           16112310_GgrS.png

         VNC-Windows也测试一下:

           16112310_jKZ6.png

五. 其它工具

        其它远程虚拟桌面基于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)



转载于:https://my.oschina.net/zeyuphoenix/blog/530780

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐