Установка TightVNC на Ubuntu Server 18.04 LTS

02.01.2020

Теги: CLILinuxUbuntuКонфигурацияНастройкаСервер

По умолчанию серверы 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

Обратите внимание, что VNC-клиент Remmina умеет создавать ssh-туннель самостоятельно:

Поиск: CLI • Linux • Ubuntu • Сервер • Клиент • Настройка • Конфигурация • VNC

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.