TigerVNC (Русский)
TigerVNC — это реализация протокола Virtual Network Computing (VNC). Данная статья фокусирует внимание на серверную функциональность.
Установка
Установите пакет tigervnc.
Выполнение vncserver для виртуальных (безголовых) сессий
Первоначальная настройка
Для быстрого старта см. шаги ниже. Пользователям рекомендуется прочитать vncserver(8) для полного списка настроек конфигурации.
- Создайте пароль с помощью
vncpasswd
, который сохранит хешированный пароль в~/.vnc/passwd
. - Отредактируйте
/etc/tigervnc/vncserver.users
для того, чтобы определить сопоставление пользователей. Каждый определённый в этом файле пользователь будет иметь соответствующий порт, на котором выполнится его сессия. Число в данном файле соответствует TCP-порту. По умолчанию, :1 — это TCP-порт 5901 (5900+1). Если нужен другой параллельный сервер, может быть выполнен второй экземпляр на следующем высшем свободном порте, например, 5902 (5900+2). - Создайте
~/.vnc/config
и как минимум определите тип сессии строкой вродеsession=foo
, где foo соответствует нужной среде рабочего стола для выполнения. Можно увидеть список доступных сред рабочего стола на системе, просмотрев их соответствующие .desktop-файлы в пределах/usr/share/xsessions/
. Например:
~/.vnc/config
session=lxqt geometry=1920x1080 localhost alwaysshared
Запуск и остановка tigervnc
Запустите экземпляр шаблона vncserver@.service
и по желанию включите его запуск при загрузке/выключении системы. Обратите внимание, что идентификатор экземпляра в данном случае является номером дисплея (например, экземпляр vncserver@:1.service
для номера дисплея :1
).
/usr/bin/vncserver
не поддерживаются, т. к. они не установят надлежащий масштаб сессии. Сервис systemd — единственный поддерживаемый метод использования TigerVNC. См. проблему №1096.Выставление локального дисплея напрямую
Tigervnc поставляется с libvnc.so
, который может быть непосредственно загружен во время инициализации X, что даёт больше производительности.
Создайте следующий файл и перезапустите X:
/etc/X11/xorg.conf.d/10-vnc.conf
Section "Module" Load "vnc" EndSection Section "Screen" Identifier "Screen0" Option "UserPasswdVerifier" "VncAuth" Option "PasswordFile" "/root/.vnc/passwd" EndSection
Выполнение x0vncserver для непосредственного управления локального дисплея
tigervnc также предоставляет x0vncserver(1), позволяющий непосредственный контроль над физической X-сессии. После определения пароля сессии с помощью инструмента vncpasswd, вызовите сервер следующим образом:
$ x0vncserver -rfbauth ~/.vnc/passwd
- x11vnc — другой VNC-сервер, тоже предоставляющий непосредственное управление текущей X-сессии.
-
x0vncserver
на данный момент не поддерживает совместное использования буфера обмена между клиентом и сервером (даже с помощьюautocutsel
). См. проблему №529.
С помощью xprofile
Простой способ запуска x0vncserver — это добавить строку в одном из xprofile-файлов, например:
~/.xprofile
... x0vncserver -rfbauth ~/.vnc/passwd &
С помощью systemd
С помощью системного сервиса
Данный вариант даст пользователям доступ к текущему дисплею, включая экран входа, предоставляемый вашим экранным менеджером.
Сервис будет автоматически перезапущен каждый раз, когда пользователь выходит из его сессии.
Для примера ниже используется LightDM, но должно быть возможным его адаптирование к другим экранным менеджерам, модифицировав переменную XAUTHORITY
.
/etc/systemd/system/x0vncserver.service
[Unit] Description=Сервис удалённого доступа (VNC) для дисплея :0 Requires=display-manager.service After=network-online.target After=display-manager.service [Service] Type=simple Environment=HOME=/root Environment=XAUTHORITY=/var/run/lightdm/root/:0 ExecStart=x0vncserver -display :0 -rfbauth ~/.vnc/passwd Restart=on-failure RestartSec=500ms [Install] WantedBy=multi-user.target
Поскольку это системный юнит, -rfbauth ~/.vnc/passwd
отсылается к /root/.vnc/passwd
Запустите/включите x0vncserver.service
.
С помощью пользовательского сервиса
Для того, чтобы VNC-сервер выполнял x0vncserver, что является самым лёгким способом для большинства из пользователей для быстрого удалённого доступа к текущему рабочему столу, создайте systemd-юнит как указано ниже, заменяя user (пользователя) и настройки на желаемые:
~/.config/systemd/user/x0vncserver.service
[Unit] Description=Сервис удалённого доступа (VNC) [Service] Type=simple ExecStartPre=/bin/sh -c 'while ! pgrep -U "$USER" Xorg; do sleep 2; done' ExecStart=/usr/bin/x0vncserver -rfbauth %h/.vnc/passwd [Install] WantedBy=default.target
Строка ExecStartPre
ждёт запуска Xorg от лица ${USER}
.
Для входа с Вашим именем пользователя и паролем, замените ExecStart
на /usr/bin/x0vncserver -PAMService=login -PlainUsers=${USER} -SecurityTypes=TLSPlain
.
Запустите/включите пользовательский юнит x0vncserver.service
.
Выполнение Xvnc с XDMCP для сеансов по требованию
Можно использовать систему активации сокетов в systemd в сочетании с XDMCP для автоматического создания VNC-серверов дял каждого пользователя, пытающийся войти, чтобы не было необходимости настраивать один сервер/порт для каждого пользователя. Эта настройка использует экранный менеджер для аутентификации пользователей и входа, поэтому нет надобности для паролей VNC. Недостатком является то, что пользователи не смогут оставить сессию на сервере и подключиться к ней позже.
Для того, чтобы его настроить, сначала установите XDMCP и убедитесь в том, что экранный менеджер работает. После этого создайте файлы:
/etc/systemd/system/xvnc.socket
[Unit] Description=XVNC-сервер [Socket] ListenStream=5900 Accept=yes [Install] WantedBy=sockets.target
/etc/systemd/system/xvnc@.service
[Unit] Description=Демон XVNC для каждого соединения [Service] ExecStart=-/usr/bin/Xvnc -inetd -query localhost -geometry 1920x1080 -once -SecurityTypes=None User=nobody StandardInput=socket StandardError=syslog
Запустите/включите xvnc.socket
. Теперь любое количество пользователей может получить уникальные дисплеи, подключившись к порту 5900.
Если VNC-сервер подвергается воздействию Интернета, добавьте параметр -localhost
к Xvnc
в xvnc@.service
(обратите внимание, что -query localhost
и -localhost
— два разных переключателя) и следуйте #Получение доступа к vncserver через SSH-туннели. Т. к. мы только выбираем пользователя после подключения, VNC-сервер выполняется как пользователь nobody и непосредственно использует Xvnc
вместо скрипта vncserver
, так что любые опции в ~/.vnc
проигнорированы. По желанию настройте автозапуск vncconfig, чтобы буфер обмена работал (vncconfig завершается сразу же в сессиях не VNC). Один из способов — создать файл:
/etc/X11/xinit/xinitrc.d/99-vncconfig.sh
#!/bin/sh vncconfig -nowin &
Соединение к vncserver
SecurityTypes
. С TLSVnc есть стандартная VNC-аутентификация и весь трафик шифруется GNUTLS, но личность сервера не подтверждена. TigerVNC поддерживает другие схемы безопасности, например, X509Vnc, объединяющий стандартную VNC-аутентификацию с шифрованием GNUTLS и идентификацию сервера; это является рекомендуемым режимом для безопасного соединения.
Если на сервере параметру SecurityTypes
задано значение нешифруемой опции с высоким приоритетом (вроде None, VncAuth, Plain, TLSNone, TLSPlain, X509None, X509Plain), что нецелесообразно, тогда не будет возможным использование шифрования. При выполнении vncviewer безопаснее прямо задать SecurityTypes
и не принимать любой нешифрованный трафик. Любой другой режим используется только при получении доступа к серверу vncserver через SSH-туннели. Любое количество клиентов может подключиться к серверу vncserver. Простой пример указан ниже, где vncserver выполняется на 10.1.10.2 с портом 5901 или :1 в сокращённом виде:
$ vncviewer 10.1.10.2:1
Аутентификация без пароля
Параметр -passwd
позволяет указать путь к серверному файлу ~/.vnc/passwd
. Предпологается, что этот файл доступен пользователю через SSH или физический доступ к серверу. В обоих случаях поместите файл в файловую систему клиента в безопасном месте, например, в том, в котором только у предназначенного пользователя есть доступ к чтению.
$ vncviewer -passwd /path/to/server-passwd-file
Пароль также можно передать напрямуюhe password can also be provided directly.
ps
на машине увидит его.$ vncviewer -passwd <(echo MYPASSWORD | vncpasswd -f)
Примерные клиенты с графическим интерфейсом
- gtk-vnc
- krdc
- vinagre
- remmina
- virt-viewer
- vncviewer-jarAUR[ссылка недействительна: package not found]
vncviewer от TigerVNC также имеет простой GUI при выполнении без параметров:
$ vncviewer
Получение доступа к vncserver через SSH-туннели
Для серверов, предоставляющих SSH-соединение, преимущество этого способа то, что необязательно открывать любой другой порт кроме уже открытого порта SSH наружу, т. к. весь трафик VNC туннелируется в порт SSH.
На сервере
На стороне сервера должен быть выполнен либо vncserver, либо x0vncserver.
При выполнении любого из этих серверов, рекомендуется использовать параметр localhost
в ~/.vnc/config
или переключатель -localhost
(для x0vncserver), т. к. это позволяет соединения только из localhost и, по аналогии, только от пользователей в SSH и аутентифицированных из коробки. Например:
~/.vnc/config
session=lxqt geometry=1920x1080 localhost alwaysshared
Не забудьте запустить или перезапустить vncserver@.service
, например, таким образом (см. также #Первоначальная настройка):
# systemctl start vncserver@:1
или для x0vncserver:
$ x0vncserver -localhost -SecurityTypes none
На клиенте
VNC-сервер был настроен на удалённой машине для принятия только локальных соединений. Теперь клиент должен открыть безопасную оболочку с удалённой машиной (в данном примере 10.1.10.2) и создать туннель с порта клиента, для примера 9901, к порту удалённого сервера 5901. Для большей информации по поводу этой функции см. OpenSSH (Русский)#Проброс других портов и ssh(1).
$ ssh 10.1.10.2 -L 9901:localhost:5901
После подключения по SSH оставьте это окно оболочки, т. к. он действует как защищённый туннель с сервером. В качестве альтернативы можно непосредственно выполнить SSH на фоне с помощью параметра -f
. На клиентской части для подключения через этот зашифрованный туннель, направьте vncviewer к перенаправленному порту клиента на localhost.
$ vncviewer localhost:9901
На практике происходит так, что vncviewer подключается локально к порту 9901, который туннелируется к серверному localhost-порту 5901. Соединение устанавливается к правильному порту в пределах безопасной оболочки.
$ ssh -fL 9901:localhost:5901 10.1.10.2 sleep 10; vncviewer localhost:9901
После этой команды переключатель -f
оставит ssh выполняться на фоне; он всё же будет в сети, выполняя sleep 10
. Затем же выполняется vncviewer и ssh остаётся открытым на фоне пока vncviewer использует туннель. ssh завершится после отключения туннеля, что и является желаемым поведением.
В качестве альтернативы переключатель vncviewer -via
предоставляет ярлык для команды выше:
$ vncviewer -via 10.1.10.2 localhost::5901
(Обратите внимание на два двоеточия – синтаксис vncviewer — [хост]:[дисплей#]
или [хост]::[порт]
.)
Соединение с vncserver с Android-устройств через SSH
Для подключения к VNC-серверу через SSH используя Android-устройство как клиент, рассмотрите использование следующей установки:
- SSH, выполняющийся на сервере
- vncserver, выполняющийся на сервере (с параметром
-localhost
для безопасности) - SSH-клиент на Android-устройстве: ConnectBot является популярным выбором и будет использован в этом руководстве для примера
- VNC-клиент на Android-устройстве: androidVNC используется здесь
В ConnectBot подключитесь к нужной машине. Нажмите на кнопку настроек, выберите Проброс портов и добавьте порт:
Тип: Локальный Исходный порт: 5901 Порт назначения: 127.0.0.1:5901
D androidVNC подключитесь к VNC-порту; это локальный адрес, следующий за SSH-соединением:
Пароль: пароль от vncserver Адрес: 127.0.0.1 Порт: 5901
Советы и рекомендации
Подключение к системе macOS
См. https://help.ubuntu.com/community/AppleRemoteDesktop. Проверено на Remmina.
Рекомендуемые настройки безопасности
Если Вы не получаете доступ к серверу vncserver с помощью SSH-туннелей, где идентификация и шифрование работает через SSH, рекомендуется использовать X509Vnc, т. к. TLSVnc испытывает недостатки подтверждения личности.
$ vncserver -x509key /путь/к/ключу.pem -x509cert /путь/к/сертификату.pem -SecurityTypes X509Vnc :1
Выдача сертификатов x509 выходит за рамки данного руководства. Однако Let's Encrypt предоставляет лёгкий способ для этого. В качестве альтернативы можно выдать сертификаты с помощью OpenSSL, поделиться публичным ключом с клиентом и указать его с помощью параметра -X509CA
. Пример приведен ниже, сервер работает на 10.1.10.2:
$ vncviewer 10.1.10.2 -X509CA /путь/к/сертификату.pem
Переключение полноэкранного режима
Это можно сделать с помощью меню vnc-клиента. По умолчанию, mkey vnc-клиента — F8
.
Обходной путь для неработающих кнопок мыши назад и вперед
Протокол VNC на данный момент поддерживает только 7 кнопок мыши (левая, средняя, правая, прокрутка вверх, вниз, вправо, влево), что означает, если у Вашей мыши есть кнопки назад и вперёд, ими нельзя пользоваться и их ввод будет проигнорирован.
evrouter может быть использован для обхода данного ограничения, отправляя нажатия кнопок клавиатуры при нажатии на кнопки мыши вперёд/назад. По желанию xte в xautomation и xbindkeys может быть использован на сервере для преобразования нажатий кнопок клавиатур обратно в нажатия кнопок мыши при надобности.
Замена кнопок мыши назад/вперед клавишами клавиатуры XF86Back/XF86Forward
Этот метод прост и подходит, если Вам нужен только способ навигации назад/вперёд при использовании веб-браузеров или, например, файловых браузеров.
Установите evrouterAUR и xautomation на клиенте. Настройте evrouter, см. Mouse buttons (Русский)#evrouter и man-страницы evrouter для инструкции и советов о том, как найти корректное название устройств, окон, кнопок и т. д. Примерная конфигурация:
~/.evrouterrc
Window "OtherComputer:0 - TigerVNC": # Заголовок окна, используемый в качестве фильтра # Использование Shell, чтобы избежать повторного нажатия клавиш (см. мануал evrouter) "USB mouse" "/dev/input/by-id/usb-Mouse-name-event-mouse" none key/275 "Shell/xte 'key XF86Back'" "USB mouse" "/dev/input/by-id/usb-Mouse-name-event-mouse" none key/276 "Shell/xte 'key XF86Forward'" # Используйте XKey ниже вместо способа ниже, если требуется повтор клавиш (см. мануал evrouter) #"Logitech Gaming Mouse G400" "/dev/input/by-id/usb-Logitech_Gaming_Mouse_G400-event-mouse" none key/275 "XKey/XF86Back" #"Logitech Gaming Mouse G400" "/dev/input/by-id/usb-Logitech_Gaming_Mouse_G400-event-mouse" none key/276 "XKey/XF86Forward"
Запустите evrouter на клиенте. С конфигурацией выше клавиша клавиатуры XF86Back
отправляется VNC-серверу при нажатии на кнопку назад на мыши и клавиша XF86Forward
отправлена при нажатии на кнопку вперёд.
Сопоставление нажатий клавиш клавиатуры с нажатиями кнопок мыши на сервере
При надобности возможно сопоставить клавиши клавиатуры обратно в нажатия кнопок мыши на сервере. В этом случае хорошей идеей может быть использование клавиш клавиатуры, которые никогда не находятся ни на клиенте, ни на сервере. В примере ниже клавиши клавиатуры XF86Launch8
/XF86Launch9
используются как кнопки мыши 8/9.
Конфигурация Evrouter на клиентской части:
~/.evrouterrc
Window "OtherComputer:0 - TigerVNC": # Заголовок окна # Использование Shell для обхода повторений клавиш (см. мануал evrouter) "USB mouse" "/dev/input/by-id/usb-Mouse-name-event-mouse" none key/275 "Shell/xte 'key XF86Launch8'" "USB mouse" "/dev/input/by-id/usb-Mouse-name-event-mouse" none key/276 "Shell/xte 'key XF86Launch9'"
Установите xautomation и xbindkeys на серверной части. Настройте xbindkeys для сопоставления клавиш XF86Launch8
/XF86Launch9
на клики кнопок мыши 8/9 с xte.
~/.xbindkeysrc
"xte 'mouseclick 8'" XF86Launch8 "xte 'mouseclick 9'" XF86Launch9
Запустите xbindkeys (xbindkeys -f ~/.xbindkeysrc
). Сервер теперь начнёт сопоставлять клавиши XF86Launch8
/XF86Launch9
на кнопки мыши 8/9.
Устранение неполадок
Black rectangle instead of window
Most probably, this is due to the application strictly requiring the composite Xorg extension. For example webkit based app: midori, psi-plus, etc.
Restart vncserver in this case using something like following:
$ vncserver -geometry ... -depth 24 :1 +extension Composite
It looks like Composite extension in VNC will work only with 24bit depth.
Empty black window with mouse cursor
Verify that the user is not logged into a physical X session, unless this option was configured with x0vncserver
. Multiple X sessions for a single user are not supported, see https://github.com/TigerVNC/tigervnc/issues/684#issuecomment-494385395.
Conversely, trying to log into a local X session while a VNC server service is running for that user will likely not work, and you may get stuck on a splash screen when using a desktop environment.
No mouse cursor
If no mouse cursor is visible when using x0vncserver, start vncviewer as follows:
$ vncviewer DotWhenNoCursor=1 server
Alternatively, put DotWhenNoCursor=1
in the TigerVNC configuration file, which is at ~/.vnc/default.tigervnc
by default.
Copying clipboard content from the remote machine
If copying from the remote machine to the local machine does not work, run autocutsel
on the server, as mentioned in [1]:
$ autocutsel -fork
Now, press F8
to display the VNC menu popup, and select Clipboard: local -> remote
option.
No window decoration / borders / titlebars / cannot move windows around
Start a window manager to fix an empty xterm frame. For example, on Xfce, run xfwm4 &
.
Desktop environment is displaying only boxes for font
Some desktop environments might be missing necessary font to display ASCII characters. Install ttf-dejavu.