VNC (или Virtual Network Computing) – это система удалённого доступа, которая позволяет использовать клавиатуру и мышь для взаимодействия с графическим интерфейсом рабочего стола на удалённом сервере. При помощи VNC можно управлять файлами, программным обеспечением и настройками удалённого сервера, не обращаясь к командной строке.
Этот мануал поможет вам установить VNC с помощью TightVNC на виртуальный сервер Ubuntu 20.04 и настроить безопасное подключение при помощи SSH-туннеля. Затем мы используем клиент VNC на локальной машине, чтобы проверить взаимодействие с сервером через графический интерфейс рабочего стола.
Требования
- Сервер Ubuntu 20.04, настроенный по этому мануалу.
- Локальный компьютер с предустановленным клиентом VNC, который поддерживает VNC-соединения через SSH-туннель. Пользователи Windows могут установить TightVNC, RealVNC или UltraVNC. Пользователи MacOS могут обратиться к встроенному пакету Screen Sharing или использовать кроссплатформенные приложения (например, RealVNC). Пользователи Linux могут выбрать vinagre, krdc, RealVNC, TightVNC и т.п.
1: Установка среды рабочего стола и сервера VNC
Подключившись к серверу по SSH, обновите индекс пакетов:
sudo apt update
Чтобы установить на сервер необходимые пакеты, введите команду:
sudo apt install xfce4 xfce4-goodies
Теперь установите TightVNC:
sudo apt install tightvncserver
Чтобы завершить начальную настройку сервера VNC после его установки и выбрать надёжный пароль, используйте команду vncpasswd.
vncpasswd
Команда предложит выбрать и подтвердить пароль:
You will require a password to access your desktops.
Password:
Verify:
Пароль должен включать от шести до восьми символов. Более длинные пароли будут автоматически сокращены до 8 символов.
Подтвердив свой пароль, вы сможете создать пароль только для просмотра. Он нужен для демонстрации VNC другим пользователям, потому его не обязательно устанавливать.
Если вы в будущем захотите изменить свой пароль или добавить пароль для просмотра, вы можете сделать это с помощью команды vncpasswd.
2: Настройка сервера VNC
Серверу VNC необходимо знать, какие команды выполнять при запуске. Эти команды должны находиться в файле xstartup в каталоге .vnc, который хранится в домашнем каталоге текущего пользователя. Скрипт запуска был создан командой vncserver на этапе установки, но вам нужно создать пользовательский скрипт для взаимодействия с Xfce.
Создайте новый файл xstartup:
nano ~/.vnc/xstartup
Вставьте в него следующие команды:
#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &
При помощи первой команды, xrdb $HOME/.Xresources (она идет сразу после шебанга), GUI сервера VNC читает файл .Xresources. Вторая команда просто запускает Xfce.
Сохраните и закройте файл.
Теперь нужно сделать файл исполняемым:
chmod +x ~/.vnc/xstartup
Перезапустите VNC:
vncserver -localhost
Обратите внимание, команда включает опцию -localhost, которая связывает VNC-сервер с loopback интерфейсом вашего сервера. Это приведет к тому, что VNC будет разрешать подключения только с сервера, на котором он установлен.
Вы получите такой вывод:
New 'X' desktop is your_hostname:1
Starting applications specified in /home/8host/.vnc/xstartup
Log file is /home/8host/.vnc/your_hostname:1.log
Как видите, по умолчанию VNC запускает экземпляр сервера на порт 5901. Этот порт называется дисплейным портом, VNC ссылается на него как :1.
3: Безопасное подключение к VNC
При подключении VNC не использует безопасные протоколы. Создайте SSH-туннель для безопасного подключения к серверу, а затем настройте клиент VNC для поддержки туннеля вместо прямого подключения.
На локальном компьютере создайте соединение SSH, которое перейдет в localhost соединение для VNC. Вы можете сделать это в Linux или macOS через терминал с помощью следующей команды:
ssh -L 59000:localhost:5901 -C -N -l 8host your_server_ip
Локальным портом может быть любой порт, который еще не занят другой программой или процессом, хотя в этом примере мы используем 59000. Обязательно замените 8host именем вашего пользователя Ubuntu и your_server_ip IP-адресом вашего сервера.
Если вы работаете через графический SSH-клиент, например, PuTTY, вы можете создать туннель, кликнув правой кнопкой мыши по верхней панели терминала и выбрав Change Settings…
Найдите ветку Connection в меню в левой части окна Reconfiguration. Разверните ветку SSH и нажмите Tunnels. На экране Options controlling SSH port forwarding укажите 59000 в качестве Source Port и localhost:5901 в качестве Destination.
Затем нажмите кнопку Add, а после этого нажмите Apply, чтобы создать туннель.
После запуска туннеля используйте клиент VNC для подключения к localhost:59000. Вам будет предложено пройти аутентификацию с помощью пароля, который вы установили в разделе 1.
Как только вы подключитесь, вы увидите стандартный рабочий стол Xfce. Вы можете получить доступ к файлам в вашем домашнем каталоге с помощью файлового менеджера или из командной строки.
Нажмите CTRL+C в локальном терминале, чтобы остановить туннель SSH и вернуться в обычную командную строку. Эта комбинация клавиш также завершит сессию VNC.
4: Настройка VNC как сервиса systemd
Теперь нужно настроить VNC как сервис system. Это позволит вам управлять сервером при помощи простых команд, а также добавить его в автозагрузку.
Создайте новый юнит-файл /etc/systemd/system/vncserver@.service:
sudo nano /etc/systemd/system/vncserver@.service
Символ @ в конце имени файла позволит вам передать аргумент, который можно использовать в конфигурации сервиса. С его помощью можно указать порт VNC, который нужно использовать при управлении сервисом.
Добавьте в файл следующие строки. Обязательно измените значение User, Group, WorkingDirectory и имя пользователя в значении PIDFILE.
[Unit]
Description=Start TightVNC server at startup
After=syslog.target network.target
[Service]
Type=forking
User=8host
Group=8host
WorkingDirectory=/home/8host
PIDFile=/home/8host/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 -localhost :%i
ExecStop=/usr/bin/vncserver -kill :%i
[Install]
WantedBy=multi-user.target
Сохраните и закройте файл.
Затем сообщите системе про новый юнит-файл.
sudo systemctl daemon-reload
И включите его:
sudo systemctl enable vncserver@1.service
Цифра 1, идущая за @, определяет, какой номер дисплея должен отображаться в сервисе, в этом случае это значение по умолчанию :1.
Остановите текущий экземпляр сервера VNC, если он еще запущен.
vncserver -kill :1
Теперь попробуйте запустить его как любой другой сервис systemd:
sudo systemctl start vncserver@1
Чтобы убедиться, что сервер запущен, проверьте его состояние:
sudo systemctl status vncserver@1
Теперь сервис VNC добавлен в автозагрузку, и вы можете управлять им при помощи стандартных команд systemctl.
Читайте также: Управление сервисами и юнитами Systemd с помощью Systemctl
Снова запустите туннель SSH, чтобы подключиться в серверу:
ssh -L 59000:localhost:5901 -C -N -l 8host your_server_ip
Создайте новое подключение с клиента VNC на localhost:59000, чтобы протестировать настройку.
Заключение
Теперь на сервере Ubuntu 20.04 установлен сервер VNC. С его помощью вы можете управлять файлами, программами и настройками удалённого сервера (например, удаленно запускать веб-браузер).