Содержание:
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
Далее программа попросит придумать пароль (от 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.
Алгоритм подключения
- Открыть программу и перейти по пути: «Соединение» -> «SHH» -> «Туннели».
- В поле «Исходный порт» нужно ввести значение «5901», а в «Назначение» подставить «localhost:5901». Для применения параметров необходимо нажать «Добавить».Можно создать несколько таких профилей, изменив «5901» на значения других портов («5902», «5903» и т. д.), если планируется подключить сразу несколько сессий.
- Теперь можно вернуться в исходный раздел «Сеанс», ввести данные для подключения к серверу через SSH и нажать «Соединиться».
Чтобы заново не проходить операцию настройки каждый раз, можно сохранить параметры в профиль. Для этого нужно ввести произвольное имя в поле «Управление сеансами» и нажать «Сохранить».
- В открывшемся окне нужно ввести данные для подключения к серверу. Туннелирование начинает работать с этого момента и проходит незаметно для пользователя. Для поддержания соединения достаточно не прерывать сессию SSH.
Подключение к сессии VNC
Подключиться по VNC к Linux можно с помощью клиента TightVNC Viewer, который доступен для загрузки на официальном сайте. Для остальных программ алгоритм установки соединения будет аналогичен.
Сначала нужно открыть TightVNC Viewer и в поле «Remote Host» ввести внешний IP-адрес сервера и порт, разделяя их двоеточием («:»). Если подключение осуществляется с туннелированием трафика, то вместо IP-адреса подставляется стандартное значение локального хоста (например, «localhost» или «127.0.0.1»). Для установки соединения нужно нажать «Connect».
Откроется окно, в котором программа запросит пароль. Для подтверждения остаётся нажать «ОК».
В итоге появится изображение рабочего стола с удалённого сервера.