TigerVNC (Русский)

Ссылки по теме
x11vnc
TurboVNC
Состояние перевода:
На этой странице представлен перевод статьи
TigerVNC
. Дата последней синхронизации: 17 июня 2023. Вы можете
помочь
синхронизировать перевод, если в английской версии произошли
изменения
.
TigerVNC
— это реализация протокола
Virtual Network Computing
(VNC). Данная статья фокусирует внимание на серверную функциональность.
Установка
Установите
пакет
tigervnc
.
Выполнение vncserver для виртуальных (безголовых) сессий
Первоначальная настройка
Примечание
Системы Linux могут иметь столько VNC-серверов, сколько позволит память, все из которых будут работать параллельно друг с другом.
Для быстрого старта см. шаги ниже. Пользователям рекомендуется прочитать
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
Примечание
Предыдущий шаг требует дополнительную настройку безопасности для полной работы; см.
#Получение доступа к vncserver через SSH-туннели
для конца установки. Для тестирования пропустите этот шаг, чтобы позволить незащищённые соединения вне localhost.
Запуск и остановка tigervnc
Запустите
экземпляр шаблона
vncserver@.service
и по желанию
включите
его запуск при загрузке/выключении системы. Обратите внимание, что
идентификатор экземпляра
в данном случае является номером дисплея (например, экземпляр
vncserver@:1.service
для номера дисплея
:1
).
Note
Прямые вызовы к
/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
Важно
Метод безопасности TigerVNC по умолчанию небезопасный. В нём отсутствует верификация личности и он не предотвратит атаку посредника по время настройки соединения. Убедитесь в том, что Вы понимаете настройки безопасности Вашего сервера и не подключаетесь небезопасно к vnc-серверу вне доверенной локальной вычислительной сети.
Примечание
По умолчанию TigerVNC использует метод аутентификации/шифрования
TLSVnc
если не конкретно проинструктировано через параметр
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
AUR
remmina
virt-viewer
vncviewer-jar
AUR
[
ссылка недействительна
: 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
Этот метод прост и подходит, если Вам нужен только способ навигации назад/вперёд при использовании веб-браузеров или, например, файловых браузеров.
Установите
evrouter
AUR
и
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.
Устранение неполадок
Эта статья или раздел нуждается в
переводе
Примечания:
Данный раздел не переведён. (обсуждение:
Talk:TigerVNC (Русский)#
)
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
.
См. также
https://github.com/TigerVNC/tigervnc