Как настроить удаленный рабочий стол на Linux VPS
Узнайте, как запустить графический интерфейс через xrdp и XFCE с защитой через SSH туннель. Разберитесь, чем полноценный рабочий стол на VPS отличается от брокера RustDesk.
Что на самом деле означает удаленный рабочий стол на Linux VPS
По запросу «удаленный рабочий стол на Linux VPS» находятся два разных типа продуктов, и выбор неподходящего варианта может стоить вам нескольких часов работы. Первый — это брокер удаленного доступа. Типичный пример — self-hosted сервер 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 в строке.
Why you should not open port 3389 to the internet
TCP 3389 is scanned continuously by everything on the internet, and an RDP login box answers politely to every password attempt. Do not open it. Bind xrdp to the loopback address instead, and reach it through a tunnel you already trust.
Edit /etc/xrdp/xrdp.ini and change the listener in the [Globals] section.
[Globals]
port=tcp://.:3389The shipped file documents that syntax in its own comments: tcp://.:3389 means 127.0.0.1:3389, and tcp://:3389 means every interface. Restart and confirm, because a typo here silently leaves the service on all addresses.
sudo systemctl restart xrdp
ss -tlnp | grep 3389You want 127.0.0.1:3389. Seeing 0.0.0.0:3389 means xrdp ignored your edit, usually because the line ended up under a different section heading further down the file.
Now open the tunnel from your own machine.
ssh -N -L 3389:127.0.0.1:3389 you@vps.example.com-N means "open the connection but run no command", so the session exists only to carry the port. Leave that terminal running and point the RDP client at 127.0.0.1:3389. On a Linux client the software is FreeRDP 3, whose binary on Ubuntu 24.04 is named xfreerdp3:
sudo apt install -y freerdp3-x11
xfreerdp3 /v:127.0.0.1:3389 /u:you /dynamic-resolution +clipboard /soundOn Windows use the built-in mstsc and type 127.0.0.1 as the computer. FreeRDP asks you to trust the certificate on the first connect and prints Do you trust the above certificate? (Y/T/N), which is expected with the self-signed snakeoil certificate.
If ssh answers bind [127.0.0.1]:3389: Address already in use, something on your own machine already holds 3389. Move the local end with ssh -N -L 13389:127.0.0.1:3389 you@vps.example.com and connect to 127.0.0.1:13389.
One tunnel per person gets tiring, so for a team the better answer is a private network. Put the box behind a self-hosted WireGuard VPN, give it the tunnel address 10.8.0.1, and set port=tcp://10.8.0.1:3389 so xrdp answers only inside the VPN. Either way, the firewall rule for 3389 should not exist at all. If you are unsure what your current rules allow, start from ufw firewall basics on a VPS and check before you connect, not after.
Сколько оперативной памяти использует удаленный рабочий стол на VPS с 2 ГБ
Выбор графической оболочки определяет, будет ли работа на тарифе с 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 МБ; оба варианта оставляют на сервере с 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), который передает трафик сессии, если прямое P2P-соединение невозможно. Ни один из них не запускает графическую оболочку. Оба процесса запускаются из одного образа. Ниже приведен 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. Если удалить каталог с данными, сервер сгенерирует новую пару ключей, после чего все клиенты потребуют перенастройки с новым ключом. Регулярно делайте резервные копии этого каталога.
Межсетевой экран должен разрешать входящие соединения по следующим портам. 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 GB оперативной памяти и 50 GB SSD, при этом на каждую пользовательскую сессию дополнительно выделяется 2 ядра и 2768 MB. Тарифный план с 2 GB памяти не обеспечит работу системы. Установка выполняется путем загрузки и запуска скрипта:
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 для использования в качестве десктопа?
В качестве основного рабочего инструмента — нет, и на это есть ряд причин. Отсутствие 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" на наличие записей о работе kernel 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.