Guacamole搭建

2019-07-26 19:31:03

参考链接 Guacamole搭建

前言:


因项目需要,经历多天查阅各种文档,几经波折终于功德圆满,写下此篇文章供大家分享。Guacamole就个人理解而言是一个可以通过web浏览器访问远程服务器终端进行操作的可视化工具。主要由web(浏览器)、Guacamole Server(核心)、Remote Desktops(远程桌面)三大模块组成。


简介:


Guacamole不是一个独立的Web应用程序,由许多部分组成。Web应用程序实际上旨在简单且最小化,大多数gruntwork由较低级别的组件执行。 



用户使用其Web浏览器连接到Guacamole服务器。用JavaScript编写的Guacamole客户端由Guacamole服务器内的Web服务器提供给用户。加载后,此客户端使用Guacamole协议通过HTTP连接回服务器。


部署到Guacamole服务器的Web应用程序读取Guacamole协议并将其转发给guacd(本机Guacamole代理)。该代理实际上解释了Guacamole协议的内容,代表用户连接到任意数量的远程桌面服务器。


Guacamole协议与guacd结合提供了协议不可知性:Guacamole客户端和Web应用程序都不需要知道实际使用的远程桌面协议。


Guacamole协议


Web应用程序根本不了解任何远程桌面协议。它不包含对VNC或RDP或Guacamole堆栈支持的任何其他协议的支持。它实际上只了解Guacamole协议,这是一种用于远程显示渲染和事件传输的协议。虽然具有这些属性的协议自然具有与远程桌面协议相同的能力,但远程桌面协议和Guacamole协议背后的设计原则是不同的:Guacamole协议不旨在实现特定桌面环境的功能。


作为远程显示和交互协议,Guacamole实现了现有远程桌面协议的超集。因此,向Guacamole添加对特定远程桌面协议(如RDP)的支持涉及编写在远程桌面协议和Guacamole协议之间"翻译"的中间层。实现这样的转换与实现任何本机客户端没有什么不同,除了这个特定的实现呈现为远程显示而不是本地客户端。


处理此转换的中间层是guacd。


guacd


guacd是Guacamole的核心,它动态加载对远程桌面协议(称为"客户端插件")的支持,并根据从Web应用程序收到的指令将它们连接到远程桌面。


guacd是一个守护程序进程,它与Guacamole一起安装并在后台运行,侦听来自Web应用程序的TCP连接。guacd也不了解任何特定的远程桌面协议,而是实现了足够的Guacamole协议来确定需要加载哪些协议支持以及必须将哪些参数传递给它。加载客户端插件后,它将独立于guacd运行,并完全控制自身与Web应用程序之间的通信,直到客户端插件终止。


guacd和所有客户端插件依赖于一个公共库libguac,它使通过Guacamole协议的通信更容易,更抽象。


Web应用程序


用户实际与之交互的Guacamole部分是Web应用程序。


如前所述,Web应用程序不实现任何远程桌面协议。它依赖于guacd,并且只实现一个漂亮的Web界面和身份验证层。


我们选择用Java实现Web应用程序的服务器端,但是没有理由不能用不同的语言编写它。事实上,因为Guacamole是一个API,我们鼓励这样做。


RealMint


Guacamole现在是一个通用的远程桌面网关,但情况并非总是如此。Guacamole 最初是一个用JavaScript编写的纯文本Telnet客户端,名为 RealMint("RealMint"是"终端"的字谜)。它主要是作为一个演示而写的,虽然它的目的是有用,但它的主要声誉只是它是纯粹的JavaScript。


RealMint使用的隧道是用PHP编写的。与Guacamole的HTTP隧道相比,RealMint的隧道仅使用简单的长轮询并且效率低下。RealMint有一个不错的键盘实现,它现在存在于Guacamole键盘代码的部分内容中,但这实际上是RealMint功能和可用性的范围。


鉴于它只是遗留协议的一个实现,并且存在其他几个JavaScript终端仿真器,其中大多数已经完善且稳定,该项目被删除。


VNC客户端


一旦开发人员了解了HTML5 canvas标签,并发现它已经在Firefox和Chrome中实现,那么工作就开始于概念验证JavaScript VNC客户端了。


该客户端纯粹是带有Java服务器组件的JavaScript,并通过将VNC转换为基于XML的版本来工作。它的开发自然是由VNC的功能驱动的,其范围仅限于将单个连接转发给一组用户。虽然相对较慢,但概念验证工作得很好,项目需要一个在线居住的地方,并在SourceForge注册为"Guacamole" - 一个HTML5 VNC客户端。


随着Guacamole的发展并不仅仅是概念验证,对速度的需求也在增加,旧的RealMint风格的长轮询被删除了,就像使用XML一样。


由于当时无法信任WebSocket,并且Java没有针对servlet的WebSocket标准,因此开发了一个等效的基于HTTP的隧道。如果WebSocket因任何原因无法使用,今天仍会使用此隧道。


远程桌面网关


开发了一种更快的基于文本的协议,它可以呈现多个远程桌面协议的功能,而不仅仅是VNC。整个系统被重新架构为一个标准守护进程,guacd和一个公共库libguac,它驱动了守护进程和协议支持,后者变得可扩展。


该项目的范围从适当的VNC客户端扩展到高性能的HTML5远程桌面网关和通用API。在当前状态下,Guacamole可用作访问运行不同远程桌面服务器的任意数量计算机的中央网关。它提供可扩展的身份验证,如果您需要更专业的内容,则可以使用基于HTML5的远程访问的通用API。


部署:


系统环境:


CentOS7 + Tomcat8 + JDK18 + guacamole-server0.9.14


安装JDK:


执行命令:


yum install -y java-1.8.0-openjdk-devel.x86\_64

1

查看是否安装成功:


java -version

1



安装Tomcat:


下载 :https://tomcat.apache.org/download-80.cgi#8.0.53




解压:


tar -xzvf  apache-tomcat-8.0.53.tar.gz

1

配置tomcat以service方式启动:


cd /etc/init.d/


vi tomcat

1

2

3

4



tomcat文本内容:


#!/bin/bash

# description: Tomcat Start Stop Restart

# processname: tomcat8

# chkconfig: 234 20 80

JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64

export JAVA_HOME

PATH=$JAVA_HOME/bin:$PATH

export PATH

CATALINA_HOME=/usr/local/tomcat/apache-tomcat-8.0.53


case $1 in

start)

sh $CATALINA_HOME/bin/startup.sh

;;

stop)

sh $CATALINA_HOME/bin/shutdown.sh

;;

restart)

sh $CATALINA_HOME/bin/shutdown.sh

sh $CATALINA_HOME/bin/startup.sh

;;

esac

exit 0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

配置完成后可通过service tomcat start 命令启动


访问: http://localhost:8080/ 



安装Guacamole-Server


安装环境:


rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro


rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86\_64/nux-dextop-release-0-1.el7.nux.noarch.rpm


yum update -y

1

2

3

4

5

安装依赖:


yum -y install cairo-devel libjpeg-devel libpng-devel uuid-devel

yum -y install ffmpeg-devel  freerdp-devel pango-devel libssh2-devel

yum -y install libtelnet-devel libvncserver-devel pulseaudio-libs-devel

yum -y install openssl-devel libvorbis-devel libwebp-devel

yum -y install freerdp-plugins

1

2

3

4

5

安装包下载:https://guacamole.apache.org/releases/0.9.14/ 



解压并安装:


tar -xzvf guacamole-server-0.9.14.tar.gz


cd /guacamole-server-0.9.14/


./configure --with-init-dir=/etc/init.d

1

2

3

4

5



make && make install

1

启动服务:


service guacd start

1

安装Guacamole-client


将之前下载的guacamole.war包复制在tomcat的webapps下。

mv ./guacamole.war  /usr/local/tomcat/apache-tomcat-8.0.53/webapps

1

2

重新启动tomcat:


service tomcat start

1

配置:


创建/etc/guacamole/文件目录:


mkdir /etc/guacamole/

1

创建guacamole.properties文件:


cd /etc/guacamole/


vi guacamole.properties

1

2

3



guacamole.properties文本内容:



# Hostname and port of guacamole proxy


guacd-hostname: localhost


guacd-port:     4822


enable-websocket: true


enable-clipboard-integration: true


# auth-provider: net.sourceforge.guacamole.net.auth.noauth.NoAuthenticationProvider


# noauth-config: /etc/guacamole/noauth-config.xml


 auth-provider: net.sourceforge.guacamole.net.basic.BasicFileAuthenticationProvider


 basic-user-mapping: /etc/guacamole/user-mapping.xml

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

在/etc/guacamole/目录下创建user-mapping.xml文件:


vi user-mapping.xml

1



user-mapping.xml文本内容:


<user-mapping>

        <authorize  password="123456" username="admin">

                 <connection name="rdp-windows-zongmin">

                        <protocol>rdp</protocol>

                        <param name="hostname">119.XXXX.121.XXXX</param>

                        <param name="port">3389</param>

                        <param name="username">XXXX</param>

                        <param name="password">XXXXXX</param>

                </connection>

                 <connection name="rdp-192.XXXX.41.XXXX">

                        <protocol>rdp</protocol>

                        <param name="hostname">192.XXXX.41.XXXX</param>

                        <param name="port">3389</param>

                        <param name="username">XXXXX</param>

                        <param name="password">XXXXX</param>

                </connection>

                <connection name="ssh-192.XXXX.41.XXXX">

                        <protocol>ssh</protocol>

                        <param name="hostname">192.XXXX.41.XXXX</param>

                        <param name="port">22</param>

                        <param name="username">XXXXX</param>

                        <param name="password">XXXXX</param>

                        <param name="enable-sftp">true</param>

                        <param name="sftp-hostname">192.XXXX.41.XXXX</param>

                        <param name="sftp-root-directory">/data/sftp</param>

                        <param name="sftp-username">XXXXX</param>

                        <param name="sftp-password">XXXXX</param>

                </connection>

                 <connection name="ssh-192.XXXX.41.XXXX">

                        <protocol>ssh</protocol>

                        <param name="hostname">192.XXXX.41.XXXX</param>

                        <param name="port">22</param>

                        <param name="username">XXXXX</param>

                        <param name="password">XXXXX</param>

                        <param name="enable-sftp">true</param>

                        <param name="sftp-hostname">192.XXXX.41.XXXX</param>

                        <param name="sftp-root-directory">/data/sftp</param>

                        <param name="sftp-username">XXXXX</param>

                        <param name="sftp-password">XXXXX</param>

                </connection>

         </authorize>

</user-mapping>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

重新启动服务: service guacd restart


访问: http://localhost:8080/guacamole/#/


登录输入:账号admin密码123456



  • 2020-02-06 13:32:10

    android.os.NetworkOnMainThreadException

    在Android 4.0以上,网络连接不能放在主线程上,不然就会报错android.os.NetworkOnMainThreadException。但是4.0下版本可以不会报错。

  • 2020-02-07 23:46:44

    You must call removeView() on the child's parent first解决办法

    出现这样的情况最多是发生在recyclerView中,holder复用的过程中,多次添加view,第一次添加的时候view有了父类了,可能就是复用引起的。 我是发生在给recyclerView添加广告view的时候发生的。

  • 2020-02-11 17:43:35

    基于VCamera,仿微信录制短视频

    vcamera.so这个确实挺好用,可定制性也挺高,但是确定也不小,需要引入的这个so包,10M啊。对于安装包苛刻的用户,这是致命啊。 我现在是抛弃他了。但是在这里还是记录一下用法吧。防止以后再用他。

  • 2020-02-13 13:37:53

    mysql随机排序

    首页热门栏目需要随机显示几条信息