Терминальный сервер XRDP на Ubuntu | |||||
|
Подготавливаем систему. sudo apt-get update && sudo apt-get upgrade -y && reboot Настраиваем сеть. Удаляем gui интерфейс для управления сетью, иначе он пытается управлять настройками сети. sudo apt-get remove network-manager -y Правим /etc/network/interfaces: # The primary network interface auto eth0 iface eth0 inet static address 192.168.100.8 netmask 255.255.255.0 gateway 192.168.100.155 Теперь настройка днс, если в /etc/resolv.conf видим: # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN То настройки днс хранятся в /etc/resolvconf/resolv.conf.d/base: nameserver 192.168.100.1 nameserver 8.8.8.8 search test.lan Перезапускам сетевой интерфейс и проверяем настройки сети: /etc/init.d/networking restart ifconfig eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:126785 errors:0 dropped:0 overruns:0 frame:0 TX packets:135453 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:116474217 (116.4 MB) TX bytes:102473947 (102.4 MB) lo Link encap:Локальная петля (Loopback) inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:104371 errors:0 dropped:0 overruns:0 frame:0 TX packets:104371 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:720253620 (720.2 MB) TX bytes:720253620 (720.2 MB) Устанавливаем необходимые пакеты и обновляем систему: sudo apt-get update sudo apt-get install mc openssh-server chkconfig subversion libtool automake automake1.7 automake1.9 git libssl-dev libpam0g-dev libx11-dev libxfixes-dev xxkb libpam-mount clamtk smbfs python-software-properties pulseaudio-esound-compat paprefs -y Настраиваем PAM. Настраиваем монтирование сетевых ресурсов, выполнение пользовательских скриптов (от root) и настройки skel для пользователей при входе в систему. Создаем файл скрипта и делаем его исполняемым (в дальнейшем можете использовать этот скрипт по своему усмотрению): touch /etc/logon chmod +x /etc/logon Добавляем в /etc/pam.d/common-session: session required pam_mkhomedir.so umask=0022 skel=/etc/skel session optional pam_exec.so /etc/logon session optional pam_mount.so Сетевые профили мы будем монтировать в /net/%username%, для каждого пользователя отдельно. Очень не рекомендую монтировать сетевые диски в домашнюю папку пользователя (не дай бог пользователь удалит монтированную папку). Будем использовать симлинки. Создаем папку для монтирования сетевых ресурсов /net: mkdir /net Общие папки и профили у меня лежат на сервере 192.168.1.1: \\192.168.1.1\home\%username% — профиль монтируем в /home/%username% \\192.168.1.1\public — общую папку монтируем в /net/%username%/public Настраиваем папки для сетевого монтирования, добавляем параметры подключения в /etc/security/pam_mount.conf.xml после debug enable: Я пока не нашел как заставить выполнять pam-mount при входе по ssh(да и не искал). Вот мануал по файлу конфигов pam_mount.conf.xml. Донастраиваем Xsession. Добавляем в /etc/X11/Xsession после set -e: ## Для корретного определения локали if [ -r /etc/default/locale ]; then . /etc/default/locale export LANG LANGUAGE fi ## Для корретной работы переключения раскладок клавиатуры по alt + shift может понадобиться эта строка. Если испытываете трудности раскомментируйте её удлив символ # #setxkbmap -layout "us,ru(winkeys)" -model "pc105" -option "grp:alt_shift_toggle" ## автоматической создание симлинков на сетевые ресурсы при каждом входе ln -f -s /net/$USER/public /home/$USER/Сетевые\ ресурсы Настраиваем скелеты для пользователей. Под любым пользователем настраиваете рабочий стол, панели, ярлыки и т.п, все что нужно пользователям по умолчанию. Не забудьте добавить на панель индикатор переключения раскладки. Отключаем скринсейвер, так как он вешает машину наглухо. Далее копируете из домашней папки настроенного пользователя настройки в /etc/skel. Обратите внимание на особенность при использовании skel не выполняется скрипт генерации первичной структуры домашней папки, так как при первом входе домашняя папка полностью копируется из /etc/skel. Выполняем с правами рута: cd /home/Настроенный_Пользователь cp -R -f -b .config/ /etc/skel/ # настройки графической оболочки cp -R -f -b Рабочий\ стол/ /etc/skel/ # Содержимое рабочего стола cp -R -f -b Документы/ /etc/skel/ # Содержимое документов Cобираем x11rdp. Устанавливаем библиотеки разработчиков xorg, качаем и собираем исходники x11rdp: sudo apt-get build-dep xserver-xorg-core cd ~ wget https://server1.xrdp.org/xrdp/x11rdp_xorg71.tar.gz # Исходники могут переехать по другому адресу, если что гугл поможет tar -xvf x11rdp_xorg71.tar.gz sudo mkdir /opt/X11rdp # важно: /opt/X11rdp владелец должен быть root! cd x11rdp_xorg71 time sudo sh buildx.sh /opt/X11rdp Смело идем за стаканом с (чаем/кофе/пивом) на моей виртуальной машине сборка занимает около 16 минут: all ok real 15m57.336s user 8m22.199s sys 1m20.693s Проверяем установленые библиотеки: cd /opt/X11rdp/bin ls -lh ln -s /opt/X11rdp/bin/X11rdp /usr/bin/X11rdp # делаем симлинк в /usr/bin Cобираем свежую сборку xrdp. Мы будем использовать свежую сборку xrdp. Что бы создать скрипты для запуска и установить зависимые пакеты ставим и удаляем xrdp из репозитария Ubuntu: sudo apt-get install xrdp -y ; apt-get remove xrdp -y Клонируем под нормальным пользователем текущую версию xrdp: cd ~ git clone https://github.com/FreeRDP/xrdp.git xrdp.git Собираем из исходников xrdp. Обратите внимание на checkout, это необходимо для корректной работы xrdp: cd xrdp.git git checkout 4cd0c118c273730043cc77b749537dedc7051571 ./bootstrap ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var make Устанавливаем с правами root: sudo make install Копируем и изменяем RSA ключи, это необходимо для RDP сессий: sudo su - mkdir /usr/share/doc/xrdp mv /etc/xrdp/rsakeys.ini /usr/share/doc/xrdp/ chmod 600 /usr/share/doc/xrdp/rsakeys.ini chown xrdp:xrdp /usr/share/doc/xrdp/rsakeys.ini Настройка xrdp. Делаем резервную копию и создаем симлинк на Xsession: cd /etc/xrdp mv startwm.sh startwm.sh.BACKUP ln -s /etc/X11/Xsession /etc/xrdp/startwm.sh Приводим настройки /etc/xrdp/xrdp.ini к такому в виду: [globals] bitmap_cache=yes bitmap_compression=yes port=3389 crypt_level=low channel_code=1 max_bpp=16 #black=000000 grey=d6d3ce #dark_grey=808080 #blue=08246b #dark_blue=08246b #white=ffffff #red=ff0000 #green=00ff00 #background=626c72 [xrdp1] name=RDP lib=libxup.so username=ask password=ask ip=127.0.0.1 port=-1 xserverbpp=16 [xrdp2] name=VNC lib=libvnc.so username=ask password=ask ip=127.0.0.1 port=-1 Исходный выглядит так: [globals] bitmap_cache=yes bitmap_compression=yes port=3389 crypt_level=low channel_code=1 max_bpp=24 #black=000000 #grey=d6d3ce #dark_grey=808080 #blue=08246b #dark_blue=08246b #white=ffffff #red=ff0000 #green=00ff00 #background=626c72 [xrdp1] name=sesman-X11vnc lib=libvnc.so username=ask password=ask ip=127.0.0.1 port=-1 [xrdp2] name=console lib=libvnc.so ip=127.0.0.1 port=5900 username=na password=ask [xrdp3] name=vnc-any lib=libvnc.so ip=ask port=ask5900 username=na password=ask [xrdp4] name=sesman-any lib=libvnc.so ip=ask port=-1 username=ask password=ask [xrdp5] name=rdp-any lib=librdp.so ip=ask port=ask3389 [xrdp6] name=freerdp-any lib=libxrdpfreerdp.so ip=ask port=ask3389 [xrdp7] name=sesman-X11rdp lib=libxup.so username=ask password=ask ip=127.0.0.1 port=-1 xserverbpp=24 Количество разрешённых подключений можно установить в /etc/xrdp/sesman.ini. По умолчанию разрешено 10 пользователей, за это отвечает опция MaxSessions в секции Sessions. В этом же файле рекомендуется не изменять значения KillDisconnected (По умолчанию KillDisconnected=0),IdleTimeLimit, DisconnectedTimeLimit. Я изменил опцию KillDisconnected и у меня юзеры смогли коннектится в ту же сессию, но за правильность суждений не ручаюсь. [Globals] ListenAddress=127.0.0.1 ListenPort=3350 EnableUserWindowManager=1 UserWindowManager=startwm.sh DefaultWindowManager=startwm.sh [Security] AllowRootLogin=0 # Разрешать входить руту по умолчанию стоит 1, то есть разрешать. Я изменил на 0 ради безопасности. MaxLoginRetry=4 # Максимальное количество попыток входа TerminalServerUsers=tsusers # Как я понял группа пользователей терминального сервера TerminalServerAdmins=tsadmins # Группа администраторов терминального сервера. Если вы не входите в эту группу то # выключение питания или перезагрузка сервера из терминального подключения не доступна. [Sessions] X11DisplayOffset=10 # Порядковый номер дисплея, который проверяется сначала на свободность, а после на нём запускается X сервер. # Если на сервере больше 10 физически подключенных дисплеев или локальных сессий то значение лучше увеличить. Если меньше оставьте # значение по умолчанию, чтобы не натыкаться на локально подключеные сессии. # C каждым новым терминальным подключением это значение увеличивается на 1 единицу. После отключения сессии дисплей на который она # подключалась освобождается и следующая терминальная сессия открывается на освобожденном дисплее. MaxSessions=10 # Максимальное количество терминальных сессий. KillDisconnected=1 # В теории по мануалам это остановка сессий которые отключились. На моей практике получилось, # что я смог подключаться в отключенную сессию. Если оставить 0 по умолчанию, у меня сессии не терминировались, а висели в процессах # как у всех кто писал мануалы по xrdp. IdleTimeLimit=0 DisconnectedTimeLimit=0 [Logging] LogFile=/var/log/xrdp-sesman.log LogLevel=DEBUG EnableSyslog=0 SyslogLevel=DEBUG [X11rdp] param1=-bs param2=-ac param3=-nolisten param4=tcp [Xvnc] param1=-bs param2=-ac param3=-nolisten param4=tcp param5=-localhost param6=-dpi param7=96 Немного изменяем скрипт управления /etc/init.d/xrdp, добавляем параметры: PIDDIR=/var/run SESMAN_START=yes Настраиваем авторизацию xrdp, приводим файл /etc/pam.d/xrdp-sesman к виду: #%PAM-1.0 @include sesman Запускаем xrdp сервер и проверяем: service xrdp start * Starting Remote Desktop Protocol server ok process 3147 started starting sesman... sesman config: ListenAddress: 127.0.0.1 ListenPort: 3350 EnableUserWindowManager: 1 UserWindowManager: startwm.sh DefaultWindowManager: startwm.sh AuthFilePath: disabled Xvnc parameters: Parameter 00 -bs Parameter 01 -ac Parameter 02 -nolisten Parameter 03 tcp Parameter 04 -localhost Parameter 05 -dpi Parameter 06 96 X11rdp parameters: Parameter 00 -bs Parameter 01 -ac Parameter 02 -nolisten Parameter 03 tcp logging configuration: LogFile: /var/log/xrdp-sesman.log LogLevel: 4 EnableSyslog: 0 SyslogLevel: 4 security configuration: AllowRootLogin: 0 MaxLoginRetry: 4 No TSUsersGroup defined No TSAdminsGroup defined session configuration: MaxSessions: 10 X11DisplayOffset: 10 KillDisconnected: 1 IdleTimeLimit: 0 DisconnectedTimeLimit: 0 [20121201-21:09:12] [WARN ] [init:45] libscp initialized [ OK ] Если отобразились настройки xrdp-sesman, значит все встало как надо. В версии из репозитария настройки не отображаются. Теперь можно проверить подключение к серверу по RDP протоколу любым доступным клиентом. Альтернативное решение проблемы с переключением раскладки: Шрифты - этот бинарник X11rdp ищет шрифты в /opt/X11rdp/lib/X11/fonts Создал каталоги /opt/X11rdp/lib/X11, сделал симлинк fonts на папку со шрифтами уже стоящего X-сервера (у меня лежали в /usr/share/X11/fonts) После этого X11rdp может запускаться, то есть уже можно виндовым клиентом терминалов заходить в sesman-X11rdp. Однако setxkbmap не работает, видимо этот бинарник X11rdp ищет папку xkb где-то в другом месте. Поэтому, создал в /usr/local/xrdp файл rus.map следующего содержания: xkb_keymap { xkb_keycodes { include "xfree86+aliases(qwerty)" }; xkb_types { include "complete" }; xkb_compat { include "complete" }; xkb_symbols { include "pc+ru(winkeys)+us:2+group(alt_shift_toggle)" }; xkb_geometry { include "pc(pc104)" }; }; Далее прописал в начале /usr/local/xrdp/startwm.sh : xkbcomp /usr/local/xrdp/rus.map $DISPLAY Все. Теперь при входе язык русский, Alt+Shift переключает на английский. В случае проблем со шрифтами: На одном форуме есть рекомендация указать в файле ~/x11rdp_xorg71/buildx.sh параметр “--with-fontdir=” после “./configure” команды перекомпиляции (строка 815). В системе шрифты лежат тут “/usr/share/fonts” , если у вас не так измените путь: # xorg-server if ! test -f $PCFILEDIR/xorg-server.pc then cd xorg-server-X11R7.1-1.1.0 ./configure --prefix=$PREFIXDIR --with-fontdir=/usr/share/fonts --enable-xglx --with-mesa-source=$SRCDIR/Mesa-6.5 --disable-dmx if ! test $? -eq 0 then Если испытываете проблемы c графической оболочкой Gnome или Unity попробуйте выполнить: echo "gnome-session --session=ubuntu-2d" > ~/.xsession Это по умолчанию для вашего пользователя будет запускать упрощённую сессию юнити 2D. Или установите gnome session fallback. sudo apt-get install gnome-session-fallback После 7 дней мучений делюсь знаниями со всеми. Я постарался учесть все проблемы с которыми столкнулся я или другие пользователи в сети интернет. |