Jump to content
From ArchWiki

Ссылки по теме

- x11vnc
- TurboVNC

Состояние перевода: На этой странице представлен перевод статьи TigerVNC. Дата последней синхронизации: 17 июня 2023. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

TigerVNC — это реализация протокола Virtual Network Computing (VNC). Данная статья фокусирует внимание на серверную функциональность.

## Установка

Установите пакет tigervnc.

## Выполнение vncserver для виртуальных (безголовых) сессий

### Первоначальная настройка

Примечание: Системы Linux могут иметь столько VNC-серверов, сколько позволит память, все из которых будут работать параллельно друг с другом.

Для быстрого старта см. шаги ниже. Пользователям рекомендуется прочитать vncserver(8) для полного списка настроек конфигурации.

1. Создайте пароль с помощью `vncpasswd`, который сохранит хешированный пароль в `~/.vnc/passwd`.
2. Отредактируйте `/etc/tigervnc/vncserver.users` для того, чтобы определить сопоставление пользователей. Каждый определённый в этом файле пользователь будет иметь соответствующий порт, на котором выполнится его сессия. Число в данном файле соответствует TCP-порту. По умолчанию, :1 — это TCP-порт 5901 (5900+1). Если нужен другой параллельный сервер, может быть выполнен второй экземпляр на следующем высшем свободном порте, например, 5902 (5900+2).
3. Создайте `~/.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
- remmina
- virt-viewer
- vncviewer-jarAUR

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-устройство как клиент, рассмотрите использование следующей установки:

1. SSH, выполняющийся на сервере
2. vncserver, выполняющийся на сервере (с параметром `-localhost` для безопасности)
3. SSH-клиент на Android-устройстве: ConnectBot является популярным выбором и будет использован в этом руководстве для примера
4. 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.

## Устранение неполадок

Эта статья или раздел нуждается в переводе

Примечания: Данный раздел не переведён. (обсуждение: 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

Categories:

- Remote desktop (Русский)
- Servers (Русский)

Hidden category:

- Pages or sections flagged with Template:Translateme (Русский)