Как установить и настроить VNC в Ubuntu 20.04 - Академия Selectel

Как установить и настроить VNC в Ubuntu 20.04

Рассказываем, что такое технология VNC и как она работает. А также описываем шаги, которые помогут установить и настроить VNC на сервере с Ubuntu 20.04.

Введение

VNC (Virtual Network Computing) — это технология, которая помогает управлять компьютером удаленно через сеть. С помощью VNC можно решать задачи, обслуживать, администрировать и отлаживать системы без физического присутствия. При этом работать не только с текстовым, но и с графическим интерфейсом.

Технология VNC была создана в 90-е годы исследовательской лабораторией Olivetti & Oracle Research Lab для тонких клиентов. Впервые ее использовали в качестве интерфейса, через который периферийные устройства подключались к операционной системе банкоматов. Когда лаборатория закрылась, команда изобретателей VNC основала компанию RealVNC Ltd и продолжила разработку.

О технологии VNC

Протокол

VNC использует протокол RFB (Remote Framebuffer), который определяет способы кодирования, сжатия, отправки и воспроизведения графических данных. Еще он обрабатывает взаимодействие с пользователем — передает события клавиатуры и мыши от клиента на сервер.

RFB это открытый протокол, который описан в RFC 6143. На него не накладываются лицензионные ограничения проприетарного программного обеспечения. Однако конечный продукт, реализующий VNC-технологию, может быть и коммерческим.

Принцип работы и реализации

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

Есть много реализаций серверов и клиентов — для разных платформ и со своими дополнениями. Какие из них выбрать зависит от системы — Wayland или Xorg, и экранов, которые нужно транслировать — только физические или виртуальные тоже.

Основные реализации:

  • Apple remote desktop — с версии 2 работает по протоколу RFB;
  • RealVNC — бесплатная для личного использования, поддерживается на платформах Windows/MacOS/Linux;
  • Remmina — универсальный графический клиент с поддержкой многих протоколов;
  • TigerVNC — форк TightVNC, поддерживает шифрование;
  • TightVNC — оптимизирован для каналов с низкой пропускной способностью;
  • ThinLinc — использует VNC для передачи графики, ввода с клавиатуры и мыши;
  • UltraVNC (Ubuntu) — решение для удаленного доступа, реализовано только для Windows;
  • vnc4server (Ubuntu) — только сервер от Tristan Richardson, RealVNC Ltd;
  • x11vnc — только сервер, поддерживает расширения UltraVNC, подключается к физической консоли.

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

Под сервером в контексте VNC мы подразумеваем и обычную рабочую станцию, и сервер с графическим окружением. Перед решением задачи нам нужно определить, требуется подключение к физической или виртуальной консоли.

Физическая консоль одна — это то, что мы видим на мониторе, который подключен к нашей машине. Виртуальных может быть много, при этом на мониторе управляемой машины они не отображаются. Дальше в инструкции мы развернем и настроим виртуальный стенд на Linux.

Создание и подготовка ВМ Selectel

В панели управления Selectel заходим в раздел Облачная платформа, Серверы и нажимаем кнопку Создать сервер.

создание сервера

Выбираем конфигурацию с характеристиками не менее 1 vCPU и 2 ГБ RAM.

выбор ОС

Выбираем объем диска до 8 ГБ. Чтобы получить доступ к машине из глобальной сети, выбираем новый публичный IP-адрес.

Диск и IP

По умолчанию у Selectel есть только root. Суперпользователь не подходит для работы, поэтому создадим учетную запись обычного пользователя:

adduser myuser
Создание учётной записи

Чтобы запустить программы суперпользователя, нужно дать новому пользователю разрешения, добавив в группу sudo с помощью команды:

usermod -aG sudo myuser

Все следующие действия будем выполнять от его имени.

Чтобы дальше подключаться через глобальную сеть, нам потребуется внешний IP-адрес. Узнать его можно в разделе Серверы в панели управления Selectel.

Внешний IP

Установка и настройка VNC-сервера на разные графические оболочки

SSH

На нашей удаленной машине должен быть установлен ssh-сервер.

Проверить состояние можно командой:

systemctl status ssh

Если ssh-сервер еще не установлен, исправить это можно так:

sudo apt install openssh-server

После установки ssh-сервер запускается автоматически.

LXDE

Варианты установки VNC-сервера начнем с окружения Lightweight X11 Desktop Environment (LXDE). Подобная конфигурация со средой рабочего стола LXDE используется в Lubuntu.

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

sudo apt update -y && sudo apt upgrade -y

Метапакет, который устанавливает окружение LXDE:

sudo apt install lxde

Если будет выбор, какой display manager использовать, останавливаемся на lightdm.

Выбор display manager

Проверить, какой display manager установлен в текущий момент можно командой:

cat /etc/X11/default-display-manager/usr/sbin/lightdm

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

sudo systemctl isolate graphical.target

Или перезагрузить систему и далее выбрать LXDE.

Выбор desktop environment

TigerVNC

Сначала рассмотрим, как запустить TigerVNC-сервер в ручном режиме. Для этого установим его на Ubuntu с помощью команды:

sudo apt install tigervnc-standalone-server tigervnc-common

Далее для первого запуска используем команду:

vncserver
vncserver при первом запуске

Сервер попросит установить пароль: основной — для управления, и дополнительный — только для просмотра, от него можно отказаться. Длина пароля должна быть 6-8 символов. Пароли длиной более 8 символов будут автоматически обрезаны.

Далее процесс создает необходимые файлы конфигурации по умолчанию и информацию о подключении к серверу. Также он запускает виртуальный экран :1 и прослушивает только loopback-интерфейс на порту tcp/5901. Каждый последующий запущенный экземпляр порождает дополнительный экран :NN и прослушивается на порту tcp/59NN. Шифрование не используется.

Пример запуска с указанием виртуального экрана :23 и прослушиванием на всех интерфейсах, с шифрованием на самоподписанных сертификатах:

vncserver :23 [-localhost no] -SecurityTypes X509Vnc

Опция -localhost используется для прослушивания всех интерфейсов. По умолчанию она принимает значение yes для незащищенных соединений и no для шифрованных.

Просмотреть запущенные экземпляры и их завершение можно с помощью команд:

vncserver -list [:NN]
vncserver -kill (если запущен только один экземпляр)
vncserver -kill {:*|:NN}

Теперь установим и запустим TigerVNC-клиент в Ubuntu. Сделать это можно с помощью команды:

sudo apt install tigervnc-viewer
xtigervncviewer [desktop-u20.lab.local:5923] [-SecurityTypes X509Vnc]

При наличии большого количества удаленных хостов или передаваемых серверу параметров, удобно использовать конфигурационные файлы и передавать их клиенту, как параметр.

Чтобы создать конфигурационный файл, указываем адрес и порт сервера, редактируем необходимые параметры и нажимаем кнопку «Сохранить». Если сохранение дополнительных параметров не требуется, просто нажимаем кнопку «Подключ.»

Подключение

При интерактивной аутентификации VNC-клиент предупреждает о текущем уровне безопасности:

Текущий уровень безопасности

Несмотря на встроенную поддержку шифрования, при подключении через небезопасную среду, например Интернет, рекомендуется подключаться через ssh-туннель.

Когда позволяют требования безопасности, пароль можно передавать клиенту при запуске по команде:

vncviewer -passwd /path/to/server-passwd-file

Далее рассмотрим запуск VNC-сервера в ручном режиме.

В Ubuntu по умолчанию для VNC нет юнита systemd. Для автоматического запуска при старте системы создадим его вручную. За основу можно взять этот systemd файл.

Итак, запускаем редактор:

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

Заполняем его следующим образом:

[Unit]
Description=Remote desktop service (VNC) at %i
After=syslog.target network.target

[Service]
Type=forking
User=<user_name>

# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver -geometry 1280x768 -depth 16 -SecurityTypes X509Vnc %i
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

[Install]
WantedBy=multi-user.target

Где <user_name> заменяем на существующего пользователя. При этом не рекомендуем использовать root.

Для пользователя, от имени которого будет запущен VNC-сервер, обязательно должен существовать файл VNC-пароля, иначе юнит при запуске выдаст ошибку по тайм-ауту.

Далее нужно сообщить systemd об изменении конфигурации юнитов:

sudo systemctl daemon-reload

Теперь можно работать с VNC-сервером как с обычным systemd-юнитом, дополнительно передавая номер дисплея. Так как дисплеи виртуальные, можно запустить несколько экземпляров сервера:

sudo systemctl enable vncserver@:31.service
sudo systemctl start vncserver@:31.service
sudo systemctl start vncserver@:32.service
sudo systemctl stop vncserver@:31.service
sudo systemctl status vncserver@:32.service
Запуск нескольких экземпляров сервера
ss -tl |grep 59
LISTEN  0   	5            	0.0.0.0:5932        	0.0.0.0:*         
LISTEN  0   	5               	[::]:5932           	[::]:*

У ОС Windows нет встроенных средств для подключения к VNC-серверам. Мы рекомендуем использовать UltraVNC Viewer или TigerVNC клиент.

TightVNC

Похож на TigerVNC, но без встроенного шифрования и с менее функциональными ключам. Так, например, -kill требует задания номера дисплея. Таким образом, нет возможности остановить все или единственный работающий дисплей без предварительного анализа его номера.

Для свежеустановленного образа не забываем подготовить окружение. Хотя механизм альтернатив хорошо работает и для VNC-сервера, лучше предварительно удалить TigerVNC, если он установлен:

sudo apt remove tigervnc*
sudo apt install xfonts-base xfonts-75dpi xfonts-100dpi
sudo apt install tightvncserver

Запуск и остановка:

vncserver
vncserver -kill :1

x11vnc

В случае, когда нужно подключиться к физической консоли, а не к виртуальному дисплею, на помощь придет x11vnc.

x11vnc это VNC-сервер для X Window System — X11, просто X или X.org. Он не подойдет для работы с Wayland. При этом Ubuntu 20.04 по умолчанию использует X. В Ubuntu 21.04 запланирован переход на Wayland.

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

echo $XDG_SESSION_TYPE
x11
echo $XDG_SESSION_TYPE
wayland

Этот способ подходит не всегда. Если он не сработает, эта статья поможет найти другой вариант.

В x11vnc реализована только серверная часть. В качестве VNC-клиента можно использовать любой совместимый, например TigerVNC.

Запуск:

x11vnc -display :0 -auth /var/run/lightdm/root/\:0

Этот раздел применим для физической или своей виртуальной машины. В Selectel для Ubuntu 20.04 он не рассматривается — это связано с особенностями дистрибутива и платформы. Если нужно работать с локальной графической консолью, рекомендуем загрузить образ с сайта Ubuntu и выполнить установку из него.

Рабочий стол XFCE

Подготовка окружения

Для начала подготовим машину. Действия будут аналогичны установке LXDE:

sudo apt install xfce4 xfce4-session [xfce4-goodies]

Пакет xfce4-goodies добавляет полезные расширения, которые упрощают работу в XFCE, но не входят в официальный репозиторий. Для демонстрации работы VNC-сервера этот пакет не обязателен.

Пакет xfce4-session нужен для запуска оболочки командой:

startxfce4

Вместо этой команды можно просто перезагрузить компьютер и далее выбрать сеанс Xfce.

сеанс Xfce

В результате получим окружение, похожее на Xubuntu. Если нужно максимально приблизить систему к Xubuntu, можно использовать соответствующие пакеты:

sudo apt install tasksel
sudo tasksel install xubuntu-desktop

Запустить графическую консоль можно только для своей физической или виртуальной машины. На преднастроенном образе Ubuntu 20.04 от Selectel запуск не работает.

Установка и настройка VNC-сервера

В данном случае мы будем использовать сервер TigerVNC. Устанавливаем его с помощью команды:

sudo apt install tigervnc-standalone-server

Чтобы запустить сервер в XFCE нужно подготовить окружение. Для этого создадим или отредактируем уже существующий конфигурационный файл ~/.vnc/xstartup:

mkdir .vnc
vim  ~/.vnc/xstartup

Его содержимое следует привести к виду:

#!/bin/bash

PATH=/usr/bin:/usr/sbin
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
exec startxfce4 &

Войти в режим редактирования можно с помощью клавиши i, далее нажимаем Esc и выходим с сохранением с помощью клавиш Shift+zz.

Теперь можно запустить сервер:

vncserver :23 [-localhost no] -SecurityTypes X509Vnc
Запуск сервера

Сервер запущен и готов принимать подключения. Со стороны клиента подключение выглядит идентично и не зависит от используемой на сервере графической оболочки, поэтому пример подключения к серверу с LXDE, который мы рассматривали выше, полностью применим для сервера с XFCE.

Безопасность VNC

Пароли VNC хранятся в шифрованном, но не стойком виде — используется обратимое шифрование, а не хеширование. Программа vncpwd позволяет их расшифровать. Таким образом, если парольная строка попадет к злоумышленнику, он без труда расшифрует пароль и получит доступ к системе.

Кроме этого, для работы VNC необходимо открыть TCP-порты, что снижает уровень безопасности машины, которая доступна из глобальной или публичной сети, а также увеличивает количество возможных векторов атак.

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

При этом большинство Linux-машин уже имеют настроенную защищенную оболочку ssh, которая позволяет строить зашифрованные туннели, пробрасывая трафик на нужный нам локальный порт.

Используем эту функцию — запустим VNC-сервер с параметром -localhost yes. При этом весь трафик будет шифроваться на уровне ssh.

Команда на сервере:

vncserver :23 -localhost yes -SecurityTypes X509Vnc
Шифрование ssh

Команда на стороне клиента:

vncviewer -via <remote-user>@<remote-host>
[localhost]:<display-number>

Пример:

vncviewer -via user@u20s.example.com localhost:23

Вместо localhost:<display-number> можно указывать порт:

vncviewer -via user@u20s.example.com ::5923

Тогда между хостом и двоеточием необходимо ставить пробел.

Помимо этого, можно использовать встроенную в ssh функцию перенаправления tcp-порта:

ssh -fL 9923:localhost:5923 myuser@79.141.74.160 sleep 10; vncviewer localhost:9923

После установления ssh-туннеля нужно ввести пароль.

Ввод пароля

VNC-клиент принимает в качестве параметра разрешение (-geometry WxH) или полноэкранный режим (-FullScreen).

Выйти из полноэкранного режима можно с помощью клавиши F8 или с помощью команды:

ssh -fL 9923:localhost:5923 myuser@79.141.74.160 sleep 10; 
vncviewer -geometry 800x600 localhost:9923
Выход из полноэкранного режима

Заключение

Мы узнали о технологии VNC и ее возможностях, установили и настроили VNC-сервер в разных графических окружениях Ubuntu 20.04. Также на примере TigerVNC познакомились с запуском демона сервера и рассмотрели вопросы безопасности удаленного подключения.