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

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 напрямую недоступен из сети.
