
Однажды мне потребовалось организовать удаленный доступ к графическому интерфейсу Ubuntu. При этом необходимо было найти решение on-premise, поскольку использовать его предполагалось в корпоративной сети, где доступ к чувствительной информации исключал облачные решения вроде TeamViewer. Кроме того, канал связи с удаленной машиной обладал низкой пропускной способностью.
Сначала я перебрал несколько вариантов знакомых мне решений:
VNC (Virtual Network Computing) — старый протокол, который основан на передаче массивов пикселей по протоколу RFB (Remote Framebuffer) для организации удаленного соединения. Он оказался слишком медленным и требовательным к пропускной способности каналов передачи данных. Особенно это критично для корпоративных сетей, подключенных через VPN, которые хостятся в другой части света;
RDP (Remote Desktop Protocol) — протокол, который позволяет отправлять более сложные графические примитивы и высокоуровневые команды. Обычно используется для организации служб удаленных рабочих столов в Windows, но серверы для Linux также доступны, например xRDP. К минусам можно отнести сложность настройки/конфигурации на стороне хоста.
Я продолжил поиски и открыл для себя еще один способ организации удаленного рабочего стола — протокол NX.
Что такое NX?
В Linux для работы с графическими интерфейсами (GUI) используется X-сервер. Обычно окружения рабочего стола вроде GNOME, KDE или LXDE запускаются поверх Х-сервера, что позволяет запускать другие программы.
Компания NoMachine решила оптимизировать подключение к X-серверу по сети. Так появился протокол NX, который значительно снизил нагрузку на сеть.
NX — это не просто протокол доставки картинки, а, по сути, терминальный сервер для Linux. Он позволяет в удаленной операционной системе авторизовать пользователя, организовать для него полноценный сеанс и запустить в нем графическое окружение. Тот же VNC так не умеет.
На протяжении нескольких лет NoMachine развивала протокол как одноименный коммерческий продукт — NoMachine — и как community-проект FreeNX. Выпуская четвертую версию продукта, NoMachine решила больше не развивать FreeNX. Но сообщество осталось, и от основного репозитория отделилось много форков. Многие были уверены, что лучше знают, как надо. И некоторые из них оказались правы. Так, кроме FreeNX появились X2Go, QVD, RX, Neatx (от Google). Все эти протоколы друг с другом несовместимы, а некоторые уже “умерли”. Я выбрал X2Go.
Преимущества X2Go
Главные преимущества open-source реализации протокола NX X2Go перед аналогами — это:
Высокая скорость в условиях низкой пропускной способности канала передачи данных;
Простота настройки на стороне хоста. Т.к. X2Go работает через SSH, то все, что нужно сделать, — это убедиться, что SSH работает и порт 22 открыт в настройках файервола;
Безопасность — протокол работает поверх SSH (пользователю доступны безопасные механизмы аутентификации, в том числе с ключами). Нет необходимости открывать дополнительный порт в настройках файервола.
Кроме того, X2Go позволяет запускать отдельное приложение на удаленном компьютере, например среду разработки; дает возможность подключаться к запущенной сессии пользователя; имеет свой брокер соединений (полезно для автоматизации рабочих мест).
Также доступны трансляция клиенту звука и видео с сервера, печать на локальном принтере и общие каталоги.
Как установить X2Go
Установка сервера на примере Ubuntu
Стабильные версии сервера и клиента X2Go можно установить из штатных репозиториев актуальных релизов Ubuntu. Необходимо инсталлировать два пакета:
sudo apt-get install x2goserver x2goserver-xsession
Проверяем, что сервер запущен:
sudo systemctl status x2goserver
Если вы используете не Xfce, возможно, потребуется установить дополнительные пакеты для графических оболочек. Например, при использовании Lubuntu подключаем поддержку LFCE:
sudo apt-get install x2golxdebindings
Также может потребоваться создать нового пользователя, если нужен доступ с нескольких рабочих мест.
Установка клиента
Клиентское ПО X2Go для Windows, Linux и OS X можно скачать на сайте проекта. Большой минус - нет поддержки мобильных клиентов, при том что NoMachine поддерживает и Android и iOS. Но клиенты NoMachine с сервером X2Go несовместимы.
Если на локальном компьютере установлена Ubuntu, достаточно добавить пакет x2goclient:
sudo apt-get install x2goclient
А так выглядит клиент X2Go для Windows:


В случае если возникли проблемы с основным клиентом, написанным на Qt, можно использовать альтернативный клиент, написанный на wxPython.

Таким образом я решил свою задачу. Благодарю сообщество и всех, кто работает над этой темой. Буду рад, если мой опыт кому-то поможет.