Как настроить удаленный рабочий стол на Linux VPS
Узнайте, как запустить графический интерфейс XFCE через xrdp с защитой SSH. Разберитесь, чем полноценный рабочий стол на VPS отличается от брокера RustDesk и что выбрать.
Что на самом деле означает удаленный рабочий стол на Linux VPS
Существует два разных продукта, которые соответствуют запросу «удаленный рабочий стол на Linux VPS», и выбор неверного варианта отнимет у вас полдня. Первый — это брокер удаленного доступа. Самохостируемый сервер RustDesk — типичный пример: он ретранслирует сессию между двумя машинами, которые у вас уже есть, например, вашим ноутбуком и домашним ПК. Арендованный сервер при этом не отрисовывает рабочий стол. Он лишь соединяет две стороны друг с другом и пересылает пакеты, когда они не могут связаться напрямую. Второй вариант — это полноценный графический рабочий стол, работающий на арендованном сервере, где пиксели отрисовываются в дата-центре и передаются вам потоком. Это xrdp, VNC (virtual network computing) или контейнерное рабочее пространство.
Их разделяет один вопрос. Когда всё заработает, где будет находиться указатель мыши? Если на машине, которая у вас уже есть, вам нужен брокер. Если на самом VPS, вам нужен рабочий стол на VPS. Второй случай занимает большую часть описания ниже, так как именно его пропускает большинство руководств.
Какой вариант подходит для вашей задачи
- RustDesk с собственным релеем. Это защищает сессию от прохождения через публичный rendezvous-сервер, управляемый сторонними лицами, поскольку пара ключей находится у вас. Это не защищает управляемую машину: она остается тем же ПК, на который вы установили клиент, с тем же паролем, который задан на этом ПК.
- xrdp через SSH-туннель или VPN. Это защищает вас от постоянного сканирования TCP 3389 в интернете и от подбора паролей к окну входа RDP, так как этот порт никогда не открыт для интернета. Это не защищает слабый пароль учетной записи от того, кто уже получил доступ к туннелю.
- VNC через тот же туннель. Это дает вам сессию рабочего стола, которая сохраняется при разрыве соединения, с использованием протокола, который старше и проще, чем RDP. Сам по себе он ничего не защищает: всю работу по обеспечению безопасности выполняет туннель, поэтому VNC на публичном порту — худший вариант из представленных.
- Контейнерное рабочее пространство, такое как Webtop или Kasm. Это дает вам браузер или полноценный рабочий стол в контейнере, который можно удалить и пересоздать, что защищает вашу реальную машину от всего, с чем взаимодействует этот браузер. Это не защищает хост: данные образы запускаются с широкими привилегиями и без пароля
sudoвнутри, поэтому контейнер не является границей, которой стоит доверять при работе с вредоносным ПО.
Установка xrdp и XFCE на Ubuntu 24.04
Образ VPS-сервера поставляется без графического интерфейса. Вы устанавливаете его, а затем устанавливаете xrdp — сервер с открытым исходным кодом, который использует RDP (remote desktop protocol), тот же протокол, что и клиент Windows. Выберите легкое окружение рабочего стола; XFCE — стандартный выбор.
sudo apt update
sudo apt install -y xrdp xorgxrdp xfce4 xfce4-goodies dbus-x11
systemctl is-active xrdpВ Ubuntu 24.04 версии xrdp 0.9.24 и xorgxrdp находятся в компоненте universe (по состоянию на август 2026 года). Установите xorgxrdp по имени, даже если это только рекомендуемый пакет: это бэкенд X-сервера, который xrdp запускает для новой сессии. Без него окно входа принимает пароль, а затем сразу возвращает вас обратно к окну входа.
Теперь укажите сессии, какой рабочий стол запускать. xrdp выполняет /etc/xrdp/startwm.sh, который запускает ~/.xsession, если этот файл существует.
echo "xfce4-session" > ~/.xsession
chmod 644 ~/.xsessionНаконец, xrdp должен прочитать TLS (transport layer security) ключ, который он предоставляет клиентам. Этот файл имеет права доступа 640 и принадлежит группе ssl-cert.
ls -l /etc/ssl/private/ssl-cert-snakeoil.key
id xrdpСписок показывает -rw-r----- 1 root ssl-cert. Если id xrdp не выводит ssl-cert в списке групп, выполните sudo adduser xrdp ssl-cert, а затем sudo systemctl restart xrdp. Пропустите этот шаг, и xrdp не сможет открыть ключ, а /var/log/xrdp.log запишет ошибку с именем файла snakeoil в строке.
Почему не следует открывать порт 3389 для доступа из Интернета
TCP-порт 3389 непрерывно сканируется всеми узлами в Интернете, а окно входа RDP вежливо отвечает на каждую попытку подбора пароля. Не открывайте его. Вместо этого привяжите xrdp к адресу loopback и подключайтесь через доверенный туннель.
Отредактируйте /etc/xrdp/xrdp.ini и измените параметр прослушивания в секции [Globals].
[Globals]
port=tcp://.:3389В поставляемом файле синтаксис описан в комментариях: tcp://.:3389 означает 127.0.0.1:3389, а tcp://:3389 означает все сетевые интерфейсы. Перезапустите службу и проверьте результат, так как опечатка в этом месте может привести к тому, что служба останется доступной на всех адресах.
sudo systemctl restart xrdp
ss -tlnp | grep 3389Вам нужно 127.0.0.1:3389. Если вы видите 0.0.0.0:3389, значит, xrdp проигнорировал ваши изменения; обычно это происходит, если строка оказалась под другим заголовком секции ниже по файлу.
Теперь откройте туннель со своей локальной машины.
ssh -N -L 3389:127.0.0.1:3389 you@vps.example.com-N означает «открыть соединение, но не выполнять команду», поэтому сессия существует только для проброса порта. Оставьте этот терминал запущенным и укажите RDP-клиенту адрес 127.0.0.1:3389. В Linux-клиентах используется FreeRDP 3, чей исполняемый файл в Ubuntu 24.04 называется xfreerdp3:
sudo apt install -y freerdp3-x11
xfreerdp3 /v:127.0.0.1:3389 /u:you /dynamic-resolution +clipboard /soundВ Windows используйте встроенный mstsc и введите 127.0.0.1 в качестве имени компьютера. FreeRDP попросит вас подтвердить доверие сертификату при первом подключении и выведет Do you trust the above certificate? (Y/T/N), что является ожидаемым поведением для самоподписанного сертификата.
Если ssh отвечает bind [127.0.0.1]:3389: Address already in use, значит, порт 3389 уже занят на вашей локальной машине. Измените локальный порт с помощью ssh -N -L 13389:127.0.0.1:3389 you@vps.example.com и подключайтесь к 127.0.0.1:13389.
Использовать отдельный туннель для каждого пользователя неудобно, поэтому для команды лучшим решением будет частная сеть. Разместите сервер за собственным VPN-шлюзом WireGuard, назначьте ему туннельный адрес 10.8.0.1 и установите port=tcp://10.8.0.1:3389, чтобы xrdp отвечал только внутри VPN. В любом случае правило брандмауэра для порта 3389 не должно существовать вовсе. Если вы не уверены, какие соединения разрешены текущими правилами, начните с основ работы с брандмауэром ufw на VPS и проверьте настройки до подключения, а не после.
Сколько оперативной памяти потребляет удаленный рабочий стол на VPS с 2 ГБ ОЗУ
Выбор графической оболочки определяет, будет ли работа на VPS с 2 ГБ ОЗУ комфортной или невозможной. Приведенные ниже значения — это типичные показатели потребления памяти сразу после входа в систему на Ubuntu 24.04, взятые из опубликованных сравнительных тестов, а не измеренные на вашем конкретном сервере. Выполните замер самостоятельно с помощью free -m сразу после подключения.
The data behind this chart
[
{
"label": "LXQt",
"idle_ram_mb": 300
},
{
"label": "XFCE",
"idle_ram_mb": 400
},
{
"label": "MATE",
"idle_ram_mb": 500
},
{
"label": "KDE Plasma",
"idle_ram_mb": 800
},
{
"label": "GNOME",
"idle_ram_mb": "1,200"
}
]Для указанных 5 сред рабочего стола разброс является ключевым фактором. LXQt потребляет около 300 МБ, а XFCE — около 400 МБ. Оба варианта оставляют на VPS с 2 ГБ ОЗУ достаточно места для работы браузера. GNOME требует около 1,200 МБ еще до открытия первого окна, что при наличии 2 ГБ ОЗУ заставляет браузер конкурировать с графической оболочкой за оставшиеся ресурсы.
Основной расход памяти приходится на браузер, а не на графическую оболочку. Современный браузер потребляет от 150 до 400 МБ на каждую активную вкладку, поэтому VPS с 2 ГБ ОЗУ и XFCE позволяет открыть лишь несколько вкладок, после чего система начинает использовать swap. Настройте swap, чтобы при нехватке памяти система замедлялась, а не завершала процессы принудительно: sudo fallocate -l 2G /swapfile, затем sudo chmod 600 /swapfile, sudo mkswap /swapfile, sudo swapon /swapfile и добавьте соответствующую строку в /etc/fstab для автоматического монтирования после перезагрузки. Если процесс внезапно исчезает без предупреждения, выполните dmesg | grep -i "killed process". Эта строка означает, что ядро применило механизм out-of-memory killer, и браузер обычно становится первой жертвой.
Процессор — это второе ограничение, которое часто недооценивают. У VPS нет GPU, поэтому X-сервер переключается на программный рендеринг через llvmpipe, что означает отрисовку каждого пикселя силами CPU. Прокрутка тяжелых страниц и воспроизведение видео создают высокую нагрузку на процессор, из-за чего падает частота кадров, но система не зависает. Это тот же барьер, с которым вы столкнетесь, если задаетесь вопросом можно ли играть на VPS: для любых 3D-задач ответ — нет, именно по этой причине.
Звук и буфер обмена в сеансе xrdp
Ubuntu 24.04 использует PipeWire для работы со звуком, в то время как механизм перенаправления звука в xrdp был разработан для PulseAudio, поэтому после чистой установки вы получаете работающее видео, но отсутствие звука. В Ubuntu пакеты для моста уже включены.
sudo apt install -y pipewire-module-xrdp pulseaudio-utils alsa-utilsПолностью завершите сеанс RDP и войдите снова, так как модуль загружается в момент запуска сеанса. Простого переподключения недостаточно. Затем проверьте состояние внутри сеанса:
pactl list short sinks
speaker-test -c 2 -t wav -l 1Вы должны увидеть приемник (sink), в названии которого упоминается xrdp, и услышать тестовый сигнал через ваш клиент. Если приемник xrdp отсутствует, значит, модуль не был загружен в этот сеанс. Ваш клиент также должен запрашивать аудио: это флаг /sound в xfreerdp3 или настройка "Remote audio" в разделе Local Resources в клиенте Windows.
Текстовый буфер обмена работает в обоих направлениях, если для вашего сеанса запущен xrdp-chansrv, который xrdp запускает автоматически. Проверьте это с помощью pgrep -a xrdp-chansrv. Если копирование и вставка перестали работать во время сеанса, значит, этот процесс завершился; переподключение перезапустит его. Копирование файлов, в отличие от текста, осуществляется через отдельный канал, называемый перенаправлением дисков: /drive:home,/home/you в xfreerdp3 монтирует локальную папку в удаленный сеанс.
Всплывающее окно polkit и другие ошибки при первом входе
Самая частая неожиданность при первом входе — диалоговое окно с текстом Authentication is required to create a color managed device. Причина конкретна. Служба colord запрашивает у polkit разрешение; polkit предоставляет его без запроса только сеансам, которые считает локальными, а RDP-сессия таковой не является, поэтому polkit переходит к запросу пароля. В Ubuntu 24.04 поставляется polkit 124, где удалены старые файлы локальных полномочий .pkla, поэтому любые руководства с рекомендацией создать /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla в версии 24.04 не работают. Вместо этого создайте правило на JavaScript.
/* /etc/polkit-1/rules.d/45-allow-colord.rules */
polkit.addRule(function(action, subject) {
if (action.id.indexOf("org.freedesktop.color-manager.") === 0 &&
subject.isInGroup("sudo")) {
return polkit.Result.YES;
}
});Выполните sudo systemctl restart polkit и переподключитесь. Стоит знать еще о двух типах сбоев по их симптомам.
Окно входа принимает пароль и сразу возвращается обратно. Сеанс запустился и завершился. Сначала прочитайте /var/log/xrdp-sesman.log, затем ~/.xsession-errors в вашем домашнем каталоге. Отсутствие xorgxrdp, указание в ~/.xsession рабочего стола, который не установлен, отсутствие прав на запись в домашний каталог или переполнение диска — всё это приводит к такому результату.
Вы подключаетесь и видите серый экран с курсором X. X-сервер запустился, а графическая оболочка — нет. Это снова ~/.xsession: запустите xfce4-session вручную через SSH и прочитайте ошибку, которую он выведет.
Что делает self-hosted сервер RustDesk
RustDesk разделяется на два процесса. hbbs — это сервер идентификации и rendezvous, на котором регистрируются клиенты, а hbbr — это ретранслятор (relay), который обеспечивает сессию, если прямое peer-to-peer соединение невозможно. Ни один из них не запускает графическую оболочку. Оба процесса запускаются из одного образа; ниже приведен compose-файл, который публикует проект, с измененным адресом ретранслятора на ваш собственный хост:
services:
hbbs:
container_name: hbbs
image: rustdesk/rustdesk-server:latest
command: hbbs -r rustdesk.example.com:21117
ports:
- 21115:21115
- 21116:21116
- 21116:21116/udp
- 21118:21118
volumes:
- ./data:/root
restart: unless-stopped
hbbr:
container_name: hbbr
image: rustdesk/rustdesk-server:latest
command: hbbr
ports:
- 21117:21117
- 21119:21119
volumes:
- ./data:/root
restart: unless-stoppedЗапустите его, а затем прочитайте публичный ключ, который сервер сгенерировал при первом старте:
sudo docker compose up -d
sudo cat ./data/id_ed25519.pubКаждому клиенту требуются ваш хост и этот публичный ключ; оба параметра вводятся в настройках сети (Network settings) клиента RustDesk. Соответствующий приватный ключ остается в ./data/id_ed25519. Если удалить каталог с данными, сервер сгенерирует новую пару ключей, поэтому все клиенты потребуют перенастройки с новым ключом. Создавайте резервные копии этого каталога. Если этот способ доступа к машинам становится основным для вашей команды, а не просто экспериментом на выходные, стоит использовать специализированную сборку ретранслятора RustDesk. Это обеспечит правильную работу с ключами Ed25519, использование фиксированных тегов образов вместо latest, а также позволит контролировать пропускную способность ретранслятора, за которую вы будете платить согласно вашему тарифу.
Межсетевой экран должен разрешать входящие соединения по этим портам. hbbs использует TCP 21115, 21116 и 21118, а также UDP 21116. hbbr использует TCP 21117 и 21119.
sudo ufw allow 21115/tcp
sudo ufw allow 21116/tcp
sudo ufw allow 21116/udp
sudo ufw allow 21117/tcp
sudo ufw allow 21118/tcp
sudo ufw allow 21119/tcpПочему RustDesk не работает за Nginx или Traefik
Пользователи, которые уже настроили TLS termination для всех сервисов на одном reverse proxy, часто сталкиваются с проблемами при попытке сделать то же самое для RustDesk. Программы hbbs и hbbr используют собственные бинарные протоколы поверх TCP и UDP, а не HTTP. В этих протоколах нет заголовка Host для маршрутизации и нет HTTP-запроса для анализа, поэтому блок server в Nginx или HTTP-роутер в Traefik не могут найти соответствие для запроса. UDP-слушатель на порту 21116 не является HTTP-сущностью ни на одном из уровней модели OSI.
Существует два рабочих решения. Nginx может перенаправлять TCP-порты с помощью блока stream — это обычная передача трафика на 4-м уровне, а не reverse proxy в привычном понимании. Порты 21118 и 21119 передают данные через WebSockets, которые используются веб-клиентом RustDesk; это обычный HTTP, поэтому эти два порта можно разместить за прокси. Если вы используете этот метод, добавьте правила межсетевого экрана, чтобы только прокси имел доступ к 21118 и 21119. Это необходимо, так как hbbs доверяет заголовку X-Real-IP в WebSocket-соединениях для определения реального IP-адреса клиента.
Одноразовый браузер в контейнере
Иногда требуется чистый браузер с неизменным IP-адресом, изолированный от основной системы. Контейнерное рабочее пространство решает эту задачу при минимальном количестве установленного ПО. Webtop от LinuxServer — это легковесный вариант:
services:
webtop:
image: lscr.io/linuxserver/webtop:latest
container_name: webtop
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
volumes:
- /path/to/data:/config
ports:
- 127.0.0.1:3000:3000
- 127.0.0.1:3001:3001
shm_size: "1gb"
restart: unless-stoppedПорт 3000 обслуживает HTTP, а 3001 — HTTPS; доступ к рабочему столу осуществляется через вкладку браузера без использования RDP-клиента. Теги образов включают XFCE, KDE, MATE и i3 на базе различных дистрибутивов. Документация проекта прямо предупреждает о рисках: контейнер имеет привилегированный доступ к хосту и содержит терминал с sudo без пароля, поэтому его нельзя выставлять в интернет без защиты. Именно поэтому указанные выше порты привязаны к 127.0.0.1, а не опубликованы на всех интерфейсах. Доступ к ним следует организовать через тот же SSH-туннель или VPN, который вы использовали для xrdp.
Kasm Workspaces реализует ту же концепцию в гораздо большем масштабе, предлагая веб-консоль, учетные записи пользователей и контейнеры для каждой сессии, которые сбрасываются после её завершения. Для работы требуется больше ресурсов, чем есть у небольшого VPS. По состоянию на август 2026 года минимальные системные требования составляют 2 ядра CPU, 4 ГБ оперативной памяти и 50 ГБ SSD, при этом каждая пользовательская сессия по умолчанию потребляет дополнительные 2 ядра и 2768 МБ памяти. Тарифный план с 2 ГБ ОЗУ не потянет это решение. Установка выполняется путем загрузки и запуска скрипта:
cd /tmp
curl -O https://kasm-static-content.s3.amazonaws.com/kasm_release_1.17.0.7f020d.tar.gz
tar -xf kasm_release_1.17.0.7f020d.tar.gz
sudo bash kasm_release/install.shVNC и области его применения
VNC передает обновления фреймбуфера, а не команды отрисовки, поэтому на медленных каналах протокол работает медленнее, чем RDP, и не поддерживает передачу звука. Он полезен в одном случае: если вам нужна сессия рабочего стола, которая продолжает работать после отключения и восстанавливается при повторном подключении. TigerVNC поддерживает такой режим. vncserver -localhost yes :1 привязывает Xvnc к 127.0.0.1 на порту TCP 5901 и отклоняет подключения извне, поэтому туннелировать его нужно так же, как xrdp, с помощью ssh -N -L 5901:127.0.0.1:5901 you@vps.example.com. Никогда не открывайте VNC-порт для внешнего доступа. Большинство VNC-серверов защищают пароль только во время рукопожатия, а остальной трафик передается открыто, поэтому при работе через публичный порт содержимое сессии может быть перехвачено.
Подходит ли VPS для использования в качестве рабочего стола?
В качестве основного компьютера для ежедневной работы — нет, и на это есть ряд причин. У VPS отсутствует GPU, поэтому всю отрисовку выполняет CPU. Каждое нажатие клавиши ожидает сетевого отклика, и задержка в 40 мс, которая кажется приемлемой в SSH, становится заметной в текстовом редакторе. Видео сжимается дважды: сначала самим сайтом, а затем кодировщиком RDP. Ваши файлы хранятся на диске, который вам не принадлежит, а интенсивная работа с графическим интерфейсом быстро исчерпает месячный лимит трафика, рассчитанный на веб-сервер.
В качестве одноразовой машины VPS подходит очень хорошо, и те же самые свойства объясняют почему. IP-адрес стабилен и принадлежит дата-центру, что необходимо, если сервису требуется постоянный адрес. Машина восстанавливается из образа за считанные минуты, поэтому сессия, в которой вы подхватили что-то вредоносное, не несет для вас никаких последствий. Она изолирована от вашего реального оборудования и продолжает работать, когда ваш ноутбук выключен. Почасовая тарификация делает использование «одноразового» рабочего стола недорогим.
Если вы еще не определились с назначением сервера, перед установкой графической оболочки стоит ознакомиться с практическим списком задач, для которых подходит VPS. А если причиной установки рабочего стола было одно конкретное приложение для Windows, сначала оцените реальные различия между Linux и Windows Server, так как лицензия меняет стоимость решения.
FAQ
Можно ли запустить удаленный рабочий стол на VPS с 2 ГБ ОЗУ?
Да, если использовать легковесную графическую оболочку. XFCE или LXQt потребляют примерно от 300 до 400 МБ после входа в систему, что оставляет достаточно ресурсов для браузера с несколькими вкладками. GNOME или KDE Plasma на 2 ГБ ОЗУ практически не оставляют места для приложений. Добавьте файл подкачки (swap) объемом 2 ГБ, чтобы при нехватке памяти система замедлялась, а не завершала процессы принудительно. Если приложение исчезает без сообщений об ошибках, проверьте dmesg | grep -i "killed process" на наличие записей о работе OOM-killer (Out-of-Memory killer) ядра.
Стоит ли открывать порт 3389 на сетевом экране VPS?
Нет. TCP 3389 постоянно сканируется, а открытая форма входа RDP провоцирует попытки подбора пароля. Установите port=tcp://.:3389 в /etc/xrdp/xrdp.ini, чтобы xrdp прослушивал только 127.0.0.1, подтвердите это командой ss -tlnp | grep 3389 и подключайтесь через ssh -N -L 3389:127.0.0.1:3389 you@vps.example.com. Если пользователей больше одного или двух, привяжите xrdp к адресу WireGuard вместо loopback.
Почему xrdp запрашивает «Authentication is required to create a color managed device»?
Служба colord запрашивает разрешение у polkit, который предоставляет его без запроса только для локальных сессий. RDP-сессия не считается локальной, поэтому при каждом входе появляется запрос пароля. В Ubuntu 24.04 старый метод с .pkla не работает, так как в polkit 124 были удалены файлы локальных полномочий. Создайте /etc/polkit-1/rules.d/45-allow-colord.rules, содержащий JavaScript-правило, которое возвращает polkit.Result.YES для идентификаторов действий, начинающихся с org.freedesktop.color-manager., а затем выполните sudo systemctl restart polkit.
Можно ли разместить self-hosted сервер RustDesk за nginx или Traefik?
Основной сервис — нет. hbbs и hbbr используют собственные бинарные протоколы, а не HTTP, поэтому в них нет заголовка Host для маршрутизации, а UDP 21116 вообще не может проходить через HTTP-прокси. Откройте TCP 21115–21119 и UDP 21116 на сетевом экране и разрешите клиентам подключаться напрямую. Порты websocket 21118 и 21119, используемые веб-клиентом, работают по HTTP и могут находиться за прокси. В этом случае ограничьте доступ к ним на сетевом экране так, чтобы к ним обращался только прокси, так как hbbs доверяет X-Real-IP на этих соединениях.
Почему в моей xrdp-сессии нет звука?
Ubuntu 24.04 использует PipeWire, тогда как перенаправление звука в xrdp было разработано для PulseAudio, поэтому звук не появится, пока вы не установите мост. Выполните sudo apt install -y pipewire-module-xrdp, затем полностью завершите сессию и войдите снова, так как модуль загружается при старте сессии, а переподключение его не активирует. Проверьте наличие приемника (sink) с именем xrdp с помощью pactl list short sinks и убедитесь, что клиент запрашивает звук — за это отвечает флаг /sound в xfreerdp3 или настройка «Remote audio» в клиенте Windows.