Установка TightVNC на Ubuntu Server 18.04 LTS
По умолчанию серверы Ubuntu 18.04 поставляются без предустановленного графического окружения рабочего стола и сервера VNC. Потому сначала нужно установить эти компоненты. Мы будем использовать пакеты Xfce и TightVNC, доступные в официальном репозитории Ubuntu.
Установка Xfce и TightVNC
Сначала устанавливаем пакет Xfce:
$ sudo apt update $ sudo apt install xfce4 xfce4-goodies
Следом за ним — пакет TightVNC:
$ sudo apt install tightvncserver
Запускаем VNC-сервер командой:
$ vncserver You will require a password to access your desktops. Password: пароль Verify: пароль Would you like to enter a view-only password (y/n)? n xauth: file /home/evgeniy/.Xauthority does not exist New 'X' desktop is vnc-server:1 Creating default startup script /home/evgeniy/.vnc/xstartup Starting applications specified in /home/evgeniy/.vnc/xstartup Log file is /home/evgeniy/.vnc/vnc-server:1.log
При первом запуске vncserver
предложит выбрать и подтвердить пароль. Пароль должен быть длинной от шести до восьми символов. Кроме того, будет возможность создать пароль только для просмотра.
Порты VNC-сервера
При запуске первого экземпляра VNC-сервера без указания порта, сервер будет прослушивать порт 5901 (или :1). При запуске следующего экземпляра сервер будет прослушивать порт 5902 (или :2). Можно явно указать порт при запуске экземпляра сервера:
$ vncserver -depth 24 -geometry 1920x1080 :2
Посмотреть список запущенных серверов можно так:
$ ps -ef | grep vnc | awk '{print substr($0, 0, 60)}' evgeniy 18949 1 1 8:58 tty1 00:00:40 Xtightvnc :1 evgeniy 19133 1 0 9:35 tty1 00:00:00 Xtightvnc :2 evgeniy 19245 1121 0 9:36 tty1 00:00:00 grep vnc
Остановим работу первого и второго экземпляра VNC-сервера:
$ vncserver -kill :1 $ vncserver -kill :2
Настройка VNC-сервера
Теперь нужно задать команды, которые сервер VNC будет выполнять при запуске. Эти команды должны находиться в файле xstartup
в каталоге ~/.vnc/
текущего пользователя. Сценарий запуска уже был создан при первом запуске сервера с помощью команды vncserver
, но его нужно откорректировать для работы с Xfce.
$ nano ~/.vnc/xstartup
#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &
При помощи первой команды GUI сервера VNC читает файл .Xresources
. В файле .Xresources
пользователь может вносить изменения в некоторые настройки графического рабочего стола (цвет терминала, темы курсора, шрифты). Вторая команда просто запускает графическую оболочку Xfce.
Этот файл нужно сделать исполняемым:
$ chmod +x ~/.vnc/xstartup
Все, можно запускать сервер:
$ vncserver -depth 24 -geometry 1920x1080
Подключение к VNC-серверу
Теперь попробуем подключиться с другого компьютера, используя VNC-клиент Remmina:
Изначально качество изображения низкое, но это можно изменить в настройках клиента:
Перед подключением надо открыть несколько портов на той машине, где мы установили VNC-сервер:
$ sudo ufw allow 5901:5903/tcp
$ sudo ufw status verbose Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From ---------------------------------------------------- 5901:5903/tcp ALLOW IN Anywhere 5901:5903/tcp (v6) ALLOW IN Anywhere (v6)
Создание файла сервиса
Теперь нужно настроить сервер VNC как сервис Systemd, чтобы он запускался при загрузке системы. Для этого создаем новый unit-файл:
$ sudo nano /etc/systemd/system/vncserver@.service
Символ @
в конце имени файла позволит нам передать аргумент, который можно использовать в конфигурации сервиса. С его помощью можно указать порт VNC, который нужно использовать при управлении сервисом.
[Unit] Description = Start TightVNC server at startup After = syslog.target network.target [Service] Type = forking User = evgeniy Group = evgeniy WorkingDirectory = /home/evgeniy PIDFile = /home/evgeniy/.vnc/%H:%i.pid ExecStartPre = -/usr/bin/vncserver -kill :%i > /dev/null 2>&1 ExecStart = /usr/bin/vncserver -depth 24 -geometry 1920x1080 :%i ExecStop = /usr/bin/vncserver -kill :%i [Install] WantedBy = multi-user.target
Команда ExecStartPre
останавливает VNC, если сервис уже запущен. Команда ExecStart
запускает VNC и устанавливает глубину цвета и разрешение. Давайте сообщим системе про новый unit-файл.
$ sudo systemctl daemon-reload
Добавляем три службы в автозагрузку:
$ sudo systemctl enable vncserver@1.service $ sudo systemctl enable vncserver@2.service $ sudo systemctl enable vncserver@3.service
Теперь, после загрузки системы, VNC-сервер будет прослушивать три порта: 5901, 5902 и 5903. И мы можем подключиться на любом из них:
И мы можем вручную запустить или остановить VNC-сервер, как любую другую службу:
$ sudo systemctl start vncserver@1.service $ sudo systemctl start vncserver@2.service $ sudo systemctl start vncserver@3.service
$ sudo systemctl stop vncserver@1.service $ sudo systemctl stop vncserver@2.service $ sudo systemctl stop vncserver@3.service
Безопасное подключение
При подключении VNC не использует безопасные протоколы. Давайте создадим SSH-туннель для безопасного подключения к серверу (для этого на машине с VNC-сервером должен быть установлен SSH-сервер):
$ ssh -L 5901:127.0.0.1:5901 evgeniy@192.168.110.13 evgeniy@192.168.110.13's password: пароль Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-72-generic x86_64)
У меня возникло затруднение при попытке установить ssh-соединение с виртуальной машиной, на которой установлен VNC-сервер (и SSH-сервер):
$ ssh evgeniy@192.168.110.13 Connection reset by 192.168.110.13 port 22
Причина в том, что большинство дистрибутивов Linux создают ключи хоста во время установки OpenSSH-сервера. А эта виртуальная машина была клонирована с уже установленным SSH-сервером. Так что все ключи теперь недействительны. Исправить это просто — нужно удалить старые ключи хоста и сформировать их заново:
$ sudo rm /etc/ssh/ssh_host_* && sudo dpkg-reconfigure openssh-server
Ключ сервера используется в процессе обмена ключами для подтверждения того, что клиент действительно связывается с нужным сервером. Клиент ssh запрашивает публичный ключ сервера и спрашивает, можно ли ему доверять:
The authenticity of host 'XXX.XXX.XXX.XXX' can't be established.
Are you sure you want to continue connecting (yes/no)? yes
После этого отпечаток публичного ключа сохраняется в файле ~/.ssh/known_hosts
. В моем случае сам сервер, просматривая свои ключи, обнаруживал в них ошибку. Если посмотреть файл /var/log/auth.log
, то можно увидеть такие записи
.......... error: could not load host key /etc/ssh/ssh_host_rsa_key .......... error: could not load host key /etc/ssh/ssh_host_ecdsa_key .......... error: could not load host key /etc/ssh/ssh_host_ed25519_key .......... fatal: No supported key exchange algorithms [preauth]
При подключении к VNC-серверу указываем не 192.168.110.13:5901
, а localhost:5901
. Мы как бы подключаемся к локальной машине, но соединение будет проброшено через ssh-туннель на машину с VNC-сервером.
При этом на машине с установленным VNC-сервером должен быть открыт 22-ой порт:
$ sudo ufw allow ssh
А вот держать открытыми порты 5901:5903 больше не нужно, так что закрываем:
$ sudo ufw delete allow 5901:5903/tcp
Поиск: CLI • Linux • Ubuntu • Сервер • Клиент • Настройка • Конфигурация • VNC