Хабрахабр

VPS на Linux с графическим интерфейсом: запускаем сервер VNC на Ubuntu 18.04

Некоторые пользователи арендуют относительно недорогие VPS с Windows для запуска сервиса удаленных рабочих столов. То же самое можно сделать и на Linux без размещения в датацентре собственного железа или аренды выделенного сервера. Кому-то нужна привычная графическая среда для тестов и разработки или удаленный десктоп с широким каналом для работы с мобильных устройств. Есть масса вариантов применения основанной на протоколе Remote FrameBuffer (RFB) системы Virtual Network Computing (VNC). В небольшой статье мы расскажем, как настроить ее на виртуальной машине с любым гипервизором..

Оглавление:

Выбор сервера VNC
Установка и настройка
Запуск службы через systemd
Подключение к рабочему столу

Выбор сервера VNC

Сервис VNC может быть встроен в систему виртуализации, при этом гипервизор свяжет его с эмулируемыми устройствами и никакой дополнительной настройки не потребуется. Этот вариант предполагает значительные накладные расходы и поддерживается далеко не всеми провайдерами — даже в менее ресурсоемкой реализации, когда вместо эмуляции реального графического устройства виртуальной машине передается упрощенная абстракция (фреймбуфер). Иногда VNC-сервер привязывается к работающему X-серверу, но этот способ больше подходит для доступа к физической машине, а на виртуальной он создает ряд технических сложностей. Проще всего установить VNC-сервер со встроенным X-сервером. Он не требует наличия физических устройств (видеоадаптера, клавиатуры и мыши) или их эмуляции с помощью гипервизора, а потому подходит для VPS любого типа.

Установка и настройка

Нам потребуется виртуальная машина с Ubuntu Server 18.04 LTS в конфигурации по умолчанию. В стандартных репозиториях этого дистрибутива есть несколько серверов VNC: TightVNC, TigerVNC, x11vnc и прочие. Мы остановились на TigerVNC — актуальном форке не поддерживаемого разработчиком TightVNC. Настройка других серверов выполняется сходным образом. Также нужно выбрать окружение рабочего стола: оптимальным, на наш взгляд, вариантом будет XFCE из-за относительно невысоких требований к вычислительным ресурсам. Желающие могут установить другой DE или WM: тут все зависит от личных предпочтений, однако выбор ПО напрямую влияет на потребность в оперативной памяти и вычислительных ядрах.

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

sudo apt-get install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils

Дальше необходимо инсталлировать сервер VNC:

sudo apt-get install tigervnc-standalone-server tigervnc-common

Запускать его с правами суперпользователя — плохая идея. Создаем пользователя и группу:

sudo adduser vnc

Добавим пользователя в группу sudo, чтобы он мог решать связанные с администрированием задачи. Если такой потребности нет, этот шаг можно пропустить:

sudo gpasswd -a vnc sudo

На следующем шаге нужно запустить сервер VNC с привилегиями пользователя vnc, чтобы создать безопасный пароль и конфигурационные файлы в каталоге ~/.vnc/. Длина пароля может быть от 6 до 8 символов (лишние обрезаются). При необходимости также задается пароль только для просмотра, т.е. без доступа к клавиатуре и мыши. Следующие команды выполняются от имени пользователя vnc:

su - vncvncserver -localhost no

По умолчанию протокол RFB использует диапазон TCP-портов от 5900 до 5906 — это т.н. порты дисплея, каждый из которых соответствует экрану X-сервера. При этом порты ассоциированы с экранами от :0 по :6. Запущенный нами экземпляр сервера VNC слушает порт 5901 (экран :1). Прочие экземпляры могут работать на других портах с экранами :2, :3 и т. д. Перед дальнейшей настройкой нужно остановить сервер:

vncserver -kill :1

Команда должна вывести примерно такое сообщение: «Killing Xtigervnc process ID 18105… success!».

При запуске TigerVNC выполняет сценарий ~/.vnc/xstartup для настройки параметров конфигурации. Создадим собственный скрипт, предварительно сохранив резервную копию имеющегося, если он существует:

mv ~/.vnc/xstartup ~/.vnc/xstartup.bnano ~/.vnc/xstartup

Сеанс окружения рабочего стола XFCE запускается следующим скриптом xstartup:

#!/bin/bashunset SESSION_MANAGERunset DBUS_SESSION_BUS_ADDRESSxrdb $HOME/.Xresourcesexec /usr/bin/startxfce4 &

Команда xrdb необходима, чтобы система VNC прочитала файл .Xresources в домашнем каталоге. Там пользователь может определить различные параметры графического рабочего стола: рендеринг шрифтов, цвета терминала, темы курсора и т.д. Сценарий необходимо сделать исполняемым:

chmod 755 ~/.vnc/xstartup

На этом настройка сервера VNC завершена. Если запустить его командой vncserver -localhost no (от имени пользователя vnc), можно будет подключиться с заданным ранее паролем и увидеть такую картину:

Запуск службы через systemd

Ручной запуск сервера VNC плохо подходит для боевого применения, поэтому мы настроим системную службу. Команды выполняются от имени root (используем sudo). Для начала создаем новый юнит-файл для нашего сервера:

sudo nano /etc/systemd/system/vncserver@.service

Символ @ в имени позволяет передавать аргумент для настройки службы. В нашем случае он задает порт дисплея VNC. Юнит-файл состоит из нескольких разделов:

[Unit]Description=TigerVNC serverAfter=syslog.target network.target
[Service]Type=simpleUser=vnc Group=vnc WorkingDirectory=/home/vnc PIDFile=/home/vnc/.vnc/%H:%i.pidExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x960 :%iExecStop=/usr/bin/vncserver -kill :%i
[Install]WantedBy=multi-user.target

Затем нужно уведомить systemd о появлении нового файла и активировать его:

sudo systemctl daemon-reloadsudo systemctl enable vncserver@1.service

Цифра 1 в имени задает номер экрана.

Останавливаем сервер VNC, запускаем его как службу и проверяем статус:

# от имени пользователя vnc vncserver -kill :1
# с привилегиями суперпользователяsudo systemctl start vncserver@1sudo systemctl status vncserver@1

Если служба работает, мы должны получить примерно такой результат.

Подключение к рабочему столу

Наша конфигурация не использует шифрование, поэтому сетевые пакеты могут быть перехвачены злоумышленниками. К тому же в VNC-серверах достаточно часто находят уязвимости, так что открывать их для доступа из интернета не стоит. Для безопасного подключения на локальном компьютере нужно упаковать трафик в туннель SSH, а затем настроить клиент VNC. Под Windows можно использовать графический клиент SSH (например, PuTTY). Для безопасности TigerVNC на сервере слушает только localhost и недоступен напрямую из сетей общего пользования:

sudo netstat -ap |more

В Linux, FreeBSD, OS X и прочих UNIX-подобных ОС туннель с клиентского компьютера делается с помощью утилиты ssh (на сервере VNC должен быть запущен sshd):

ssh -L 5901:127.0.0.1:5901 -C -N -l vnc vnc_server_ip

Опция -L привязывает порт 5901 удаленного подключения к порту 5901 на localhost. Опция -C включает сжатие, а -N указывает утилите ssh на отсутствие необходимости выполнять удаленную команду. Опция -l задает login для удаленного входа в систему.

После настройки туннеля на локальном компьютере необходимо запустить клиент VNC и установить соединение с хостом 127.0.0.1:5901 (localhost:5901), использовав для доступа к серверу VNC заданный ранее пароль. Теперь мы можем безопасно взаимодействовать через шифрованный туннель с графическим окружением рабочего стола XFCE на VPS. На скриншоте в эмуляторе терминала запущена утилита top, чтобы показать незначительное потребление виртуальной машиной вычислительных ресурсов. Дальше все будет зависеть от пользовательских приложений.

Установить и настроить сервер VNC в Linux можно практически на любом VPS. Для этого не нужны дорогостоящие и ресурсоемкие конфигурации с эмуляцией видеоадаптера или покупка коммерческих лицензий на программное обеспечение. Помимо рассмотренного нами варианта системной службы есть и другие: запуск в режиме демона (через /etc/rc.local) при загрузке системы или по требованию через inetd. Последний интересен для создания многопользовательских конфигураций. Интернет-суперсервер запустит сервер VNC и свяжет с ним клиента, а VNC-сервер создаст новый экран и начнет сессию. Для аутентификации внутри нее можно использовать графический дисплейный менеджер (например, LightDM), а после отключения клиента сессия будет закрыта и все работающие с экраном программы завершены.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть