Apache Guacamole на Ubuntu 24.04: пошаговая установка
Нужен доступ к рабочим машинам из любого браузера, без установки RDP- или VNC-клиента на каждое устройство, с которого вы заходите? Apache Guacamole решает именно эту задачу: сервер сам подключается к нужным машинам по RDP, VNC или SSH и отдаёт вам картинку через HTML5 — клиенту не нужно ничего, кроме браузера. Разберём установку с нуля на Ubuntu 24.04: сборку ядра guacd, веб-интерфейс на Tomcat, базу пользователей в MySQL и вынос всего этого за Nginx с HTTPS.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое Apache Guacamole и зачем он нужен
Guacamole — это clientless remote desktop gateway: шлюз удалённого доступа, не требующий установки агента ни на машине, к которой подключаются, ни на устройстве, с которого заходят. Со стороны целевой машины нужен только стандартный сервер удалённого доступа, который там и так, скорее всего, уже есть — RDP на Windows, VNC на Linux-десктопе, SSH почти везде. Со стороны пользователя нужен только браузер с HTML5 и WebSocket — Guacamole сам транслирует протокол RDP/VNC/SSH в поток картинки и событий ввода поверх обычного HTTPS.
Типичные сценарии: удалённая поддержка сотрудников без раздачи VPN каждому подрядчику, доступ к десятку серверов через одну точку входа с единым логированием сессий, jump-host для инфраструктуры, где напрямую по RDP/SSH наружу ходить не хочется. В отличие от TeamViewer или AnyDesk, Guacamole — это ваша собственная инфраструктура: логины, список подключений и записи сессий не покидают ваш сервер. Плата за это — сервер и открытый порт держите сами, NAT-траверс за вас никто не сделает.
Честно про ограничения: Guacamole не «превращает» машину в доступную удалённо — на целевой стороне уже должен работать RDP, VNC или SSH-сервер, слушающий адрес, до которого дотягивается ваш сервер с Guacamole. Если целевая машина за домашним NAT без проброшенного порта или белого IP — понадобится ещё и VPN/туннель до неё, эту часть Guacamole не решает.
Архитектура: из чего состоит стек
Прежде чем ставить, стоит понимать, из каких частей собирается система — это упрощает диагностику, если что-то не заработает с первого раза:
| Компонент | Роль |
|---|---|
| guacd | Демон на C, «переводчик» RDP/VNC/SSH в протокол Guacamole. Ставится сборкой из исходников. |
| guacamole.war | Веб-клиент — Java-приложение в контейнере сервлетов (Tomcat), отдаёт интерфейс в браузер. |
| guacamole-auth-jdbc | Расширение аутентификации: хранит пользователей и права в MySQL/PostgreSQL вместо XML-файла. |
| MySQL/MariaDB | Хранилище пользователей, подключений и (опционально) истории сессий. |
| Nginx | Терминирует HTTPS, проксирует запросы на Tomcat, включая WebSocket-туннель. |
Понадобится VPS от 2 ГБ RAM (Tomcat и JVM сами по себе съедают заметную часть памяти в простое) с чистой Ubuntu 24.04 и root-доступом — на MAATRIX такой сервер разворачивается за несколько минут, и вы сразу получаете выделенный IP под будущий HTTPS.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверУстановка guacd — ядра, которое подключается к RDP/VNC/SSH
guacd официальных .deb-пакетов под актуальные релизы не имеет — Apache Guacamole распространяет только исходники, поэтому собираем сами. Сначала зависимости для сборки:
apt update && apt upgrade -y
apt install -y build-essential libcairo2-dev libjpeg-turbo8-dev libpng-dev \
libtool-bin uuid-dev libavcodec-dev libavformat-dev libavutil-dev \
libswscale-dev freerdp3-dev libpango1.0-dev libssh2-1-dev libtelnet-dev \
libvncserver-dev libwebsockets-dev libpulse-dev libssl-dev libvorbis-dev \
libwebp-dev pkg-config wget
Обратите внимание: в Ubuntu 24.04 в репозиториях лежит FreeRDP 3 (freerdp3-dev), а не FreeRDP 2. Старые версии guacamole-server (до примерно 1.5.4) с третьим FreeRDP не собирались — если возьмёте древний тарбол из старой инструкции, сборка RDP-плагина упадёт с ошибками несовместимости API. Берите актуальный релиз с официальной страницы.
Скачиваем и собираем:
cd /usr/local/src
GUAC_VERSION=1.5.5 # проверьте актуальную версию на https://guacamole.apache.org/releases/
wget "https://downloads.apache.org/guacamole/${GUAC_VERSION}/source/guacamole-server-${GUAC_VERSION}.tar.gz"
tar xzf "guacamole-server-${GUAC_VERSION}.tar.gz"
cd "guacamole-server-${GUAC_VERSION}"
./configure --with-init-dir=/etc/init.d --with-systemd-dir=/etc/systemd/system
make -j"$(nproc)"
make install
ldconfig
Флаг --with-systemd-dir сразу кладёт unit-файл systemd. Проверьте вывод ./configure — в блоке Protocol support RDP, VNC и SSH должны быть отмечены как included; если какой-то протокол выпал в disabled, значит не хватило dev-пакета под него.
Запускаем демон:
systemctl daemon-reload
systemctl enable --now guacd
systemctl status guacd
По умолчанию guacd слушает 127.0.0.1:4822 — наружу этот порт открывать не нужно, к нему будет ходить только локальный Tomcat.
Tomcat и веб-клиент guacamole.war
Классический guacamole.war рассчитан на пространство имён javax.servlet (Tomcat 9), а Ubuntu 24.04 в штатных репозиториях предлагает Tomcat 10 с jakarta.servlet — это несовместимо на уровне API, и если версия клиента ещё не портирована под Jakarta EE, приложение просто не стартует с ошибками про несуществующие классы. Проверьте на странице релизов, какой Tomcat ожидает текущая версия Guacamole — если явно требуется Tomcat 9, надёжнее развернуть его вручную из официального тарбола, а не полагаться на то, что окажется в apt.
Ручная установка Tomcat 9 (гарантированно совместимый вариант):
useradd -m -d /opt/tomcat -U -s /bin/false tomcat
cd /tmp
TOMCAT_VERSION=9.0.98 # сверьте актуальную версию ветки 9 на https://tomcat.apache.org/download-90.cgi
wget "https://downloads.apache.org/tomcat/tomcat-9/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz"
tar xzf "apache-tomcat-${TOMCAT_VERSION}.tar.gz" -C /opt/tomcat --strip-components=1
chown -R tomcat: /opt/tomcat
Systemd-юнит /etc/systemd/system/tomcat.service:
[Unit]
Description=Apache Tomcat 9
After=network.target
[Service]
Type=simple
User=tomcat
Environment=JAVA_HOME=/usr/lib/jvm/default-java
Environment=CATALINA_HOME=/opt/tomcat
ExecStart=/opt/tomcat/bin/catalina.sh run
ExecStop=/opt/tomcat/bin/catalina.sh stop
Restart=on-failure
[Install]
WantedBy=multi-user.target
Ставим JDK, если его ещё нет, и запускаем:
apt install -y default-jdk
systemctl daemon-reload
systemctl enable --now tomcat
Теперь веб-клиент — версию берите строго ту же, что и у собранного guacd:
mkdir -p /etc/guacamole/{extensions,lib}
cd /tmp
wget "https://downloads.apache.org/guacamole/${GUAC_VERSION}/binary/guacamole-${GUAC_VERSION}.war"
cp "guacamole-${GUAC_VERSION}.war" /opt/tomcat/webapps/guacamole.war
Файл /etc/guacamole/guacamole.properties — минимальная версия, указывающая клиенту, где искать guacd:
guacd-hostname: 127.0.0.1
guacd-port: 4822
Tomcat берёт этот файл через переменную GUACAMOLE_HOME=/etc/guacamole — добавьте её в systemd-юнит (Environment=GUACAMOLE_HOME=/etc/guacamole) и перезапустите сервис. После рестарта интерфейс откроется на http://<IP-сервера>:8080/guacamole/, пока без авторизации через базу — это следующий шаг.
Пользователи и подключения через MySQL
Хранить логины и подключения в XML-файле неудобно уже на второй машине, поэтому сразу подключаем JDBC-расширение с MySQL. Если MySQL ещё не установлен, разверните его по инструкции MySQL на Ubuntu 24.04, затем создайте отдельную базу и пользователя:
CREATE DATABASE guacamole_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'guacamole_user'@'localhost' IDENTIFIED BY 'смените-этот-пароль';
GRANT ALL PRIVILEGES ON guacamole_db.* TO 'guacamole_user'@'localhost';
FLUSH PRIVILEGES;
Скачиваем расширение авторизации и накатываем схему:
cd /tmp
wget "https://downloads.apache.org/guacamole/${GUAC_VERSION}/binary/guacamole-auth-jdbc-${GUAC_VERSION}.tar.gz"
tar xzf "guacamole-auth-jdbc-${GUAC_VERSION}.tar.gz"
cd "guacamole-auth-jdbc-${GUAC_VERSION}/mysql/schema"
cat 001-create-schema.sql 002-create-admin-user.sql | mysql -u root -p guacamole_db
Скрипт 002-create-admin-user.sql создаёт учётку guacadmin с паролем guacadmin — смените его сразу после первого входа, это дефолт, который знают все, кто хоть раз ставил Guacamole.
Копируем сам JAR-плагин и коннектор MySQL в директории, которые Tomcat подхватывает через GUACAMOLE_HOME:
cp guacamole-auth-jdbc-mysql-${GUAC_VERSION}.jar /etc/guacamole/extensions/
cd /tmp
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-j_9.1.0_all.deb
apt install -y ./mysql-connector-j_9.1.0_all.deb
cp /usr/share/java/mysql-connector-j.jar /etc/guacamole/lib/
Точная версия коннектора не критична — берите актуальную со страницы MySQL, если ссылка выше устарела. Дописываем подключение к базе в guacamole.properties:
mysql-hostname: 127.0.0.1
mysql-port: 3306
mysql-database: guacamole_db
mysql-username: guacamole_user
mysql-password: смените-этот-пароль
Перезапускаем Tomcat, заходим на /guacamole/ под guacadmin, меняем пароль в настройках профиля, затем в разделе Connections создаём подключение: тип RDP или VNC, hostname и port целевой машины, логин/пароль. Для RDP не забудьте про Security mode — на современных Windows нужен NLA, иначе подключение молча отваливается на этапе рукопожатия.
Nginx, HTTPS и ограничение доступа
Голый Tomcat на 8080 наружу не публикуем — заворачиваем в Nginx с TLS. Guacamole активно использует WebSocket для туннеля ввода-вывода, поэтому в конфиге обязательны заголовки Upgrade/Connection и увеличенный таймаут, иначе сессия будет обрываться каждые несколько минут простоя:
server {
listen 443 ssl;
server_name guacamole.example.com;
ssl_certificate /etc/letsencrypt/live/guacamole.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/guacamole.example.com/privkey.pem;
location /guacamole/ {
proxy_pass http://127.0.0.1:8080/guacamole/;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 3600s;
}
}
server {
listen 80;
server_name guacamole.example.com;
return 301 https://$host$request_uri;
}
Сертификат проще всего получить через certbot — если сомневаетесь, какой инструмент выбрать, есть отдельный разбор certbot или acme.sh. После выпуска сертификата закрываем всё лишнее фаерволом — подробнее в статье про UFW на Ubuntu 24.04, здесь минимальный набор правил:
ufw allow 22/tcp
ufw allow 80,443/tcp
ufw enable
Портов 8080 (Tomcat) и 4822 (guacd) в этом списке нет — они слушают только 127.0.0.1, наружу не торчат, и единственная публичная дверь — 443 через Nginx. Поскольку Guacamole — по сути, единая точка входа сразу ко всем вашим машинам, эту дверь стоит закрыть второй проверкой: расширение TOTP добавляет одноразовые коды при входе так же, как для панелей управления — подход и логика настройки описаны в статье про двухфакторную аутентификацию для панелей управления.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Нужен ли RDP- или VNC-сервер на удалённой машине?
Да, обязательно. Guacamole — шлюз, а не сервер удалённого доступа сам по себе: он подключается к уже работающему RDP, VNC или SSH и отдаёт результат в браузер.
Подключение зависает на «Connecting…» или сразу рвётся — с чего начать диагностику?
Смотрите журнал: journalctl -u guacd -f. Чаще всего дело в неверном hostname/port, несовпадении режима безопасности RDP (нужен NLA на современных Windows) или фаерволе на стороне целевой машины.
Можно ли использовать Guacamole вместо TeamViewer или AnyDesk?
Как замену для доступа к машинам с известным адресом — да, с полным контролем над логами на своей инфраструктуре. Но NAT-траверс коммерческие сервисы делают сами, а с Guacamole за это отвечаете вы: белый IP или проброшенный порт у целевой машины, либо VPN до неё.
Обязательно ли собирать guacd из исходников?
На конец августа 2026 года — да, официальных .deb-пакетов под актуальные релизы для Ubuntu нет. Есть готовые Docker-образы guacamole/guacd и guacamole/guacamole, избавляющие от сборки, но это уже отдельная схема со своими нюансами сети между контейнерами.
Как записывать сессии для аудита?
В подключении есть параметры recording-path и recording-name — guacd пишет поток событий, который воспроизводится плеером в интерфейсе или конвертируется в MP4 утилитой guacenc.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →