Установим терминальный сервер XRDP на OC Debian 8. Настроим все основные требования для удобной работы с сервером для пользователей и администраторов. В последствии рассмотрим установку на сервер программу из семейства 1С Предприятие.

Содержание:

Введение

Потребовалось мне настроить терминальный сервер об этом я и поведаю в этой статье.

Вариант с нелегальным переводом системы Windows в терминальный сервер используя патчи я сразу отбросил в сторону.

Свобода прежде всего и свобода эта только в системах Linux.

Требования для терминального сервера:

  • Работа буфера обмена в обоих направлениях,
  • Переключение раскладки клавиатуры на русский язык,
  • Работа пользователей по сертификату,
  • Монтирование сетевых ресурсов,
  • Подключение локальной папки на сервер,
  • Создание одной сессии для пользователя,
  • Подключение принтеров.

Необходимо чтобы сессия пользователя оставалась на сервере и можно было к ней подключиться.

В стабильных версиях дистрибутивов Debian находится старая версия пакета xrdp 0.6.8 имеющая проблемы. Во многих статьях в интернете советуют собрать пакет самому используя сторонние ресурсы но статьи в основном старые, коряво написаны а может просто мало опыта. Причем последнее наверно вернее всего, не утруждают себя опытные системные администраторы при написании статей более детально рассказывать о проделанных операциях. Для понимания таких статей необходим не малый опыт в администрировании чтобы видеть что спрятано между строк.

Очередной раз попытался настроить на Ubuntu, но ничего не получилось. Установка XFCE на серверную версию оканчивается с ошибкой. Вообщем не знаю как вы, но я больше не буду даже пытаться использовать Ubuntu, хватит наигрался с их глюками. Да не раз уже показывает практика там версии пакетов, как правило, взяты с Debian один в один.

Все удалось настроить на Debian 8. Графическую оболочку лучше использовать легковесную такую как LXDE или XFCE. В моем случае рассматривается использование XFCE но думаю и с LXDE всё будет работать так же.

Все дальнейшие действия описаны с учетом настройки сервера по статье на сайте.
Debian 8 установка и настройка

Неудачная попытка настройки XRDP на CentOS 7

В репозитории Epel присутствует свежая версия xrdp.x86_64 1:0.9.2-10.el7 что сразу порадовало. Установка проходит без проблем и все сразу работает после старта службы.

В CentOS, как я понял, работают в основном над своим рабочим окружением Gnomе и стараются поддерживать KDE. Для терминального сервера окружение Gnome и KDE тяжеловаты. Можно установить XFCE, LXDE или MATE но они в урезанном виде и пришлось поковыряться, чтобы настроить нужные элементы на панели не говоря уже о других неудобных моментах в настройке.

Дальше я мучатся с настройкой этой системы не стал, так как в Debian все гораздо проще и удобней настроилось. Возможно позже попробую сделать на Fedora но это будет не скоро.

Добавление репозитория в Debian

Свежая версия xrdp 0.9.1 находится в репозитории jessie-backports.

Выбор пал именно на тестовый репозиторий jessie-backports. Можно конечно использовать и экспериментальный репозиторий experimental и там будет совсем свежая версия но вопрос в стабильности. Для работы я пользуюсь тестовыми репозиториями в самом крайнем случае.

Добавим в необходимый файл параметр:

mcedit /etc/apt/sources.list
= необходимое добавление =
deb http://httpredir.debian.org/debian jessie-backports main contrib non-free

Обновим список пакетов:

apt-get update

Установка XRDP

Установим из нужного репозитория:

apt-get install -t jessie-backports xrdp xorgxrdp

К сожалению будет ошибка:

= информация об ошибке установки =
A dependency job for xrdp.service failed. See 'journalctl -xn' for details.
 invoke-rc.d: initscript xrdp, action "start" failed.
 dpkg: ошибка при обработке пакета xrdp (--configure):
 подпроцесс установлен сценарий post-installation возвратил код ошибки 1
 Обрабатываются триггеры для libc-bin (2.19-18+deb8u9) …
 Обрабатываются триггеры для systemd (215-17+deb8u7) …
 При обработке следующих пакетов произошли ошибки:
 xrdp
 E: Sub-process /usr/bin/dpkg returned an error code (1)

Исправляется ошибка добавление параметра в файл:

mcedit /lib/systemd/system/xrdp-sesman.service
= необходимое добавление =
[Service]
ExecStartPre=/bin/sh /usr/share/xrdp/socksetup

Повторим установку:

apt-get install -t jessie-backports xrdp xorgxrdp
= вывод команды =
 Чтение списков пакетов… Готово
 Построение дерева зависимостей
 Чтение информации о состоянии… Готово
 Уже установлена самая новая версия xorgxrdp.
 Уже установлена самая новая версия xrdp.
 обновлено 0, установлено 0 новых пакетов, для удаления отмечено 0 пакетов, и 153 пакетов не обновлено.
 не установлено до конца или удалено 1 пакетов.
 После данной операции, объём занятого дискового пространства возрастёт на 0 B.
 Хотите продолжить? [Д/н] д
 Настраивается пакет xrdp (0.9.1-4~bpo8+1) …
Generating 2048 bit rsa key...
ssl_gen_key_xrdp1 ok
saving to /etc/xrdp/rsakeys.ini
Обрабатываются триггеры для libc-bin (2.19-18+deb8u9) …

Как видим все прошло успешно.

Создадим необходимые ссылки:

ln -s /lib/systemd/system/xrdp.service /etc/systemd/system
ln -s /lib/systemd/system/xrdp-sesman.service /etc/systemd/system

Перечитаем настройки системы:

systemctl daemon-reload

Настройка произведена и можно подключатся по протоколу RDP из любой операционной системы используюя необходимые программы.

Настройка XRDP

Вначале настроим пользователя которого создали при установке и на основе этих настроек создадим шаблон (скелет) для удобного последующего добавления пользователей.

Скелет (Skel) позволит при добавлении нового пользователя скопировать все необходимые параметры настроенного пользователя.

Курсор в черном квадрате при подключении по RDP

Неожиданно после обновления системы Calculate Linux обнаружилось что стрелка курсора показывается черном квадрате. Проблема решается редактированием файла:

mcedit /etc/xrdp/xrdp.ini
= часть вывода команды с необходимыми изменениями =
max_bpp=32
# Было true и с Сalculate Linux при подключении курсор в квадрате
new_cursors=false

Двухсторонний буфер обмена XRDP

Буфер сразу работает и не требует настроек. Все проблемы могут быть связанны с раскладкой клавиатуры которые мы решим дальше.

Запрет выключения системы пользователем XRDP

Остановился на варианте когда для выполнения перезагрузки, выключения и тд. необходимо указывать пароль root.

Будем использовать сервис PolicyKit. Все параметры разбиты на секции где есть описание на разных языках. Для применения политик в нужных параметрах указывается необходимое значение.

Изменим параметры в необходимом файле:

mcedit /usr/share/polkit-1/actions/org.freedesktop.login1.policy
= часть вывода команды и необходимые изменения =
= вместо yes указываем auth_admin_keep =
<action id="org.freedesktop.login1.power-off">
 <description>Power off the system</description>
 <description xml:lang="de">Das System ausschalten</description>
 <description xml:lang="el">Σβήσιμο του συστήματος</description>
 <description xml:lang="fr">Éteindre le système</description>
 <description xml:lang="it">Spegnere il sistema</description>
 <description xml:lang="pl">Wyłączenie systemu</description>
 <description xml:lang="ru">Выключить систему</description>
 <message>Authentication is required for powering off the system.</message>
 <message xml:lang="de">Legitimierung ist zum Ausschalten des Systems notwendig.</message>
 <message xml:lang="el">Απαιτείται πιστοποίηση για την σβήσιμο του συστήματος.</message>
 <message xml:lang="fr">Authentification requise pour éteindre le système.</message>
 <message xml:lang="it">Autenticazione richiesta per spegnere il sistema.</message>
 <message xml:lang="pl">Wymagane jest uwierzytelnienie, aby wyłączyć system.</message>
 <message xml:lang="ru">Чтобы выключить систему, необходимо пройти аутентификацию.</message>
 <defaults>
 <allow_any>auth_admin_keep</allow_any>
 <allow_inactive>auth_admin_keep</allow_inactive>
 <allow_active>auth_admin_keep</allow_active>
 </defaults>
 </action>

Теперь у всех параметров что мы выбрали для применения будет запрошен пароль root.

Одна сессия для пользователя XRDP

Мне было необходимо сделать так чтобы у пользователя при подключении создавалась только одна сессия и чтобы она сохранялась на сервере. Удобно когда уйдя с работы и закрыв терминал придя домой подключившись по RDP можно видеть свой рабочий стол со всеми открытыми документами и программами.

Для настройки нам необходимо открыть файл и сделать там необходимые изменения:

mcedit /etc/xrdp/sesman.ini
= вывод команды с необходимыми настройками =
[Globals]
ListenAddress=127.0.0.1
ListenPort=3350
EnableUserWindowManager=true
UserWindowManager=startwm.sh
DefaultWindowManager=startwm.sh

[Security]
AllowRootLogin=true
MaxLoginRetry=4
TerminalServerUsers=tsusers
TerminalServerAdmins=tsadmins
; When AlwaysGroupCheck=false access will be permitted
; if the group TerminalServerUsers is not defined.
AlwaysGroupCheck=false

[Sessions]
;; X11DisplayOffset - x11 display number offset
; Type: integer
; Default: 10
X11DisplayOffset=10 #

;; MaxSessions - maximum number of connections to an xrdp server
; Type: integer
; Default: 0
# Выставляем количество пользователей для одновременной работе на сервере
MaxSessions=3

;; KillDisconnected - kill disconnected sessions
; Type: boolean
; Default: false
; if 1, true, or yes, kill session after 60 seconds
# Не разрываем сеанс при отключении пользователя чтобы потом попасть в туже сессию
KillDisconnected=true

;; IdleTimeLimit - when to disconnect idle sessions
; Type: integer
; Default: 0
; if not zero, the seconds without mouse or keyboard input before disconnect
; not complete yet
IdleTimeLimit=0

;; DisconnectedTimeLimit - when to kill idle sessions
; Type: integer
; Default: 0
; if not zero, the seconds before a disconnected session is killed
; min 60 seconds
DisconnectedTimeLimit=0

;; Policy - session allocation policy
; Type: enum [ "Default" | "UBD" | "UBI" | "UBC" | "UBDI" | "UBDC" ]
; Default: Xrdp:<User,BitPerPixel> and Xvnc:<User,BitPerPixel,DisplaySize>
; "UBD" session per <User,BitPerPixel,DisplaySize>
; "UBI" session per <User,BitPerPixel,IPAddr>
; "UBC" session per <User,BitPerPixel,Connection>
; "UBDI" session per <User,BitPerPixel,DisplaySize,IPAddr>
; "UBDC" session per <User,BitPerPixel,DisplaySize,Connection>
Policy=Default

[Logging]
LogFile=xrdp-sesman.log
LogLevel=DEBUG
EnableSyslog=1
SyslogLevel=DEBUG

[Xorg]
param=Xorg
param=-config
param=xrdp/xorg.conf
param=-noreset
param=-nolisten
param=tcp

[Xvnc]
param=Xvnc
param=-bs
param=-nolisten
param=tcp
param=-localhost
param=-dpi
param=96

[Chansrv]
; drive redirection, defaults to xrdp_client if not set
FuseMountName=thinclient_drives

[SessionVariables]
PULSE_SCRIPT=/etc/xrdp/pulse/default.pa

Запрет авторизации ROOT

По умолчанию разрешен вход под пользователем root. В целях безопасности отключим такую возможность:

mcedit /etc/xrdp/sesman.ini
= необходимое изменение =
[Security]
# Авторизация root. true - разрешено false - запрещено
AllowRootLogin=false

Название подключенной локальной папки

Изменим название подключаемой локальной папки при подключению к серверу терминалов на свое имя:

mcedit /etc/xrdp/sesman.ini
= необходимое изменение =
[Chansrv]
; drive redirection, defaults to xrdp_client if not set
# Название монтируемой папки
FuseMountName=Mount_FOLDER

Сертификат при работе сервера XRDP

По умолчанию сертификат работает с сертификатами созданными при установке о чем свидетельствует информация в логе xrdp:

cat /var/log/xrdp.log
= необходимая информация =
[INFO ] Using default X.509 certificate: /etc/xrdp/cert.pem
[INFO ] Using default X.509 key file: /etc/xrdp/key.pem

Выпустим свой сертификат на 1 год по команде указанном в файле настройки xrdp. Создадим папку, перейдем туда и запустим команду генерации ключа:

mkdir /etc/xrpd/certificate
cd /etc/xrdp/certificate
openssl req -x509 -newkey rsa:2048 -nodes -keyout key.pem -out cert.pem -days 365

Отредактируем файл настройки:

mcedit /etc/xrdp/xrdp.ini
= необходимые изменения =
; security layer can be 'tls', 'rdp' or 'negotiate'
; for client compatible layer
security_layer=negotiate
; minimum security level allowed for client
; can be 'none', 'low', 'medium', 'high', 'fips'
crypt_level=high
; X.509 certificate and private key
; openssl req -x509 -newkey rsa:2048 -nodes -keyout key.pem -out cert.pem -days 365
certificate=/etc/xrdp/certificate/cert.pem
key_file=/etc/xrdp/certificate/key.pem
; specify whether SSLv3 should be disabled
#disableSSLv3=true
; set TLS cipher suites
#tls_ciphers=HIGH

Сообщений больше в логе нет и сервис работает с нашим сертификатом.

Настройка вида окна авторизации XRDP

Отредактируем параметры отвечающие за отображение формы авторизации пользователей. Отредактируем параметры в файле:

mcedit /etc/xrdp/xrdp.ini
= необходимые изменения =
;
; colors used by windows in RGB format
;
blue=352309
grey=dedede
#black=000000
#dark_grey=808080
#blue=08246b
#dark_blue=08246b
#white=ffffff
#red=ff0000
#green=00ff00
#background=626c72

;
; configure login screen
;

; Login Screen Window Title
ls_title=XRDP server 1C

; top level window background color in RGB format
# Фон
ls_top_window_bg_color=000000

; width and height of login screen
ls_width=350
ls_height=430

; login screen background color in RGB format
ls_bg_color=dedede

; optional background image filename (bmp format).
#ls_background_image=

; logo
; full path to bmp-file or file in shared folder
# Свой логотип в формате bmp размера 240х140
ls_logo_filename=/etc/xrdp/logo_xrdp.bmp
ls_logo_x_pos=55
ls_logo_y_pos=50

; for positioning labels such as username, password etc
ls_label_x_pos=30
ls_label_width=60

; for positioning text and combo boxes next to above labels
ls_input_x_pos=110
ls_input_width=210

; y pos for first label and combo box
ls_input_y_pos=220

; OK button
ls_btn_ok_x_pos=142
ls_btn_ok_y_pos=370
ls_btn_ok_width=85
ls_btn_ok_height=30

; Cancel button
ls_btn_cancel_x_pos=237
ls_btn_cancel_y_pos=370
ls_btn_cancel_width=85
ls_btn_cancel_height=30


Результат моих изменений.

Авторизация XRDP от sevo44.ru

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

service xrdp restart

Отключение screensaver

Вначале хотел отключать его у пользователей но подумав решил удалить:

apt-get remove xscreensaver

Настройка базового пользователя

Будем использовать пользователя что создавали при установке как базового пользователя из настроек которого будем делать скелет. Настраивайте как вам угодно. Вся настройка зависит только от требований и пожеланий конечных пользователей. Устанавливаем необходимые программы, монтируем сетевые ресурсы, устанавливаем принтеры, модернизируем панели и тд. и тп.

Раскладка клавиатуры в XFCE

С раскладками пришлось повозится больше всего. После добавления нового элемента «Раскладка клавиатуры» на панель и его настройки все работает как положено.

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

Что я только не перепробовал, куда только не писал рекомендованный код, по рекомендациям с разных статей но проблема эта никуда не уходила. Показать пользователю как каждый раз настраивать «Раскладка клавиатуры» не серьезно. Вариант есть дубовый но рабочий на 100 % и при любых обстоятельствах.

Добавил элемент на панель «Запуск приложения» указал там «Терминал Xfce» и внёс туда код:

setxkbmap -layout "us,ru" -model "pc105" -option "grp:alt_shift_toggle,grp_led:scroll"

Обратите внимание на клавиши смены раскладки!

Разместил рядом с флагами поменяв иконку на понравившуюся мне. xrdp_lang_ru_sevo44

Теперь если переключение не работает тыкаем по кнопке и раскладка снова работает.

Если кто знает способ более изящный и рабочий прощу поделится в комментариях! Только не на уровне теоретических знаний а на основе практического применения.

Блокировка настроек XFCE пользователям

В разделе выше мы ограничили пользователям возможность выключать и перезагружать сервер осталось сделать запрет на редактирование системных настроек. Делается это на удивление просто. В папке /etc/xdg/xfce4/xfconf лежат базовые настройки и по умолчанию они не работают так как работают настройки самого пользователя. Добавив параметр в эти файлы пользователь будет использовать именно их.

Вначале настроим вид панели и все настройки что нам необходимо и перенесем их в нужное место с внесением необходимых изменений.

Cделаем запрет на редактирование панели. Скопируем параметры настроенного пользователя:

cp -v /home/настроенный пользователь/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/
= вывод команды =
«/home/настроенный пользователь/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml» -> «/etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml»

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

mcedit /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml
= вывод команды с необходимыми изменениями =
<channel name="xfce4-panel" version="1.0" locked="*" unlocked="local">

После закрытия с сохранением все пользователи кроме local не смогут изменять настройки панели о чем им оповестит окно предупреждения при попытке сделать изменения.

Запрет на изменения настрое XFCE делаем по аналогии:

cp -v /home/настроенный пользователь/.config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/
= вывод команды =
«/home/настроенный пользователь/.config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml» -> «/etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml»
mcedit /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml
= вывод команды с необходимыми изменениями =
<channel name="xfce4-panel" version="1.0" locked="*" unlocked="local">

Настройки XFCE сделанные пользователем не будут применяться но никаких предупреждающих сообщений пользователь не увидит!

Мы настроили запрет на выключение и перезагрузку пользователю но значки показываются и можно выполнить действие указав пароль root. Такой вариант решает проблему но захотелось сделать эти кнопки не активными.

Изменим вид панели при выходе пользователя. Создадим папку и необходимый файл с параметрами:

mkdir /etc/xdg/xfce4/kiosk
mcedit /etc/xdg/xfce4/kiosk/kioskrc
= вывод команды с необходимыми изменениями =
[xfce4-session]
# Указываем пользователей кто может перегрузить сервер или разрешение группе %root
Shutdown=root,sevo44

Для применения всех параметров перезагрузим сервер:

reboot

Так выглядит выход из системы у пользователей с разрешением.

Xrdp настройка Xfce sevo44-1

У всех остальных будет такой вид.

Xrdp настройка Xfce sevo44-2

 Создание skel (скелета) для новых пользователей

Еще раз все проверив и убедившись в правильности всех настроек настала пора создать шаблон настроек который будет применяться на всех вновь создаваемых пользователей.

Я использую настройки самой XFCE, рабочего стола и списка баз 1С:Предприятие. Выполним действия:

cd /home/Базовый пользователь
 cp -R -f -b .config/ /etc/skel/
 cp -R -f -b Рабочий\ стол/ /etc/skel/
# В случае использования 1С:Предприятие
 cp -R -f -b .1C/1cestart/ /etc/skel/

Последняя строка кода скопирует настройку окна «Запуск 1С:Предприятие» в которой указываются параметры всех баз.

Теперь все новые пользователи при авторизации будут иметь те же настройки и информацию на рабочем столе что и базовый пользователь.

В последствии по этой схеме можно менять настройки любого пользователя перенося необходимое с папки настроенного пользователя в папку необходимого. Для большого количества пользователей можно написать несложный скрипт который автоматизирует этот процесс.

В одной из статей я подробно рассмотрел установку и настройку 1С:Предприятие на сервер терминалов который рассматриваем в этом материале.
1С:Предприятие 8.3 на Linux

Управление пользователями Debian

Для доступа будем использовать обычных пользователей которых создадим на сервере. Можно конечно настроить авторизацию по доменным пользователям, но мне такие сложности пока не требовались к тому же это приведет к необходимости настраивать VPN для пользователей которым необходимо работать удалённо.

Добавление новых пользователей

Добавление производится командой:

adduser user007
= вывод команды с информацией для заполнения =
Добавляется пользователь «user007» ...
Добавляется новая группа «user007» (1007) ...
Добавляется новый пользователь «user007» (1006) в группу «user007» ...
Создаётся домашний каталог «/home/user007» ...
Копирование файлов из «/etc/skel» ...
Введите новый пароль UNIX: 
Повторите ввод нового пароля UNIX: 
passwd: пароль успешно обновлён
Изменение информации о пользователе user007
Введите новое значение или нажмите ENTER для выбора значения по умолчанию
 Полное имя []: user007 
 Номер комнаты []: 
 Рабочий телефон []: 
 Домашний телефон []: 
 Другое []: 
Данная информация корректна? [Y/n] y

Изменении пароля пользователя

passwd user007
= вывод команды =
Введите новый пароль UNIX: 
Повторите ввод нового пароля UNIX: 
passwd: пароль успешно обновлён

Удаление пользователя

При удалении укажем необходимость удалять файлы пользователя и домашнюю директорию:

deluser --remove-home user007
= вывод команды =
Идёт поиск файлов для сохранения/удаления ...
Удаляются файлы ...
Удаляется пользователь «user007» ...
Предупреждение: в группе «user007» нет больше членов.
Готово.

Список пользователей

Посмотреть всех пользователей и их параметры можно посмотрев  необходимый файл:

cat /etc/passwd
= часть вывода команды =
test:x:1001:1001:test,,,:/home/test:/bin/bash
sevo44:x:1002:1002:sevo44,,,:/home/sevo44:/bin/bash
usr1cv8:x:999:1003:1C Enterprise 8 server launcher:/home/usr1cv8:/bin/sh
geoclue:x:119:127::/var/lib/geoclue:/bin/false
davfs2:x:120:128::/var/cache/davfs2:/bin/false

В файле указаны все основные параметры пользователя и вы можете их редактировать в случае необходимости.

Подключение локального диска на сервер терминалов

Подключение было проверено на стандартном клиенте Windows и программах LInux Remmina и KRDC. Монтирование и работа с локальным диском подключаемого клиента происходит без проблем.

Добавление принтеров

К принтерам у меня особое отношение. Эти аппараты вечно приносят кучу проблем и слава богу что все больше и больше их делают сетевыми что облегчает настройку. Настроить сетевой принтер не вызовет проблем даже у начинающего администратора. С usb принтерами придется повозится до получения бубна мастера по подключению принтера в системах Linux. Подключение  локального принтера используя программу RDP клиента у меня никогда не получалось а по словам опытных программистов работает коряво и не стабильно. Ладно еще если в одном офисе всё а если разные или вообще с дома хотят подключить принтер вообще жжжж….

Для меня есть два варианта решения проблемы для удаленных от офиса пользователей:

  1. В случаях когда принтере не требуется я в семействе бухгалтерских программ 1С настраиваю нормальное сохранения в PDF и все это сохраняется в локальную папку которая без проблем подключается к серверу терминалов во всех популярных клиентах.
  2. Если нужен принтере в работе то необходимо настраивать VPN чтобы удавленный клиент попал в туже сеть.

Управление XRDP

Управление службой стандартное для систем Debian.

service xrdp restart
service xrdp start
service xrdp stop
service xrdp status

Так выглядит статус после старта службы:

service xrdp status
● xrdp.service - xrdp daemon
 Loaded: loaded (/lib/systemd/system/xrdp.service; enabled)
 Active: active (running) since Вт 2017-05-23 15:05:32 MSK; 32s ago
 Docs: man:xrdp(8)
 man:xrdp.ini(5)
 Process: 759 ExecStart=/usr/sbin/xrdp $XRDP_OPTIONS (code=exited, status=0/SUCCESS)
 Process: 730 ExecStartPre=/bin/sh /usr/share/xrdp/socksetup (code=exited, status=0/SUCCESS)
 Main PID: 949 (xrdp)
 CGroup: /system.slice/хrdp.service
 └─949 /usr/sbin/хrdp

май 23 15:05:31 хrdp systemd[1]: PID file /run/xrdp/xrdp.pid not readable (yet?) after start.
май 23 15:05:32 хrdp systemd[1]: Started xrdp daemon.
май 23 15:05:33 хrdp xrdp[949]: (949)(140156439295744)[INFO ] starting хrdp with pid 949
май 23 15:05:45 хrdp xrdp[949]: (949)(140156439295744)[INFO ] listening to port 3389 on 0.0.0.0

Просмотр активных пользователей XRDP

У каждого подключенного пользователя создается одна сессия, их то нам и надо посмотреть выполнив необходимую команду:

ps aux | grep xrdp | grep sess
= вывод команды =
user1 1374 0.0 0.0 20092 2420 ? S июн13 0:00 /usr/sbin/xrdp-sessvc 1376 1375

Вот мы видим что подключен только один пользователь с логином user1 и PID 1369.

Просто снять этот процесс не достаточно, чтобы полностью завершить работу пользователя на сервере. Выведем список всех процессов сервиса XRDP:

ps aux | grep xrdp
= вывод команды =
avahi 625 0.0 0.0 32220 2784 ? Ss 11:07 0:00 avahi-daemon: running [xrdp1c.local]
root 759 0.0 0.0 37028 2912 ? S 11:07 0:00 /usr/sbin/xrdp-sesman
xrdp 802 0.0 0.0 24968 2032 ? S 11:07 0:00 /usr/sbin/xrdp
usr1cv8 853 1.3 2.3 1604024 105208 ? Sl 11:07 0:06 /opt/1C/v8.3/x86_64/rmngr -port 1541 -host xrdp -range 1560:1591 -clstid 647987d4-4ac9-11e7-d489-12508af76120
usr1cv8 1031 0.9 5.1 1254404 229300 ? Sl 11:07 0:04 /opt/1C/v8.3/x86_64/rphost -range 1560:1591 -reghost xrdp -regport 1541 -pid 67059b5a-4ac9-11e7-d489-12508af76120
xrdp 1372 1.1 0.6 60012 27956 ? S 11:10 0:03 /usr/sbin/xrdp
user1 1374 0.0 0.0 20092 2448 ? S 11:10 0:00 /usr/sbin/xrdp-sessvc 1376 1375
root 1375 0.0 0.0 60808 2848 ? S 11:10 0:00 /usr/sbin/xrdp-sesman
user1 1376 2.8 1.1 264172 52872 ? Sl 11:10 0:08 Xorg :10 -auth .Xauthority -config xrdp/xorg.conf -noreset -nolisten tcp
user1 1380 0.0 0.0 120136 4212 ? Sl 11:10 0:00 xrdp-chansrv
root 2850 0.0 0.0 13976 2144 pts/0 S+ 11:15 0:00 grep xrdp

Теперь мы можем отключить пользователя указав команду, которая завершит все процессы пользователя:

pkill -9 -u user1

К сожалению без перезагрузки сервера при подключении пользователя после принудительного отключения не работает буфер обмена. Пробовал разные варианты но проблема решается только перезагрузкой.

Ротация логов xrdp

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

Откроем файл и добавим необходимые логи:

mcedit /etc/logrotate.d/rsyslog
=вывод команды с необходимыми дополнениями =
/var/log/syslog
{
 rotate 7
 daily
 missingok
 notifempty
 delaycompress
 compress
 postrotate
 invoke-rc.d rsyslog rotate > /dev/null
 endscript
}

/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
/var/log/хrdp-sesman.log
/var/log/хrdp.log
{
 rotate 4
 weekly
 missingok
 notifempty
 compress
 delaycompress
 sharedscripts
 postrotate
 invoke-rc.d rsyslog rotate > /dev/null
 endscript
}

Результат

Все требуемые мной параметры получились. Дальнейшая работа покажет какие проблемы могут быть в работе но это обыденно и любая система требует вмешательства администратора. Все проблемы и их решения будут тут отражены.

Вся эта статья была лишь прелюдия для того чтобы рассказать как можно используя Linux настроить легально и надежно стабильную работу сервера 1С работающего с файловой базой. Минимальные вложения и максимальная производительность.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Хотите сказать денежное спасибо? Подарите денежку!

  • Евгений Потапыч

    Отличная статья! Добавь Мегафон! в пункт приема средств.

  • http://vk.com/id63130413 Алексей Долотов

    Не позволяет эта форма добавить перевод от Мегафона.

  • Денис Бузин

    Установил актуальную версию xrdp 0.9.3.1 и xorg 0.2.3, но проблема с раскладкой клавиатуры так и осталась, причем проблема проявляется постоянно после установки rdp соединения. Выручает ваш совет с ярлыком в панеле задач, но так хотелось бы устранить этот баг.

  • Алексей Долотов

    Вот и мне хочется, но пока не могу решить эту проблему.

  • Денис Бузин

    Какой командой можно завершить удаленный сеанс всем пользователям кроме администраторов (это необходимо для бэкапа домашней директории)?

  • Денис Бузин

    Отвечу сам на свой вопрос, необходимо перечислить пользователей через запятую, пример: pkill -9 -u user1,user2

  • Денис Бузин

    Не сталкивались с такой проблемой: Примерно раз в неделю один из пользователей не может подключиться к удаленному рабочему столу (остальные при этом подключаются без проблем). Вот лог из syslog проблемного пользователя:

    Sep 7 08:24:30 x-terminal xrdp[5424]: (5424)(140366508189440)[DEBUG] xrdp_wm_log_msg: connecting to sesman ip 127.0.0.1 port 3350
    Sep 7 08:24:30 x-terminal xrdp-sesman[19393]: (19393)(140159088006912)[INFO ] A connection received from 127.0.0.1 port 44598
    Sep 7 08:24:31 x-terminal xrdp[5424]: (5424)(140366508189440)[INFO ] xrdp_wm_log_msg: sesman connect ok
    Sep 7 08:24:31 x-terminal xrdp[5424]: (5424)(140366508189440)[DEBUG] xrdp_wm_log_msg: sending login info to session manager, please wait…
    Sep 7 08:24:31 x-terminal xrdp[5424]: (5424)(140366508189440)[DEBUG] return value from xrdp_mm_connect 0
    Sep 7 08:24:31 x-terminal xrdp-sesman[19393]: (19393)(140159088006912)[INFO ] ++ created session (access granted): username spu, ip 192.168.0.
    27:37756 — socket: 12
    Sep 7 08:24:31 x-terminal xrdp-sesman[19393]: (19393)(140159088006912)[INFO ] starting Xorg session…
    Sep 7 08:24:31 x-terminal xrdp-sesman[19393]: (19393)(140159088006912)[DEBUG] Closed socket 9 (AF_INET 0.0.0.0:5911)

    Вот лог из xrdplog проблемного пользователя:

    [20170907-08:30:21] [DEBUG] xrdp_wm_log_msg: connecting to sesman ip 127.0.0.1 port 3350
    [20170907-08:30:22] [INFO ] xrdp_wm_log_msg: sesman connect ok
    [20170907-08:30:22] [DEBUG] xrdp_wm_log_msg: sending login info to session manager, please wait…
    [20170907-08:30:22] [DEBUG] return value from xrdp_mm_connect 0
    [20170907-08:30:25] [INFO ] xrdp_wm_log_msg: login failed for display 0
    [20170907-08:30:25] [DEBUG] xrdp_mm_module_cleanup

    Единственное рабочее решение данной проблемы это перезагрузка сервера.

  • Денис Бузин

    Нашел подобную ситуацию:
    https://github.com/neutrinolabs/xrdp/issues/830

    И решение для нее:
    https://gist.github.com/metalefty/2672c26ae0cb36f7a4bc100650c83a15

    Ждем повторения данной проблемы, чтобы проверить данное решение на практике.

  • http://vk.com/id63130413 Алексей Долотов

    🙂 Спасибо что написали.

  • http://vk.com/id63130413 Алексей Долотов

    Пользователь один и тот же не может войти? Комп с которого входит один и тот же?

  • Денис Бузин

    Нашел решение проблемы на github.com По умолчанию в настройках sesman.ini стоит параметр MaxSession=50 это значит, что кол-во доступных сокетов для подключения равняется 50-ти, а теперь мякотка: при отключении пользователя количество свободных сокетов не увеличивается и со временем (у меня раз в неделю) кол-во подключений достигает 50. Данный скрипт (настроил запуск каждый день в cron) производит отчистку сокетов от пользователей «зомби»:

    #!/bin/sh

    SOCKDIR=/tmp/.xrdp
    SESSIONS=$((cd ${SOCKDIR} ; ls -1 xrdp_*) | sed -e ‘s|[^0-9]||g’ | sort -u)
    for i in ${SESSIONS}
    do
    if [ ! -S ${SOCKDIR}/xrdp_display_${i} ]
    then
    (
    cd ${SOCKDIR}
    rm -f xrdp_chansrv_audio_in_socket_${i}
    xrdp_chansrv_audio_out_socket_${i}
    xrdp_chansrv_socket_${i}
    xrdpapi_${i}
    )
    fi
    done

    В будущих билдах xrdp разработчик обещает исправить данную проблему.

  • http://vk.com/id63130413 Алексей Долотов

    Спасибо что отписал решение. С вашего позволения подправлю статью описав этот нюанс. Кстати а параметр такой стоит: KillDisconnected=true ?

  • Денис Бузин

    false

  • http://vk.com/id63130413 Алексей Долотов

    Попробуйте поставить true и проверить. У меня стоит ограничение в 3 сессии и не перезагружаю по месяцу. Проблем с авторизацией не возникало.

  • Денис Бузин

    Пока посмотрю как отрабатывает скрипт, если будут проблемы обязательно попробую ваш способ. Странно, что о нем разработчик xrdp не знает. А систему обновляете? После каждого обновления системы приходится компилировать и настраивать xrdp заново, жуть не удобно.

  • http://vk.com/id63130413 Алексей Долотов

    Обновляю. Ставлю с тестового репозитория jessie-backports и проблем с компилированием не знаю 🙂

  • Денис Бузин

    Но при этом у вас не самая последняя версия xrdp?

  • http://vk.com/id63130413 Алексей Долотов

    xrdp -v
    Version 0.9.1

  • Денис Бузин

    Скрипт переделал, так как он отрабатывал с ошибкой: Syntax error: Missing ‘))’
    Вот рабочий скрипт:

    #!/bin/bash

    SOCKDIR=/tmp/.xrdp
    SESSIONS=`ls -l «${SOCKDIR}»/xrdp_* | sed -e ‘s|[^0-9]||g’ | sort -u`
    for i in ${SESSIONS}
    do
    if [ ! -S ${SOCKDIR}/xrdp_display_${i} ]
    then
    cd ${SOCKDIR}
    rm -f xrdp_chansrv_audio_in_socket_${i}
    xrdp_chansrv_audio_out_socket_${i}
    xrdp_chansrv_socket_${i}
    xrdpapi_${i}
    fi
    done

  • http://vk.com/id63130413 Алексей Долотов

    Без скрипта с параметром KillDisconnected=true не пробовали?

  • Денис Бузин

    Не возникает ли у вас проблем, если отключиться от терминального сервера и подключиться вновь, то соединение не проходит? Спустя некоторое время проходит само либо с помощью pkill.

  • http://vk.com/id63130413 Алексей Долотов

    Тут /etc/xrdp/sesman.ini стоят параметры
    # Выставляем количество пользователей для одновременной работе на сервере
    MaxSessions=3
    # Не разрываем сеанс при отключении пользователя чтобы потом попасть в туже сессию
    KillDisconnected=true
    При них и закрываю сеанс и не закрываю… проблем с подключение нет

  • Денис Бузин

    Все аналогично, только сессий 50.

  • http://vk.com/id63130413 Алексей Долотов

    Может ставили как то по другому? Попробовал я обновить до Debian 9 обновление нормально проходит но вот xrdp не хочет работать…. И на чистую пробовал Debian 9 ставить и пакет вроде такой же но не работает и всё тут…

  • Денис Бузин

    Компилировал актуальную версию с github, сейчас запустил на виртуалке точно такую же систему, все работает ок, похоже надо перезапустить xrdp.