Содержание:

Virtual Network Computing (VNC) – система управления удалённым рабочим столом, использующая протокол RFB (Remote FrameBuffer, англ. «удалённый кадровый буфер»). Соединение осуществляется между двумя устройствами: клиентом (управляющее) и сервером (подчиняющееся).

Взаимодействие между системами происходит путём передачи откликов с периферии клиента (мышь, клавиатура и т. д.) и ретрансляции изображения с удалённого компьютера. Для создания сессии, на каждой из сторон должно быть установлено соответствующее ПО: VNC-клиент (VNC Viewer) и VNC-сервер (VNC Server).

Подробнее узнать, что из себя представляет технология управления удалённым рабочим столом можно здесь.

Далее будет рассказано о том, как установить VNC на Linux и обезопасить подключение. Инструкция подойдёт для двух популярных дистрибутивов: Ubuntu (18.04 и 20.04) и CentOS 7. В качестве VNC-сервера будет использоваться TightVNCServer.

Подготовка

Обновление компонентов

Перед началом выполнения каких-либо действий нужно обновить компоненты системы. Для CentOS также будет установлены дополнительные пакеты: EPEL репозиторий и текстовой редактор Nano.

Ubuntu

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

CentOS

sudo yum update -y && sudo yum upgrade -y && sudo yum install epel-release nano

Установка окружения

Управление системой через подключение VNC осуществляется посредством графической среды. За основу в статье будет взято окружение XFCE, стабильно работающее в связке с TightVNCServer. Чтобы установить эту оболочку со всеми дополнениями, нужно ввести следующую команду в терминал:

Ubuntu

sudo apt install xfce4 xfce4-goodies

CentOS

sudo yum groupinstall xfce

Установка TightVNCServer

Инсталлировать пакет TightVNCServer вместе с зависимостями можно командой:

Ubuntu

sudo apt install tightvncserver -y

CentOS

sudo yum install tigervnc-server -y

Настройка фаервола CentOS

На серверах под управлением CentOS брандмауэр по умолчанию блокирует доступ к сети сторонним программам. Чтобы дать разрешение TightVNCServer открывать сетевые порты, понадобится ввести команду:

sudo firewall-cmd --permanent --zone=public --add-service vnc-server

Теперь нужно применить изменения:

sudo firewall-cmd --reload

Настройка VNC-сервера

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

Запустить VNC-сервер можно следующей командой:

vncserver

TightVNCServer

Далее программа попросит придумать пароль (от 6 до 8 символов), который в дальнейшем будет использоваться для подключения к сессии VNC.

Сменить пароль можно в любой момент командой «vncpasswd».

А также пользователю будет задан вопрос: «Would you like to enter a view-only password (y/n)?» («Вы хотите ввести пароль только для просмотра (да/нет)?») Функция позволяет подключиться к сессии для демонстрации. То есть пользователь будет видеть всё, что происходит на экране, но не сможет управлять удалённым компьютером. Если применять возможность не планируется, то стоит выбрать ответ «n» («нет»).

Ещё важная строка, на которую нужно обратить внимание: «New ‘X’ desktop is test:1» (Ubuntu) или «New ‘test.program.ru:1 (username)’» (CentOS). В предложении говориться о создании новой сессии с порядковым номером «1». Таких «дисплеев» можно запустить несколько и все они будут привязаны к определённым сетевым портам. Например, сессия «1» будет «висеть» по умолчанию на 5901 порте, сессия с номером «2» на 5902 и так далее по порядку.

Подготовка VNC для работы с окружением XFCE

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

 Не стоит забывать, что все действия требуется выполнять с одной и той же учётной записи Linux.

Для начала нужно остановить работающий дисплей. Чуть раньше говорилось, что ему присвоен порядковый номер «1», поэтому команда составляется следующим образом:

vncserver -kill :1

Теперь нужно удалить старый конфигурационный файл, отвечающий за запуск графической оболочки:

rm -f ~/.vnc/xstartup

И создать вместо него новый:

nano ~/.vnc/xstartup

Откроется пустой документ, в который необходимо добавить следующий код:

Ubuntu

#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &

CentOS

#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
exec startxfce4

Для сохранения нужно воспользоваться сочетанием клавиш «Ctrl+X», затем «Y» и подтвердить внесений изменений нажатием «Enter».

Остаётся сделать созданный файл исполняемым:

chmod +x ~/.vnc/xstartup

Настройка автозапуска

После перезагрузки удалённого компьютера, запуск VNC-сервера не будет выполняться самостоятельно. Это можно исправить, добавив службу автозапуска.

Для начала нужно создать скрипт, при выполнении которого будет запускаться TightVNCServer с определённым набором параметров:

sudo nano /usr/local/bin/myvnc

Теперь в открывшийся пустой файл нужно занести следующий код:

#!/bin/bash
PATH="$PATH:/usr/bin/"
DISPLAY="1"
DEPTH="16"
GEOMETRY="1024x768"
OPTIONS="-depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY}"

case "$1" in
start)
/usr/bin/vncserver ${OPTIONS}
;;

stop)
/usr/bin/vncserver -kill :${DISPLAY}
;;

restart)
$0 stop
$0 start
;;
esac
exit 0

Переменные, на которые стоит обратить внимание:

  • «DISPLAY» – номер запускаемой сессии;
  • «DEPTH» – глубина цвета;
  • «GEOMETRY» – разрешение экрана.

Остаётся сделать файл исполняемым, чтобы скрипт стал доступен для запуска:

sudo chmod +x /usr/local/bin/myvnc

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

myvnc start             ###запустить vnc
myvnc stop             ###остановить vnc
myvnc restart         ###перезапустить vnc

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

sudo nano /lib/systemd/system/myvnc.service

В создаваемый файл вносится следующий код:

[Unit]
Description=MyVnc

[Service]
Type=forking
ExecStart=/usr/local/bin/myvnc start
ExecStop=/usr/local/bin/myvnc stop
ExecReload=/usr/local/bin/myvnc restart
User=username

[Install]
WantedBy=multi-user.target

В переменную «User» вводится логин пользователя Linux, от имени которого будет запускаться VNC-сервер.

Теперь нужно сохранить файл и добавить созданную службу в автозагрузку:

sudo systemctl enable myvnc.service

Для применения настроек остаётся перезапустить демон systemd и VNC-сервер следующими командами:

sudo systemctl daemon-reload
myvnc restart

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

Обеспечение безопасности VNC

Использовать VNC в «голом» виде не рекомендуется по нескольким причинам:

  • Отсутствие шифровки трафика.
  • На сервере открыты порты, которые может атаковать злоумышленник.
  • Пароль ограничен 8 символами.

Всё это делает использование VNC небезопасным. Но есть решение проблемы: туннелирование трафика через протокол SSH, который надёжнее реализован и поддерживает шифровку проходящих данных.

Настройка туннелирования трафика через SSH

Для начала нужно запретить доступ к VNC-серверу извне, чтобы исключить возможность атаки по открытому порту (5901, 5902 и т. д.). Для этого необходимо отредактировать скрипт, созданный на ранних этапах настройки TightVNCServer:

sudo nano /usr/local/bin/myvnc

В файле заменяются строки:

OPTIONS="-depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY}"

на

OPTIONS="-depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY} -localhost"

«-localhost» – разрешает подключаться к порту только с самого сервера.

После сохранения скрипта необходимо перезагрузить VNC для применения изменений:

myvnc restart

Подключение

Unix

Выполнить подключение с туннелированием трафика на Unix-системах можно с помощью встроенной консольной утилиты. Команда составляется следующим образом:

ssh user@xxx.xxx.xxx.xxx -L 5901:localhost:5901

Значения, которые нужно изменить на собственные:

  • «user» – имя пользователя;
  • «xxx.xxx.xxx.xxx» – IP-адрес сервера.

Утилита запросит пароль для входа в учётную запись. Внешне подключение будет ничем не отличаться от обычного соединения с сервером через SSH. Туннелирование будет работать до тех пор, пока сессия не будет закрыта.

Windows

Установка соединения на Windows будет рассмотрена на примере распространённого клиента Putty.

Алгоритм подключения
  1. Открыть программу и перейти по пути: «Соединение» -> «SHH» -> «Туннели».
    Туннелирование SSH
  2. В поле «Исходный порт» нужно ввести значение «5901», а в «Назначение» подставить «localhost:5901». Для применения параметров необходимо нажать «Добавить».Можно создать несколько таких профилей, изменив «5901» на значения других портов («5902», «5903» и т. д.), если планируется подключить сразу несколько сессий.
  3. Теперь можно вернуться в исходный раздел «Сеанс», ввести данные для подключения к серверу через SSH и нажать «Соединиться».
    Подключение по SSH

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

  1. В открывшемся окне нужно ввести данные для подключения к серверу. Туннелирование начинает работать с этого момента и проходит незаметно для пользователя. Для поддержания соединения достаточно не прерывать сессию SSH.

Подключение к сессии VNC

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

Сначала нужно открыть TightVNC Viewer и в поле «Remote Host» ввести внешний IP-адрес сервера и порт, разделяя их двоеточием («:»). Если подключение осуществляется с туннелированием трафика, то вместо IP-адреса подставляется стандартное значение локального хоста (например, «localhost» или «127.0.0.1»). Для установки соединения нужно нажать «Connect».

TightVNC Viewer

Откроется окно, в котором программа запросит пароль. Для подтверждения остаётся нажать «ОК».

TightVNC Viewer

В итоге появится изображение рабочего стола с удалённого сервера.

TightVNC Viewer