Перейти к содержанию
Обсудить задачу →
Статьи и инструкции

x11vnc в Linux: доступ к существующему экрану X11 через SSH-туннель

Настройка x11vnc в Debian и Ubuntu: проверка X11, пароль, loopback, SSH-туннель, пользовательский автозапуск и диагностика без открытого порта VNC.
Концептуальная иллюстрация: x11vnc в Linux: доступ к существующему экрану X11 через SSH-туннель

x11vnc передаёт по VNC существующий экран X11. Удалённый оператор видит ту же сессию, что и человек у монитора. Это подходит для согласованной поддержки рабочего места, но отличается от отдельного виртуального рабочего стола и от удалённого входа до появления пользовательской сессии.

В примере сервер слушает только loopback, а клиент подключается через SSH. Порт VNC не открывается в интернет или локальную сеть. Порядок рассчитан на Debian/Ubuntu-подобную систему с X11 и установленным SSH-сервером. Для Wayland выбирают поддерживаемый механизм среды рабочего стола, а не автоматически запускают x11vnc от root.

Удалённый экран: проверка X11, пользовательская сессия, loopback VNC, SSH-туннель и тест ограничений
Порядок проверки и настройки. Команды, ограничения и диагностика приведены в статье.

1. Проверьте тип сессии и назначение удалённого доступа

Откройте терминал именно в графической сессии пользователя и прочитайте её параметры:

printf 'Session: %s\nDisplay: %s\n' "$XDG_SESSION_TYPE" "$DISPLAY"
printf 'Xauthority path: %s\n' "${XAUTHORITY:-not-set}"

Ожидается x11 и непустой DISPLAY. Не считайте :0 универсальным значением: другая сессия может использовать другой display. Переменные из отдельного SSH-входа не обязательно описывают графическую сессию у монитора.

Если используется Wayland, x11vnc не является универсальным сервером полного рабочего стола. Проверьте штатный Remote Desktop конкретной версии GNOME или другой среды. Перевод на X11 ради поддержки меняет модель рабочей сессии и требует отдельного решения. Для headless-сервера нужен другой сценарий, например отдельная виртуальная сессия.

2. Подготовьте пакет и SSH-доступ

Установку выполняет администратор из репозитория своего дистрибутива:

sudo apt update
sudo apt install x11vnc
x11vnc -version

Обновление списка пакетов и установка — изменения системы; выполняйте их по принятому порядку. SSH-сервер в статье предполагается уже настроенным: с персональным входом, проверенным ключом хоста и ограниченным доступом. Не включайте вход root ради туннеля.

Основные опции изложены в руководстве x11vnc Debian. Версию пакета сверяйте с установленной системой: инструкция не требует переключения рабочего компьютера на unstable.

3. Создайте пароль VNC без передачи в аргументах

От имени владельца графической сессии создайте пароль интерактивно и ограничьте доступ к файлу:

umask 077
mkdir -p "$HOME/.vnc"
x11vnc -storepasswd
chmod 600 "$HOME/.vnc/passwd"

Без дополнительных аргументов x11vnc запрашивает пароль и сохраняет его в домашнем каталоге. Не используйте вариант с открытым паролем в командной строке: он может попасть в историю и список процессов.

Традиционная VNC-аутентификация имеет ограничения и не должна считаться современной MFA или самостоятельным защищённым транспортом. В этой схеме основная граница доступа — SSH с проверенной авторизацией и шифрованием. Пароль VNC не заменяет контроль SSH-пользователей и доступ локальных процессов.

4. Запустите сервер в своей X11-сессии

Следующий фрагмент выполняют в её терминале. Он проверяет контекст и добавляет явно заданный XAUTHORITY только если файл действительно читается.

[ "${XDG_SESSION_TYPE:-}" = x11 ] || { echo 'Нужна X11-сессия'; exit 1; }
[ -n "${DISPLAY:-}" ] || { echo 'DISPLAY отсутствует'; exit 1; }
[ -r "$HOME/.vnc/passwd" ] || { echo 'Нет файла пароля'; exit 1; }
set -- -display "$DISPLAY" -localhost -listen 127.0.0.1 -no6 \
  -rfbauth "$HOME/.vnc/passwd" -rfbport 5900 -forever
if [ -n "${XAUTHORITY:-}" ]; then
    [ -r "$XAUTHORITY" ] || { echo 'XAUTHORITY не читается'; exit 1; }
    set -- "$@" -auth "$XAUTHORITY"
fi
x11vnc "$@"

При незаданном XAUTHORITY используется штатный поиск X11 текущего пользователя. Если доступа к display нет, выясните реальный путь авторизации в этой сессии. Не подставляйте чужой cookie и не устраняйте отказ командами xhost +.

Запуск остаётся в терминале, что удобно для первого теста и остановки через Ctrl+C. Параметры listen и no6 в этом примере явно оставляют IPv4-loopback; для отдельной IPv6-схемы нужна собственная проверка сокетов. Параметр forever сохраняет сервер после отключения клиента; он не перезапускает процесс после выхода пользователя и не открывает login screen автоматически.

5. Проверьте, на каких адресах открыт порт

На Linux-машине прочитайте слушающие сокеты:

ss -ltnp 'sport = :5900'

При правильной локальной привязке должны быть только loopback-адреса, в этом IPv4-примере — 127.0.0.1. Не должно быть 0.0.0.0, адреса LAN или [::]. Если они присутствуют, остановите процесс и проверьте фактическую команду, второй VNC-сервер и конфигурацию пакета.

С отдельного компьютера доступ к LAN-адресу Linux на TCP 5900 должен быть закрыт. В Windows это можно проверить Test-NetConnection, подставив реальный LAN-адрес. Не оценивайте защиту только наличием параметра localhost в файле: важен действующий сокет и внешний тест.

6. Создайте SSH-туннель на компьютере оператора

После проверки SSH-подключения выполните на клиенте:

ssh -N -o ExitOnForwardFailure=yes \
  -o ServerAliveInterval=30 -o ServerAliveCountMax=3 \
  -L 127.0.0.1:15900:127.0.0.1:5900 \
  support@linux-pc.example.net

Hostname и пользователь — примеры. Локальный порт 15900 выбран, чтобы не мешать другому VNC на клиенте. Клиент слушает только 127.0.0.1; правую часть туннеля SSH открывает с Linux-машины к её собственному loopback.

Руководство OpenSSH описывает локальную переадресацию. ExitOnForwardFailure сообщает об отказе создания listener, но не подтверждает работоспособность удалённого VNC: соединение с ним нужно проверить отдельно. Оставьте SSH работающим во время сеанса.

7. Подключите VNC-клиент и проверьте полномочия

В VNC viewer укажите host 127.0.0.1 и TCP-порт 15900. Формат одной строкой зависит от клиента: некоторые трактуют число после двоеточия как номер display, а не буквальный порт. Используйте отдельное поле порта либо документированный синтаксис конкретного viewer.

Введите подготовленный VNC-пароль и проверьте, что отображается именно согласованная пользовательская сессия. Сначала используйте режим просмотра, если управление клавиатурой и мышью не требуется. При одновременной работе с локальным сотрудником согласуйте действия: обе стороны влияют на один экран.

Проверьте блокировку экрана и поведение после выхода пользователя. Не обещайте сохранение доступа через переход на экран входа: это другой контекст. Перед открытием сеанса уберите конфиденциальные окна и согласуйте допустимость снимков экрана.

8. Как добавить автозапуск после успешного пилота

Сохраните проверенный shell-фрагмент запуска в пользовательский исполняемый файл, например $HOME/.local/bin/avg-x11vnc. В начале файла должны быть #!/bin/sh и проверки контекста; последнюю команду замените на exec /usr/bin/x11vnc "$@". Проверьте фактический путь бинарного файла через command -v.

chmod 700 "$HOME/.local/bin/avg-x11vnc"
mkdir -p "$HOME/.config/autostart"
cat > "$HOME/.config/autostart/avg-x11vnc.desktop" <<EOF
[Desktop Entry]
Type=Application
Name=AVGIT X11 support
Exec="$HOME/.local/bin/avg-x11vnc"
Terminal=false
EOF

Это пользовательский автозапуск при входе в графическую среду, а не системный root-сервис. Предварительно сохраните существующий файл с тем же именем, если он уже есть. Общий механизм описан в спецификации автозапуска freedesktop.org.

После повторного входа проверьте процесс, сокет и подключение. Не запускайте параллельно второй экземпляр вручную. Для systemd user нужна отдельная передача окружения графической сессии; слепое указание DISPLAY=:0 в системной службе не решает эту задачу.

9. Как разобрать чёрный экран или отказ подключения

Если SSH-туннель не создан, проверьте SSH, разрешённую переадресацию и занятость локального 15900. Если туннель создан, но viewer не подключается, проверьте процесс x11vnc и loopback-порт 5900 на Linux. Не открывайте порт в firewall как первое действие.

Ошибка доступа к X display требует проверки владельца процесса, DISPLAY и авторизации именно текущей X11-сессии. Чёрный экран на Wayland не исправляется выдачей root: выберите соответствующий механизм среды. Для блокировки экрана учитывайте политику безопасности и поведение выбранного display manager.

Если сервер отключается после клиента, проверьте forever и журналы процесса. Если порт занят, определите владельца через ss, а не завершайте все процессы VNC. Ошибки после автозапуска сравнивайте с ручным запуском в той же пользовательской сессии.

10. Как отключить доступ и проверить завершение

Для пилота завершите x11vnc через Ctrl+C и закройте SSH-туннель. Для автозапуска отключите только созданный пользовательский desktop-файл и завершите соответствующий процесс по проверенному PID. Прочитайте ss повторно: listener 5900 должен исчезнуть.

При отзыве доступа отдельного оператора отключите его SSH-ключ или запись по принятой процедуре и проверьте активные SSH-сессии. Смена VNC-пароля сама по себе не закрывает уже существующий SSH-туннель. Удаление автозапуска не гарантирует остановку работающего процесса.

Зафиксируйте владельца сессии, механизм запуска, ограничения сокета и результаты положительного и отрицательного теста. Схема завершена, когда оператор подключается только разрешённым способом, а VNC напрямую недоступен из сети.