Как установить и настроить 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-адрес.
По умолчанию у Selectel есть только root. Суперпользователь не подходит для работы, поэтому создадим учетную запись обычного пользователя:
adduser myuser
Чтобы запустить программы суперпользователя, нужно дать новому пользователю разрешения, добавив в группу sudo с помощью команды:
usermod -aG sudo myuser
Все следующие действия будем выполнять от его имени.
Чтобы дальше подключаться через глобальную сеть, нам потребуется внешний IP-адрес. Узнать его можно в разделе Серверы в панели управления Selectel.
Облачные серверы Selectel
Виртуальные машины в Москве, Санкт-Петербурге, Новосибирске и Ташкенте с оплатой по потреблению и готовностью меньше минуты.
Установка и настройка 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 установлен в текущий момент можно командой:
cat /etc/X11/default-display-manager/usr/sbin/lightdm
На хостинге Selectel этот шаг пропускаем, а на своей виртуальной машине можем запустить оболочку с помощью команды:
sudo systemctl isolate graphical.target
Или перезагрузить систему и далее выбрать LXDE.
TigerVNC
Сначала рассмотрим, как запустить TigerVNC-сервер в ручном режиме. Для этого установим его на Ubuntu с помощью команды:
sudo apt install tigervnc-standalone-server tigervnc-common
Далее для первого запуска используем команду:
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.
В результате получим окружение, похожее на 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
Команда на стороне клиента:
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 познакомились с запуском демона сервера и рассмотрели вопросы безопасности удаленного подключения.