xrdp
| Xrdp | |
|---|---|
| Разработчик(и) | Jay Sorg, xrdp Team |
| Первый выпуск | 2004 |
| Лицензия | Apache, GNU GPL |
| Репозиторий | xrdp |
| Сайт | xrdp.org |
Первоначальная настройка сервера XRDP на сервере
- Установить пакет xrdp:
# apt-get install xrdp
- Включить и добавить в автозапуск сервисы:
# systemctl enable --now xrdp xrdp-sesman
Права доступа пользователя:
- Для доступа к терминальному сеансу — включить в группу tsusers:
# gpasswd -a user tsusers
- Для проброса папки — включить в группу fuse:
# gpasswd -a user fuse
Настройки
Настройки сервера хранятся в файле /etc/xrdp/sesman.ini. Некоторые настройки сервера установленные по умолчанию:
- AllowRootLogin=true — авторизация Root;
- MaxLoginRetry=4 — максимальное количество попыток подключения;
- TerminalServerUsers=tsusers — группа, в которую необходимо добавить пользователей для организации доступа к серверу;
- MaxSessions=50 — максимальное количество подключений к серверу;
- KillDisconnected=false — разрыв сеанса при отключении пользователя;
- FuseMountName=Mount_FOLDER — название монтируемой папки.
По умолчанию для подключения по RDP используется порт 3389. Номер порта можно изменить в файле /etc/xrdp/xrdp.ini.
Подключение
Для подключения можно использовать FreeRDP — клиент для подключения к удаленному рабочему столу по протоколу RDP.
Установить пакет xfreerdp:
# apt-get install xfreerdp
Синтаксис:
xfreerdp [файл] [параметры] [/v:<сервер>[:порт]]
Описание некоторых параметров:
- /v:<сервер>[:порт] — IP-адрес или имя сервера;
- /u:<пользователь> — имя пользователя;
- /p:<пароль> — пароль пользователя;
- /w:<ширина> — ширина окна;
- /h:<высота> — высота окна;
- /f — полноэкранный режим;
- /size:<ширина>x<высота> — размер окна;
- /drive:<название>,<путь> — подключение каталога.
Пример:
$ xfreerdp /drive:Epson,/home/cas/epson /v:10.4.129.129 /u:user /p:123
где:
- Epson — название папки, которая будет показываться в каталоге thinclient_drives в домашней папке терминального пользователя, у локального пользователя пробрасывается папка /home/cas/epson;
- 10.4.129.129 — адрес терминального сервера;
- user — имя терминального пользователя;
- 123 — пароль терминального пользователя.
Если пользователь или пароль не указаны, появится окно входа:
Также для подключения можно использовать клиент Remmina, Connector или Krdc.
Дополнительно (MATE)
Для использования сервером установленной графической оболочки MATE выполните следующее:
- Установите пакет mate-session.
# apt-get install mate-session
- Убедитесь, что по умолчанию будет запускаться mate-session:
$ runwm --print default /usr/bin/mate-session
Проброс звука
Для прослушивания звука из терминального сеанса локально установите на терминальный сервер пакет pulseaudio-module-xrdp:
# apt-get install pulseaudio-module-xrdp
При использовании в качестве клиента xfreerdp добавьте параметр /sound:sys:pulse:
xfreerdp /v:10.4.4.17 /u:user /p:123 /sound:sys:pulse
Права доступа к локальным ключевым носителям ruToken для удалённого клиента xrdp
Система не даёт даёт прав доступа к локальным (для xrdp-сервера) ключевым носителям ruToken удалённому пользователю, если носители физически подключены, список контейнеров в панели управления КриптоПро (cptools) пуст, а в журнале присутствуют сообщения такого вида:
... pcscd[4000]: 01024216 auth.c:145:IsClientAuthorized() Process 3090 (user: 1000) is NOT authorized for action: access_card ... pcscd[4000]: 00000173 winscard_svc.c:518:ContextThread() Rejected unauthorized client for 'Aktiv Rutoken ECP - CP 00 00'
Для разрешения доступа к локальным ключевым носителям ruToken при соединении через xrdp необходимо:
1. Добавить пользователя в группу tsusers (в т.ч. для доступа через xrdp-сервер в принципе):
# usermod -aG tsusers <your_user>
где <your_user> - логин вашего пользователя.
2. К содержимому файла "/usr/share/polkit-1/rules.d/xrdp.rules" добавить следующий раздел:
// to allow work with local ruToken from remote RDP client via local xrdp service
polkit.addRule(function(action, subject) {
var actions = ["org.debian.pcsc-lite.access_pcsc", "org.debian.pcsc-lite.access_card"];
if (actions.indexOf(action.id) !== -1 && subject.active && subject.isInGroup("tsusers")) {
return polkit.Result.YES;
}
});
Проброс USB-устройств
Для проброса USB-устройств на сервере необходимо установить пакет xrdp-usb-session:
# apt-get install xrdp-usb-session
Данный компонент пробрасывает широкий спектр устройств, начиная от USB-веб-камер, до USB-токенов и смарт-карт. Инструкция по использованию: Xrdp-usb
Запуск удаленной графической сессии на Xrdp
С начала октября 2025 года в ALT Linux P11/Sisyphus была изменена логика запуска графической удаленной сессии при работе с терминальным сервером Xrdp.
Ранее, использовалась чисто утилита wm-select из одноименного пакета, отображающая окно выбора графической сессии для запуска.
<скриншот wm-select> Теперь:
- если установлен wm-select, то старый алгоритм
- если этого пакета нет
- если не заданы переменные STARTUP и DESKTOP_SESSION (они могут быть заданы в ~/.bashrc, а могут быть заданы в глобальный конфиг) то при наличии команды runwm система попытается определить стартовую команду STARTUP.
- при отсутствии команды runwm или когда она ничего не смогла определить, из /usr/share/xsessions берётся первый попавшийся desktop файл, и из него извлекается команда STARTUP и запускается /etc/X11/Xsession с аргументом STARTUP
В случае GNOME:
STARTUP=/usr/bin/gnome-session
или
В переменной DESKTOP_SESSION указываем имя десктоп файла без расширения .desktop из /usr/share/xsessions/.
В случае GNOME:
DESKTOP_SESSION=gnome
Доступ доменных пользователей
В раздел домена в файле /etc/sssd/sssd.conf необходимо указать ad_gpo_map_service = +xrdp-sesman:
[domain/TEST.ALT]
...
ad_gpo_map_service = +xrdp-sesman
...
Иначе будет возникать ошибка:
pam_acct_mgmt failed: Permission denied
Локальные группы для доменных пользователей
Вариант с локальной группой для доменных пользователей не работает, поэтому для них работает отключение группы (или указание любой нелокальной, даже несуществующей):
В файле /etc/xrdp/sesman.ini
TerminalServerUsers=
После исправления файла запустите
# systemctl restart xrdp-sesman
Журнал для sesman (сеансов пользователей) находится в файле /var/log/xrdp-sesman.log.
Данная ситуация возникла потому, что в больших доменах показ всех членов группы нагружает систему, поэтому в /etc/sssd/sssd.conf по умолчанию используется значение enumerate = false.
Если в разделе домена в файле /etc/sssd/sssd.conf явно указать enumerate=true:
[domain/TEST.ALT]
id_provider = ad
auth_provider = ad
chpass_provider = ad
default_shell = /bin/bash
fallback_homedir = /home/%d/%u
debug_level = 0
enumerate = true
то в /etc/xrdp/sesman.ini можно указать
TerminalServerUsers=domain users
Не забудьте перезапустить службы sssd и xrdp-sesman.
Повышение привилегий
- consolehelper, beesu — ограничений нет;
- polkit — требует создание дополнительных правил для удалённых пользователей. Подробнее описано на https://github.com/neutrinolabs/xrdp/issues/1568#issuecomment-624727037
Производительность
Рекомендуется отключить эффекты рабочего стола. Можно установить пакеты:
| Среда | Пакет |
| MATE | mate-reduced-resource |
| XFCE | xfce-reduced-resource |
См. также: https://askubuntu.com/questions/1283709/xrdp-and-xfce4-ubuntu-18-04-unusable#tab-top
Оптимизация производительности xfreerdp
xfreerdp ... +bitmap-cache /rfx /codec-cache:rfx /compression-level:2 /video
При подключении с linux-машины на linux-машину это очень сильно улучшает производительность передачи графики и видео. Для Windows это не критично (похоже, там нужные опции включаются автоматически).
"Windows-подобные" режимы работы
В терминальном сервере Windows есть два режима работы:
- когда после выхода пользователя из удаленного сеанса сессия продолжает работать и при переподключении к серверу пользователь попадает в ту же сессию
- когда после каждого захода в систему открывается новая сессия
Включение
По-умолчанию Xrdp работает в первом режиме. Но, правкой конфигурационного файла можно сделать подобие второго режима:
# mcedit /etc/xrdp/sesman.ini
В файле находим переменные:
KillDisconnected DisconnectedTimeLimit
Первая переменная принимает значения true или false. При включенном значении сессия будет завершаться спустя некоторое время, что будет как бы выполнять "второй режим". При выключенном значении сервер будет работать в стандартном режиме, когда пользователь, всегда подключаясь к серверу, попадает в существующую сессию.
Вторая переменная устанавливает ограничение по времени, через которое сессия завершится. Т.е. в течении указанного времени пользователь сможет переподключиться в существующую сессию. По истечении этого времени сессия завершится и когда пользователь попробует снова зайти на сервер, у него будет снова "пустая" сессия, что, собственно, нам и нужно. Данный параметр активен, только когда первая переменная установлена в True.
KillDisconnected=true DisconnectedTimeLimit=10
При данных значениях после отключения пользователя от сессии, она будет завершаться через 10 секунд. Следовательно, когда он попробует зайти еще раз в систему - у него будет чистая сессия. Цель достигнута.
Отключение
Чтобы отключить данный параметр, достаточно просто присвоить первой переменной значение false. Вторая переменная используется только для настройки.
KillDisconnected=false
Режим отключен.
Решение проблем
Общий подход
Первым делом обратите внимание на логи как сервера, так и сессии:
- /var/log/xrdp.log и /var/log/xrdp-sesman.log
- ~/.xorgxrdp.*.log в домашнем каталоге пользователя
Например, такие строчки в последнем свидетельствуют о необходимости запроса пересборки xrdp с текущим xorg-server:
(EE) xorgxrdp: module ABI major version (23) doesn't match the server's version (24) (EE) Failed to load module "xorgxrdp" (module requirement mismatch, 0)
Проблемы соединения с мобильным rdp-клиентом
В некоторых мобильных rdp-клиентах, особенно предназначенных для работы на старых версиях Android, если выбрать режим «Воспроизведение звука на стороне клиента» (или аналогичный) возникает ошибка соединения.
Решается запретом воспроизведения звука в настройках клиента или изменением в /etc/xrdp/xrdp.ini в строке rdpsnd=true, значения true на false. При этом клиент лишается возможности воспроизводить звук, однако в остальном соединение работает.
Проблема подключения с Windows XP
Для подключения рабочих станций с Windows XP необходимо в файле /etc/xrdp/xrdp.ini добавить поддержку протокола TLSv1.1:
ssl_protocols=TLSv1.1, TLSv1.2, TLSv1.3
Эта поддержка была исключена из конфигурации по умолчанию в версии 0.9.8 (https://github.com/neutrinolabs/xrdp/releases/tag/v0.9.8).
Проблемы соединения с тонким клиентом Dell Wyse 3040
Для подключения тонких клиентов Dell Wyse 3040 в /etc/xrdp/xrdp.ini необходимо выключить звуковую поддержку:
rdpsnd=false
Проблемы одновременного запуска локального и удалённого сеанса
С версии 0.9.14-alt5 файл /etc/pam.d/xrdp-sesman стал основан на правилах common-login. Второй сеанс systemd для одного и того же пользователя не удаётся запустить. Если это действительно надо, замените строку
session include common-login
на
session substack system-auth session required pam_loginuid.so session substack system-policy
Процесс gvfsd-trash занимает 100% процессора
Создайте раздел или файл подкачки. Например, по статье: Swap
Рабочий стол Mate в сеансе не показывает значки
Вариант 1.
Создайте файл /etc/xdg/autostart/caja-restart.desktop:
[Desktop Entry]
Type=Application
Name=Restart Caja in remote session
Exec=dbus-launch caja --force-desktop
Вариант 2.
Замените строку в файле /usr/share/applications/caja.desktop
Exec=/usr/bin/caja
на
Exec=/usr/bin/caja --force-desktop
Чтобы избежать сообщение об ошибке получения имени сессии, в файл /etc/xrdp/startwm.sh добавьте следующие строки
unset DBUS_SESSION_BUS_ADDRESS exec mate-session
Вариант 3.
См. Отсутствует часть пунктов меню в Mate и Xfce
Если пользователь ранее не регистрировал локальный сеанс, то при подключении новым пользователем xrdp не создаёт окружение пользователя в /home
Данная ситуация характеризуется следующей ошибкой при попытке подключения новым пользователем по xrdp:
[ERROR] another Xserver might already be active on display 9 - see log [DEBUG] aborting connection...
Для решения этой проблемы необходимо добавить в конец файла /etc/pam.d/xrdp-sesman строки:
session required pam_env.so readenv=1 user_readenv=0 session required pam_mkhomedir.so skel=/etc/skel/ umask=0077
Отсутствует часть пунктов меню в Mate и Xfce
Проблема возникает из-за некорректного формирования переменной окружения XDG_CURRENT_DESKTOP. Должно быть, например, XDG_CURRENT_DESKTOP=XFCE или XDG_CURRENT_DESKTOP=MATE, а формируется XDG_CURRENT_DESKTOP=Old. Видимо wm-select не умеет нормально задавать XDG_CURRENT_DESKTOP. Удаление wm-select решает проблему с ярлыками и урезанным меню (при этом не будет возможности выбрать DE!). Работает как для DE установленного из коробки, так и установленного вручную.
Другой вариант решения, это добавить "export XDG_CURRENT_DESKTOP=XFCE" в скрипт /etc/xrdp/startwm.sh:
...
# debian, alt
if [ -r /etc/X11/Xsession ]; then
pre_start
export XDG_CURRENT_DESKTOP=XFCE
. /etc/X11/Xsession
post_start
exit 0
fi
...
Не работает RDP подключение для GNOME
В качестве обходного пути вы можете выполнить следующие действия:
1. Раскомментируйте в /etc/gdm/custom.conf следующую строку:
WaylandEnable=false
2. Перезагрузите систему.
3. В /etc/xrdp/sesman.ini в параметрах
UserWindowManager
и
DefaultWindowManager
замените
startwm.sh
на
/usr/bin/gnome-session
# cat /etc/xrdp/sesman.ini | grep Manager EnableUserWindowManager=true ;UserWindowManager=startwm.sh UserWindowManager=/usr/bin/gnome-session ;DefaultWindowManager=startwm.sh DefaultWindowManager=/usr/bin/gnome-session
4. После перезапустите следующие службы и попробуйте подключиться к узлу по rdp.
# systemctl restart xrdp # systemctl restart xrdp-sesman.service

