Guacamole学习笔记

官网: http://guac-dev.org/

1: 介绍:

Guacamole可以同HTML5来代理远程桌面协议(如: VNC, RDP, Telnet, SSH)
    官网: http://guac-dev.org/

2: 架构:

架构图:

image.png

架构解释:

用户通过浏览器连接到Guacamole的服务端, Guacamole通过JS写的客户端是为用户提供服务, 服务端和客户端的通信是基于HTTP的私有协议; web应用就是将浏览器客户端的内容接受处理并转发guacd, 就是一个本地代理, Guacamole的协议和提供给guacd的协议是无关的, Guacamole的客户端和web应用不需要知道具体运行的什么协议.
2.1关于Guacamole协议:
web应用完全不需要理解远程桌面协议, 但必须要理解Guacamole的协议(远程显示渲染和事件传输), 
而作为一个远程显示和交互协议, Guacamole是现有远程连接协议的集合. 想让Guacamole支持一个新的协议 只需要下一个"翻译"协议的中间层即可. 这个中间件就是guacd
2.2关于guacd
guacd是Guacamole动态支持多种远程桌面协议(这里统称为客户端插件)和基于web连接远程桌面协议的核心.
guacd是一个安装在Guacamole上后台运行的守护进程, 等待来自web的连接. guacd也不需要理解特定的远程桌面协议, 一旦客户端插件开始启动, 他和guacd独立运行, 并且拥有和web应用完全的同学权限.
2.3关于web应用
web应用是直接和用户交付的组件.web应用不理解远程桌面协议, 但依赖guacd; web应用的唯一左右就是提供一个漂亮的web界面和认证.
我们目前用java来写的web应用, 但他可以基于任何语言重写; Guacamole的重点在于API.
2.4关于RealMint
Guacamole现在是一个通用的远程桌面网关, 但并不绝对. Guacamole开始于一个纯净的基于文本的JS写的名字叫做ReaMint的telnet客户端, 这个主意起源于演示, 之所以出名主要是由于他是纯JS写的.

RealMint的隧道主要是用PHP写的, 相对于Guacamole的HTTP的隧道, RealMint的隧道只是简单的长轮询, 并且效率低下. 但是RealMint的键盘部分实现的很好, 目前吸收到了Guacamole中, 但也仅此而已了.
2.5关于VNC客户端
一旦开发者掌握了HTML5的canvas标签, 并且看到他已经被Firefox和Chrome支持了, 就有人想做个JS的的VNC客户端的POC.

这个客户端是纯JS实现的,客户端用的JAVA, 通过将VNC翻译为XML版的. 该客户端的开发是基于VNC本身功能驱动的, 开发范围限制于将一个单独的连接转发给一组用户. 虽然看法速度不是很快,但是足够POC和项目需求了. 在SourceForge上通过Guacamole可以找到
2.6 关于远程桌面网关
开发一个基于文本协议的快速协议即可代表多个远程管理协议. 整个系统以后台运行形式重新构建了, 项目的范围扩展到相对于一个快速的HTML5的远程桌面协议功能足够的VNC客户端和通用API. 现在Guacamole可以用作一个中心网关来连接多个运行不同协议的桌面. 同时也提供可扩展的认证, 当然这里就需要可以通过HTML5访问的一个通用API.

3: 安装:

Guacamole有2个部分: 
Guacamole-server: 提供代理和相关依赖库
guacamole-client: 提供服务端容器(如Tomcat)运行的客户端

Guacamole-client可以直接使用二进制程序, 但Guacamole-server就需要通过源码按照了(不要灰心, 很简单的, 并且编译过程也是自动化的)

以下以CentOS为例介绍按照过程:
3.1 服务端安装:
必选依赖:
yum install libjpeg-turbo-devel cairo-devel libjpeg-devel libpng-devel uuid-devel autoconf automake libtool xmvn

可选依赖:
    不同的远程连接协议需要的依赖也不一样:
        VNC: libVNCServer, 
        RDP: FreeRDP - 1.0 or higher, 
        SSH: libssh2, Pango
        telnet: libtelnet,Pango

这里以vnc为例:
    yum install libvncserver-devel


安装Guacamole-server:
     git clone https://github.com/glyptodon/guacamole-server.git
     cd guacamole-server/
     autoreconf -fi
     ./configure --with-init-dir=/etc/init.d
     make
     make install
     ldconfig
3.2 安装客户端
    yum install tomcat
    git clone git://github.com/glyptodon/guacamole-client.git
    cd guacamole-client
    mvn package
    cp guacamole/target/guacamole-0.9.9.war 
    

tomcat监听地址:
    在开启IPV6的情况下, tomcat默认只会监听IPV6, 需要手工调整下tomcat的配置/etc/tomcat/server.xml
    <Connector port="8080" address="192.168.10.11"  protocol="HTTP/1.1"
           connectionTimeout="20000"
           URIEncoding="UTF-8"
           redirectPort="8443" />
  制定监听地址: address="192.168.10.11" #192.168.10.11为本机IP地址

启动服务:
    # service tomcat restart
    Redirecting to /bin/systemctl restart  tomcat.service
    # service guacd restart
    Stopping guacd: SUCCESS (not running)
    Starting guacd: guacd[112397]: INFO:        Guacamole proxy daemon (guacd) version 0.9.9 started
    SUCCESS

虽然现在服务都已经启动,  单身现在的Guacamole并不是完全可用的状态

4 Guacamole配置

Guacamole默认从user-mapping.xml读取所有的用户和连接.
目的如下:
    最小化部署方便
    验证方便

不论认证方式如何, Guacamole的配置主要有2部分组成:
1: 变量GUACAMOLE_HOME所指向的目录: 默认主要从这里寻找配置文件
2: gugcamole.properties: GUacamole和扩展所的主要配置文件
4.1 GUACAMOLE_HOME
Guacamole默认从以以下顺序, 从配置目录中读取配置文件:
1: 系统的guacamole.home属性
2: 系统的GUACAMOLE_HOME变量
3: 运行程序用户的.guacamole目录

Guacamole从$GUACAMOLE_HOME目录中寻找guacamole.properties文件
4.2 guacamole.properties
$GUACAMOLE_HOME目录中包含如下文件:
guacamole.properties:
    决定Guacamole如何连接到guacd, 也可以定义插件
    api-session-timeout: 
        单位: 分钟
        默认: 60
        Guacamole会话的空连接时间
    
guacd-host:
    Guacamole代理的监听地址, 默认localhost

guacd-port:
    Guacamole代理的监听端口, 默认4822

guacd-ssl:
    Web应用和guacd之间是否使用SSL/TLS, 默认false
    
logback.xml:
    Guacamole使用Logabck来记录日志, 默认记录到console, 也可以指定自己的Logback配置文件
    服务代理程序默认会记录日志.

extensions/:
    存放Guacamole的插件, 启动时默认会加载所有已.jar结尾的文件

lib/
    Guacamole会在这里寻找插件所需要的依赖, 改目录下的.jar文件对所有插件可读
4.3 使用默认认证
默认认证的优先级最低, 
配置文件优先级: 
    1: guacamole.properties: 
        user-mapping: /path/to/user-mapping.xml
    2: GUACAMOLE_HOME/user-mapping.xml

内容类似如下:

<user-mapping>
<!-- Per-user authentication and config information -->
<authorize username="USERNAME" password="PASSWORD">
    <protocol>vnc</protocol>
    <param name="hostname">localhost</param>
    <param name="port">5900</param>
    <param name="password">VNCPASS</param>
</authorize>

<!-- Another user, but using md5 to hash the password
     (example below uses the md5 hash of "PASSWORD") -->
<authorize 
        username="USERNAME2"
        password="319f4d26e3c536b5dd871bb2c52e3178"
        encoding="md5">

    <!-- First authorized connection -->
    <connection name="localhost">
        <protocol>vnc</protocol>
        <param name="hostname">localhost</param>
        <param name="port">5901</param>
        <param name="password">VNCPASS</param>
    </connection>

    <!-- Second authorized connection -->
    <connection name="otherhost">
        <protocol>vnc</protocol>
        <param name="hostname">otherhost</param>
        <param name="port">5900</param>
        <param name="password">VNCPASS</param>
    </connection>
</authorize>
</user-mapping>

每一个<authorize></authorize> 就是一个独立的用户
可以通过<connection></connection>对特定的主机和协议授权, 默认只能使用DEFAULT的connection

4.3.1协议配置
* vnc:
    * hostname: VNC服务器的主机名
    * port: vnc端口
    * autoretry: 重试次数
    * password: vnc密码
    * color-depth:  必须是2的次方数
    * read-only: 是否只读
    * clipboard-encoding: 剪切板编码 ISO8859-1/UTF-8/UTF-16/CP1252

    vnc也可以做到支持文件传输和音频传输, 具体可以参考: http://guac-dev.org/doc/gug/configuring-guacamole.html
    RDP/PDU相关参数参考: http://guac-dev.org/doc/gug/configuring-guacamole.html

添加用户不需要重启服务. 该文件的修改会立即生效.
4.4认证配置:
以下使用mysql作为认证后端, Guacamole使用mysql需要如下2个文件:
    # tree /etc/guacamole/
    /etc/guacamole/
    ├── extensions
    │   └── guacamole-auth-jdbc-mysql-0.9.8.jar
    └──  lib
        └── mysql-connector-java-5.1.37-bin.jar

    mysql的依赖可以通过http://dev.mysql.com/downloads/connector/j/ 下载
Guacamole-auth的jar 可以从编译目录下查找

创建mysql配置:
    MariaDB [(none)]> CREATE DATABASE guacamole_db;
    Query OK, 1 row affected (0.00 sec)
    MariaDB [(none)]> CREATE USER 'guacamole_user'@'localhost' IDENTIFIED BY 'guacd_password';
    Query OK, 0 rows affected (0.00 sec)
    MariaDB [(none)]> GRANT SELECT,INSERT,UPDATE,DELETE ON guacamole_db.* TO 'guacamole_user'@'localhost';
    Query OK, 0 rows affected (0.00 sec)
    MariaDB [(none)]> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.00 sec)

数据库创建完毕后就需要对数据库针对Guacamole做基本的配置, 这里可以直接加载sql,
    # locate 001-create-schema.sql | grep mysql
    /root/guacamole-client/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/001-create-schema.sql
    # cd /root/guacamole-client/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema/
    # ls
    001-create-schema.sql  002-create-admin-user.sql  upgrade
    # cat *.sql | mysql  guacamole_db

注意: 如果版本升级了 还需要执行upgrade目录下的sql
    如: mysql guacamole_db < schema/upgrade/upgrade-pre-0.9.6.sql

确认执行成功:
    MariaDB [(none)]> use guacamole_db;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    Database changed
    MariaDB [guacamole_db]> show tables;l
    +---------------------------------------+
    | Tables_in_guacamole_db                |
    +---------------------------------------+
    | guacamole_connection                  |
    | guacamole_connection_group            |
    | guacamole_connection_group_permission |
    | guacamole_connection_history          |
    | guacamole_connection_parameter        |
    | guacamole_connection_permission       |
    | guacamole_system_permission           |
    | guacamole_user                        |
    | guacamole_user_permission             |
    +---------------------------------------+
    9 rows in set (0.00 sec)

    关于各个表的具体解释参加: http://guac-dev.org/doc/gug/jdbc-auth.html

配置Guacamole使用mysql:
    cat /etc/guacamole/guacamole.properties  | grep mysql
    mysql-hostname: 192.168.10.11
    mysql-port: 3306
    mysql-database: guacamole_db
    mysql-username: guacamole_user
    mysql-password: guacd_password
    mysql-default-max-connections-per-user: 0
    mysql-default-max-group-connections-per-user: 0

默认会有一个账号为:guacadmin, 密码也为:guacadmin的用户存在

手工添加用户:
    SET @salt = UNHEX(SHA2(UUID(), 256));

    INSERT INTO guacamole_user (username, password_salt, password_hash) VALUES ('myuser', @salt, UNHEX(SHA2(CONCAT('mypassword', HEX(@salt)), 256)));

手工添加链接:
    INSERT INTO guacamole_connection (connection_name, protocol) VALUES ('test', 'vnc');
    SELECT * FROM guacamole_connection WHERE connection_name = 'test' AND parent_id IS NULL;
    INSERT INTO guacamole_connection_parameter VALUES (1, 'hostname', 'localhost');

5: 使用Guacamole

通过上面, 我们服务安装好了, 也知道配置文件的目录和意义了, 也知道如何使用数据库作为后端认证和存储了; 下面就开始使用Guacamole.
5.1 配置Guacamole
虽然Guacamole文档上说可以直接通过环境变量引用来获取配置文件, 但我这里并没有成功, 最终还是通过在tomcat目录下软连接才通过, 不过依然设置相应的环境变量:
我们将Guacamole的配置目录设置为/etc/guacamole
    1: 将如下内容添加到~/.bashrc 或者 /etc/profile中 
        GUACAMOLE_HOME=/etc/guacamole
        export GUACAMOLE_HOME
    2: 软连接
        ln -s  /etc/guacamole /usr/share/tomcat/.guacamole
    
最终目录如下:
    # tree /etc/guacamole/
    /etc/guacamole/
    ├── extensions
    │   └── guacamole-auth-jdbc-mysql-0.9.9.jar
    ├── guacamole.properties
    └── lib
        └── mysql-connector-java-5.1.37-bin.jar

 重启tomcat,
 通过浏览器连接到 http://$IP:8080/$guacamole_dir
    $IP: 为Guacamole服务器IP
    $guacamole_dir: 为Guacamole的web目录
        # ls /var/lib/tomcat/webapps/
        guacamole-0.9.9  guacamole-0.9.9.war
        如上: $guacamole_dir 为 guacamole-0.9.9
    
 即可看到Guacamole的web界面如下图:
image.png
通过默认的账号密码 即可登录, 
在数据库中添加链接, 既可以在web中使用.
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,591评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,729评论 6 342
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,413评论 25 707
  • 今天下班回家路上,听同事说起她一个女友,借了她2000块钱,有一次同事自己穷得银行卡里还剩下两位数的余额,于是找她...
    梁宛央阅读 1,762评论 0 1
  • 生老离别伊似亲 把酒颜欢何故人 只记今日衔泥恩 哪管当时愁作仇 浮面生得感涕零 未曾谋思谁予安 野燕屋檐碎瓦落 化...
    颜槊阅读 228评论 1 2