В сегодняшнем выпуске моего блога я наглядно разберу как управлять системами только лишь через браузер задействовав технологию HTML 5. К удаленным системам я буду подключаться через таким всем известные и наиболее продуктивные способы, как: VNC & RDP, SSH

HTML 5 → Guacamole Server – (guacd):

  • RDP
  • VNC
  • Other (SSH, как пример)

Основная система где развернуто ПО для этой заметке:

CPU = 2

RAM = 4 и тогда все работает, если RAM = 1 то никакого подключения к системам не будет только серый экран.

В основе этой заметке выступит приложение Guacamole позволяющее подключаться по протоколам RDP и VNC к удаленному рабочему столу, используя только браузер. Клиентская часть написана на JavaScript, выполнена с использованием технологий HTML5 и не требует для своей работы установки дополнительных плагинов. Серверная часть написана на Си и реализована через специальный прокси guacd. Взаимодействие прокси и web-приложения осуществляется при помощи прослойки на языке Java, которая может быть запущена под управлением контейнера сервлетов Apache Tomcat. Для реализации поддержки VNC используется библиотека libvncclient, а для RDP — FreeRDP

Первым делом обновляем систему до актуального состояния:

ekzorchik@srv-serv:~$ sudo apt-get update && sudo apt-get upgrade -y

ekzorchik@srv-mon:~$ apt-cache search guacamole

guacamole – HTML5 web application for accessing remote desktops

guacamole-tomcat – Tomcat-based Guacamole install with VNC support

guacd – Guacamole proxy daemon

libguac-client-vnc0 – VNC client plugin for Guacamole

libguac1 – Core Guacamole library used by guacd and client plugins

libguac1-dev – Development headers for the core Guacamole library

ekzorchik@srv-mon:~$ apt-cache show guacamole | grep Version

Version: 0.4.0-1

А на официальном сайте версия данного программного обеспечения есть сборки под мою систему Ubuntu 12.04.5 Server amd64 в виде deb пакетов (не особо рвусь к установке из исходников)

По приведенной ссылке можно скачать подготовленные пакеты для операционных систем

http://sourceforge.net/projects/guacamole/files/legacy/binary/

Из представленного вижу в прочем здесь нечему удивляться, версия находящяяся в репозитариях более старая, чем по этой ссылке, поэтому мой выбор более очевиден, скачиваю:

  • ekzorchik@srv-mon:~$ wget http://downloads.sourceforge.net/project/guacamole/legacy/binary/ubuntu-12.04-amd64/packages/guacamole_0.8.1-1_all.deb
  • ekzorchik@srv-mon:~$ wget http://sourceforge.net/projects/guacamole/files/legacy/binary/ubuntu-12.04-amd64/packages/libguac-client-vnc0_0.7.2-1_amd64.deb
  • ekzorchik@srv-mon:~$ wget http://sourceforge.net/projects/guacamole/files/legacy/binary/ubuntu-12.04-amd64/packages/guacd_0.7.0-2_amd64.deb
  • ekzorchik@srv-mon:~$ wget -c http://sourceforge.net/projects/guacamole/files/legacy/binary/ubuntu-12.04-amd64/packages/libguac-client-rdp0_0.7.4-1_amd64.deb
  • ekzorchik@srv-mon:~$ wget -c http://sourceforge.net/projects/guacamole/files/legacy/binary/ubuntu-12.04-amd64/packages/libguac4_0.7.0-1_amd64.deb
  • ekzorchik@srv-mon:~$ wget http://sourceforge.net/projects/guacamole/files/legacy/binary/ubuntu-12.04-amd64/packages/libguac-client-ssh0_0.8.0-1_amd64.deb
  • ekzorchik@srv-mon:~$ wget http://sourceforge.net/projects/guacamole/files/legacy/binary/ubuntu-12.04-amd64/packages/libguac-dev_0.7.0-1_amd64.deb
  • ekzorchik@srv-mon:~$ wget http://sourceforge.net/projects/guacamole/files/legacy/binary/ubuntu-12.04-amd64/packages/guacamole-tomcat_0.8.0-1_all.deb

Устанавливаю пакеты:

ekzorchik@srv-mon:~$ sudo dpkgi *.deb

устраняю неустановленные зависимости:

ekzorchik@srv-mon:~$ sudo apt-get install -f –y

ekzorchik@srv-mon:~$ sudo apt-get update --fix-missing

ekzorchik@srv-mon:~$ sudo apt-get install -f –y

Теперь установка проходит без проблем.

ekzorchik@srv-mon:~$ sudo dpkg -i *.deb

Restart Tomcat server? Yes

Отлично двигаемся дальше, нужно разобрать, как настроить серверную часть и предопределить настройки, посредством которых будет происходить подключение к удаленным Windows система. Сейчас серверная часть guacamole работает по порту 8080 на адресе: http://localhost:8080/guacamole/

ekzorchik@srv-mon:~$ sudo netstat -tulpn | grep :8080

tcp6 0 0 :::8080 :::* LISTEN 2937/java

Далее предопределю аутентификационные данные для подключения к Web-интерфейсу guacamole, и также здесь можно будет указать настройки подключения, как к удаленному рабочему столу RDP, так и VNC, а также через ssh,telnet:

ekzorchik@srv-mon:~$ sudo nano /etc/guacamole/user-mapping.xml

<user-mapping>

<authorize username="ekzorchik" password="712mbddr@">

<!-- Connection srv-video -->

<connection name="srv-video">

<protocol>rdp</protocol>

<param name="hostname">192.168.0.172</param>

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

<param name="username">Администратор</param>

<param name="password">712mbddr@</param>

<param name="color-depth">16</param>

</connection>

<!--Connection srv-stunnel -->

<connection name="srv-stunnel">

<protocol>ssh</protocol>

<param name="hostname">192.168.0.9</param>

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

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

<param name="password">712mbddr@@@</param>

</connection>

</authorize>

</user-mapping>

Сохраняем внесенные изменения.

Теперь чтобы настройки применились нужно перезапустить службуguacd:

ekzorchik@srv-mon:~$ sudo service guacd restart

* Restarting Guacamole proxy server guacd guacd[5234]: INFO: Guacamole proxy daemon (guacd) version 0.7.0

guacd[5234]: INFO: Unable to bind socket to host ::1, port 4822: Address family not supported by protocol

guacd[5234]: INFO: Successfully bound socket to host 127.0.0.1, port 4822

guacd[5234]: INFO: Exiting and passing control to PID 5235

guacd[5235]: INFO: Exiting and passing control to PID 5238

Сейчас задача в следующем, убрать префикс guacamole, чтобы при заходе на http://IP&DNS я подключался сразу в Web-интерфейс администрирования для этих целей я установлю в систему Web-сервер Apache2:

ekzorchik@srv-mon:~$ sudo apt-get install apache2 –y

ekzorchik@srv-mon:~$ sudo nano /etc/apache2/apache2.conf

ServerName srv-mon

ekzorchik@srv-mon:~$ sudo service apache2 restart

ekzorchik@srv-mon:~$ sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/guacamole.conf

ekzorchik@srv-mon:~$ sudo unlink /etc/apache2/sites-available/default

ekzorchik@srv-mon:~$ sudo unlink /etc/apache2/sites-enabled/000-default

ekzorchik@srv-mon:~$ sudo a2ensite guacamole.conf

ekzorchik@srv-mon:~$ sudo service apache2 reload

ekzorchik@srv-mon:~$ sudo nano /etc/apache2/sites-available/guacamole.conf

<VirtualHost *:80>

ServerAdmin webmaster@localhost

ServerName srv-mon

ProxyPass / http://192.168.0.129:8080/guacamole

# ProxyPassReverse / http://localhost:8080/guacamole

<Location />

Order allow,deny

Allow from all

</Location>

ErrorLog ${APACHE_LOG_DIR}/error.log

LogLevel warn

CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

ekzorchik@srv-mon:~$ sudo service apache2 restart

Syntax error on line 5 of /etc/apache2/sites-enabled/guacamole.conf:

Invalid command ‘ProxyRequests’, perhaps misspelled or defined by a module not included in the server configuration

Action ‘configtest’ failed.

The Apache error log may have more information.

…fail!

ekzorchik@srv-mon:~$ sudo a2enmod proxy

ekzorchik@srv-mon:~$ sudo a2enmod proxy_http

ekzorchik@srv-mon:~$ sudo service apache2 restart

При заходе на Webинтерфейс:

http://192.168.0.129 меня автоматически перенаправляет на http://192.168.0.129:8080/guacamole/

Окно входа в элемент управления доступом к удаленным системам через браузер

Если при вводе аутентификационных данных Вы получаете сообщение: Invalid login ,то следует смотреть логи:

ekzorchik@srv-mon:~$ sudo tail -f /var/log/tomcat6/catalina.2015-02-18.log

Feb 18, 2015 3:13:59 AM org.slf4j.impl.JCLLoggerAdapter warn

WARNING: Authentication attempt from 192.168.0.186 for user “null” failed.

Feb 18, 2015 3:14:47 AM org.slf4j.impl.JCLLoggerAdapter warn

WARNING: Authentication attempt from 192.168.0.186 for user “null” failed.

Feb 18, 2015 3:23:07 AM org.slf4j.impl.JCLLoggerAdapter info

INFO: Reading user mapping file: /etc/guacamole/user-mapping.xml

Feb 18, 2015 3:23:07 AM org.slf4j.impl.JCLLoggerAdapter warn

WARNING: Authentication attempt from 192.168.0.186 for user “ekzorchik” failed.

Feb 18, 2015 3:23:11 AM org.slf4j.impl.JCLLoggerAdapter warn

WARNING: Authentication attempt from 192.168.0.186 for user “admin” failed.

Смотрю еще раз файл настроек:

ekzorchik@srv-mon:~$ sudo nano /etc/guacamole/user-mapping.xml

и вижу, что да я задал пароль, но вот, он как и другие строки ответственные за подключение к система по RDP & VNC закомментированы (

начало комментария: <!—

Конец: –>

Поэтому убираю эти символы обрамляющие следующие строки:

<!-- Connection srv-video Это комментарий не удалять -->

<connection name="srv-video">

<protocol>rdp</protocol>

<param name="hostname">192.168.0.172</param>

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

<param name="username">Администратор</param>

<param name="password">712mbddr@</param>

<param name="color-depth">16</param>

</connection>

После сохраняю полученные изменения и перезапускаю службу:

ekzorchik@srv-mon:~$ sudo service guacd restart

* Restarting Guacamole proxy server guacd guacd[5315]: INFO: Guacamole proxy daemon (guacd) version 0.7.0

guacd[5315]: INFO: Unable to bind socket to host ::1, port 4822: Address family not supported by protocol

guacd[5315]: INFO: Successfully bound socket to host 127.0.0.1, port 4822

guacd[5315]: INFO: Exiting and passing control to PID 5316

guacd[5316]: INFO: Exiting and passing control to PID 5319

ekzorchik@srv-mon:~$ netstat -a --inet | grep :4822

tcp 0 0 localhost:4822 *:* LISTEN

На заметку: описание полей настройки подключения смотреть здесь:

http://guac-dev.org/doc/gug/configuring-guacamole.html

Для безопасности указанных данных используемых удаленным подключение через Webинтерфейс нужно защитить Ваши аутентификационные данные:

Было:

ekzorchik@srv-mon:~$ sudo ls -l /etc/guacamole/user-mapping.xml

-rw-r—– 1 root guacamole-web 1050 Feb 18 11:32 /etc/guacamole/user-mapping.xml

Стало:

ekzorchik@srv-mon:~$ sudo chown tomcat6:tomcat6 /etc/guacamole/user-mapping.xml

ekzorchik@srv-mon:~$ sudo chmod 640 /etc/guacamole/user-mapping.xml

Вместо пароль укажем использовать его хеш (чтобы не святить пароль в чистом виде)

ekzorchik@srv-mon:~$ echo -n 712mbddr@ | md5sum -t

0abfb9da12a2cf9ad423fccc9ded1cfc –

Теперь пробую авторизоваться через Web-интерфейс используя свой логин и пароль: login:ekzorchik,password=712mbddr@ – Ниже так выглядит Web-интерфейс управления удаленными подключениями:

Web-интерфейс по управлению удаленными подключения посредством браузера

В логах записи тому подтверждающие:

ekzorchik@srv-mon:~$ sudo tail -f /var/log/tomcat6/catalina.2015-02-18.log

Feb 18, 2015 4:39:35 AM org.slf4j.impl.JCLLoggerAdapter info

INFO: Reading user mapping file: /etc/guacamole/user-mapping.xml

Feb 18, 2015 4:39:35 AM org.slf4j.impl.JCLLoggerAdapter info

INFO: User “ekzorchik” successfully authenticated from 192.168.0.186.

Feb 18, 2015 4:39:35 AM org.slf4j.impl.JCLLoggerAdapter info

INFO: Login was successful.

Пробую подключиться к хосту: srvstunnel и получаю сообщение:

Connected, waiting for first update..

А после надпись сменилась на

Connection closed

И в чем проблема???? Начинаю разбираться.

Оказывается у меня на системе не доустановлены пакеты осуществляющие удаленное взаимодействие с системами, исправляю это дело:

Guacamole currently supports VNC, RDP, SSH, and telnet. Each protocol corresponds to a separate library that will be built with guacamole-server if you have its corresponding optional dependencies

ekzorchik@srv-mon:~$ sudo apt-get install libfreerdp-dev libpango1.0-dev libssh2-1-dev libvncserver-dev libpulse-dev libssl-dev libvorbis-dev -y

После перезапускаю сервисы:

ekzorchik@srv-mon:~$ sudo service apache2 restart

ekzorchik@srv-mon:~$ sudo service tomcat6 restart

Снова подключаюсь на http://192.168.0.129 – авторизуюсь, выбираю подключение: srvstunnel и получаю то к чему стремился:

Удаленное подключение по SSH в действии

По логам с 192.168.0.9 – я успешно авторизуюсь:

aollo@srv-stunnel:~$ cat /var/log/auth.log | grep aollo | grep 192.168.0.129

Feb 18 13:48:38 srv-stunnel sshd[2713]: Accepted password for aollo from 192.168.0.129 port 55638 ssh2

Feb 18 13:50:22 srv-stunnel sshd[3021]: Accepted password for aollo from 192.168.0.129 port 55640 ssh2

Feb 18 13:50:55 srv-stunnel sshd[3266]: Accepted password for aollo from 192.168.0.129 port 55643 ssh2

Feb 18 13:51:39 srv-stunnel sshd[3516]: Accepted password for aollo from 192.168.0.129 port 55647 ssh2

Но еще обнаружил один косяк – подключиться я подключился, а вот пытаюсь набрать команды и получаю – а ничего не получаю, ничего не реагирует, снова проблемы и снова логи:

ekzorchik@srv-mon:~$ sudo tail -f /var/log/syslog | grep guacd

Feb 18 05:44:05 srv-mon guacd[21008]: Protocol “rdp” selected

Feb 18 05:44:05 srv-mon guacd[21008]: Loading keymap “base”

Feb 18 05:44:05 srv-mon guacd[21008]: Loading keymap “en-us-qwerty”

Feb 18 05:44:05 srv-mon guacd[21008]: No available audio encoding. Sound disabled.

Feb 18 05:44:05 srv-mon guacd[21008]: Starting client

Feb 18 05:44:23 srv-mon guacd[21008]: Error reading instruction: Read timeout: Timeout while waiting for data on socket

Feb 18 05:44:23 srv-mon guacd[21008]: Client finished normally

А при подключении к Windows через RDP у меня серый экран:

Серый экран при удаленном подключении

Если же зайти удаленно на srvvideo (192.168.0.172) вижу, что подключение прошло успешно:

Диспетчер задач показывает что подключение к системе прошло успешно

Как так, вообщем опять читаю логи и документацию более внимательнее:

ekzorchik@srv-mon:~$ sudo nano +95 /etc/tomcat6/server.xml

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

ekzorchik@srv-mon:~$ sudo nano /etc/apache2/sites-available/guacamole.conf

ProxyPass / http://192.168.0.129:8080/guacamole max=20 flushpackets=on

ProxyPassReverse ajp://192.168.0.129:8009/guacamole max=20 flushpackets=on

ekzorchik@srv-mon:~$ sudo service apache2 reload

ekzorchik@srv-mon:~$ sudo service tomcat6 restart

ekzorchik@srv-mon:~$ sudo apt-get install libcairo2-dev libpng12-dev libossp-uuid-dev –y

Не помогло, может у меня просто старая версия: Guacamole 0.8.1 и из-за этого я испытываю сложности выше, поэтому снова в дело вступают исходники скачиваемой последней версии и проработка всех шагов по установки ее в систему:

Откатываю снапшот и начинаю заново:

ekzorchik@srv-mon:~$ sudo apt-get update && sudo apt-get upgrade –y

Устанавливаю в систему необходимые пакеты:

ekzorchik@srv-mon:~$ sudo apt-get install build-essential tomcat7 libpng12-dev libossp-uuid-dev libpulse-dev libcairo2-dev libssl-dev libvncserver-dev libvorbis-dev libssh2-1-dev libpango1.0-dev libfreerdp-dev libfreerdp-dev libpango1.0-dev libssh2-1-dev libvncserver-dev libpulse-dev libssl-dev libvorbis-dev libcairo2-dev libpng12-dev libossp-uuid-dev –y

Скачиваю пакеты guacamole последней версии – 0.9.4:

ekzorchik@srv-mon:~$ wget -O guacamole-server-0.9.4.tar.gz http://sourceforge.net/projects/guacamole/files/current/source/guacamole-server-0.9.4.tar.gz/download

ekzorchik@srv-mon:~$ wget -O guacamole-client-0.9.4.tar.gz http://sourceforge.net/projects/guacamole/files/current/source/guacamole-client-0.9.4.tar.gz/download

ekzorchik@srv-mon:~$ wget -O guacamole-0.9.4.war http://sourceforge.net/projects/guacamole/files/current/binary/guacamole-0.9.4.war/download

Распаковываю:

ekzorchik@srv-mon:~$ tar xfvz guacamole-server-0.9.4.tar.gz

ekzorchik@srv-mon:~$ tar xfvz guacamole-client-0.9.4.tar.gz

Собираю Guacamole Server:

ekzorchik@srv-mon:~/guacamole-server-0.9.4$ ./configure --with-init-dir=/etc/init.d

Устанавливаю приложение guacamole из исходников

ekzorchik@srv-mon:~/guacamole-server-0.9.4$ make

ekzorchik@srv-mon:~/guacamole-server-0.9.4$ sudo make install

ekzorchik@srv-mon:~/guacamole-server-0.9.4$ cd ~/

ekzorchik@srv-mon:~$ sudo mkdir /usr/lib/x86_64-linux-gnu/freerdp/

ekzorchik@srv-mon:~$ sudo ln -s /usr/local/lib/freerdp/*.so /usr/lib/x86_64-linux-gnu/freerdp/

Далее копирую каталог war в каталог Tomcat:

ekzorchik@srv-mon:~$ sudo cp guacamole-0.9.4.war /var/lib/tomcat7/webapps/guacamole.war

ekzorchik@srv-mon:~$ sudo mkdir {/etc/guacamole,/usr/share/tomcat7/.guacamole}

ekzorchik@srv-mon:~$ sudo cp guacamole-client-0.9.4/guacamole/doc/example/{guacamole.properties,user-mapping.xml} /etc/guacamole/

ekzorchik@srv-mon:~$ sudo ln -s /etc/guacamole/guacamole.properties /usr/share/tomcat7/.guacamole/guacamole.properties

ekzorchik@srv-mon:~$ sudo nano /etc/guacamole/guacamole.properties

# Hostname and port of guacamole proxy

guacd-hostname: localhost

guacd-port: 4822

# Auth provider class (authenticates user/pass combination, needed if using the provided $

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

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

ekzorchik@srv-mon:~$ sudo nano /etc/guacamole/user-mapping.xml

<user-mapping>

<authorize username="ekzorchik" password="712mbddr@">

<!-- Connection srv-video -->

<connection name="srv-video">

<protocol>rdp</protocol>

<param name="hostname">192.168.0.172</param>

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

<param name="username">Администратор</param>

<param name="password">712mbddr@</param>

<param name="color-depth">16</param>

</connection>

<!--Connection srv-stunnel -->

<connection name="srv-stunnel">

<protocol>ssh</protocol>

<param name="hostname">192.168.0.9</param>

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

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

<param name="password">712mbddr@@@</param>

</connection>

</authorize>

</user-mapping>

ekzorchik@srv-mon:~$ sudo chown tomcat7:tomcat7 /etc/guacamole/user-mapping.xml

ekzorchik@srv-mon:~$ sudo chmod 600 /etc/guacamole/user-mapping.xml

ekzorchik@srv-mon:~$ sudo service tomcat7 restart

* Stopping Tomcat servlet engine tomcat7 [ OK ]

* Starting Tomcat servlet engine tomcat7 [ OK ]

ekzorchik@srv-mon:~$ sudo service guacd restart

Stopping guacd: SUCCESS (not running)

Starting guacd: /usr/local/sbin/guacd: error while loading shared libraries: libguac.so.9: cannot open shared object file: No such file or directory

FAIL

Доустанавливаю необходимую библиотеку:

ekzorchik@srv-mon:~$ sudo apt-get install libstdc++5

ekzorchik@srv-mon:~$ sudo service guacd stop

Stopping guacd: SUCCESS

ekzorchik@srv-mon:~$ sudo service guacd start

Starting guacd: guacd[30836]: INFO: Guacamole proxy daemon (guacd) version 0.9.4 started

SUCCESS

Вот теперь все хорошо.

Проверяю зайдя на Web-интерфейс

http://192.168.0.129:8080/guacamole/#/login/

Проверяю вход на Web-интерфейс управления

Авторизовавшись получаю:

Авторизовавшись подключась, все работает

Также не могу вводить команды в консоли при подключении к серверу srvstunnel и к Windows станции также серый экран.

БЛИН, что еще надо сделать

Добавил настройки подключения к Server 2008 R2 и подключение прошло

При подключении  к Server 2008 R2 подключение происходит но не отображается

И правда все больше не куда…

Заметил у меня подключение не происходит видимо из-за недостатка памяти на системе

ekzorchik@srv-mon:~$ free -m

total used free shared buffers cached

Mem: 993 902 91 0 37 627

-/+ buffers/cache: 237 756

Swap: 1019 0 1019

Вижу что-то прогрузилось

Немного подождав, экран удаленной системы начинает подгружаться. На системе где запущена серверная часть guacamole просто не хватает оперативной памяти

И действительно увеличив количество оперативной памяти для виртуальной машины (где я сперва тестировал разворачивание Guacamole) все заработало сражу, как установка всего комплекса посредством deb пакетов, так из исходников. Вот так вот я методом ограничения ресурсов вывел для себя рекомендуемые требования для работы серверной части (не менее 1Gb памяти должно быть выделено системе, лучше больше). Для чего вообще вся эта заметка была описана, т. к. я в своей подконтрольной системе использую Zabbix с целью мониторинга контролируемой инфраструктуры, то заведя все ключевые сервисы на мониторинг, позже создав наглядную карту устройств (немного позже я покажу как это сделать, там нет ничего сложного), решил приспособить подключение посредством браузера к системам. А эта заметка полностью смогла реализовать мою задумку. (немного позже я покажу что я имею ввиду под этим в одной из своих заметок). Раз я все показал и наглядно продемонстрировал то буду прощаться, до встречи — с уважением автор блога — ekzorchik.

От ekzorchik

Всем хорошего дня, меня зовут Александр. Я под ником - ekzorchik, являюсь автором всех написанных, разобранных заметок. Большинство вещей с которыми мне приходиться разбираться, как на работе, так и дома выложены на моем блоге в виде пошаговых инструкции. По сути блог - это шпаргалка онлайн. Каждая новая работа где мне случалось работать вносила новые знания и нюансы работы и соответственно я расписываю как сделать/решить ту или иную задачу. Это очень помогает. Когда сам разбираешь задачу, стараешься ее приподнести в виде структурированной заметки чтобы было все наглядно и просто, то процесс усвоения идет в гору. Также прошу на https://win.ekzorchik.ru https://lin.ekzorchik.ru https://net.ekzorchik.ru https://voip.ekzorchik.ru https;//home.ekzorchik.ru