Установка FreeRDP в Ubuntu/Debian
FreeRDP - это бесплатный клиент удаленного рабочего стола по протоколу RDP, выпущенный под лицензией Apache. В данной заметке рассмотрим варианты установки и настройки для работы с Winsows Server.
1. Установка из репозитория Ubuntu/FreeRDP
В самом простом случае установка из стандартного репозитория Ubuntu выглядит так:
apt install freerdp2-x11
Будет установлена версия 2.2.0 (n/a). Так же можно установить FreeRDP последней версии подключив репозиторий freerdp-nightly следующим образом:
sh -c 'echo "deb http://pub.freerdp.com/repositories/deb/$(lsb_release -cs)/ freerdp-nightly main" >> /etc/apt/sources.list' wget -O - http://pub.freerdp.com/repositories/ADD6BF6D97CE5D8D.asc | sudo apt-key add -
И выполнить установку:
apt update apt install --yes freerdp-nightly
Будет установлена последняя актуальная на момент выхода статьи версия: 3.0.0-dev.
Запускать отсюда: /opt/freerdp-nightly/bin/./xfreerdp
Что бы каждый раз не набирать полный путь к исполняемому файлу создадим smlink:
ln -s /opt/freerdp-nightly/bin/xfreerdp /usr/bin/xfreerdp
2. Установка из исходников
Установка из исходников позволяет гибко добавлять или отключать определенные функции/фичи. Установим базовые компоненты/зависимости необходимые для успешной компиляции:
apt install cmake gcc g++ git ninja-build build-essential debhelper cdbs dpkg-dev autotools-dev pkg-config xmlto libssl-dev docbook-xsl xsltproc libxkbfile-dev libx11-dev libwayland-dev libxrandr-dev libxi-dev libxrender-dev libxext-dev libxinerama-dev libxfixes-dev libxcursor-dev libxv-dev libxdamage-dev libxtst-dev libcups2-dev libpcsclite-dev libasound2-dev libpulse-dev libjpeg-dev libgsm1-dev libusb-1.0-0-dev libudev-dev libdbus-glib-1-dev uuid-dev libxml2-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libfaad-dev libfaac-dev ffmpeg libxkbcommon-dev zlib1g-dev libavcall1 libavcodec-dev libsystemd-dev
Создадим директорию где-нибудь в корне. Склонируем репозиторий с исходниками FreeRDP к себе в каталог:
mkdir distr git clone https://github.com/FreeRDP/FreeRDP.git cd FreeRDP
Cгенерируем файлы управления сборкой с указанием необходимых фич при помощи утилиты cmake:
cmake -GNinja -DCHANNEL_URBDRC=ON -DWITH_DSP_FFMPEG=ON -DWITH_CUPS=ON -DWITH_PULSE=ON -DWITH_FAAC=ON -DWITH_FAAD2=ON -DWITH_GSM=ON .
В случае каких либо ошибок или нехватки компонентов, необходимо их установить, затем удалить фаил кэша: CMakeCache.txt и запустить cmake повторно. После чего запустить сборку:
cmake --build .
И затем установку:
cmake --build . --target install
На выходе получим xfreerdp последней версии, исполняемый файл которого будет находится в /usr/local/bin. Создадим smlink для запуска одной командой:
ln -s /usr/local/bin/xfreerdp xfreerdp
Для удаления FreeRDP используем следующую команду:
xargs rm -rf < install_manifest.txt
где, install_manifest.txt - содержит информацию о всех файлах FreeRDP установленных в систему. Будет создан сразу после установки.
3. Запуск и варианты использования
В самом простом случае для подключения к windows-серверу (Win7/2008R2 и выше) используем следующую команду:
xfreerdp /u:user /d:domain /v:server /p:PassWd /f /kbd-type:en-us /bpp:32 /network:auto /sec:tls /cert-ignore
где,
/u: имя пользователя зарегистрированного на сервере терминалов с правами на удалённый доступ
/d: имя домена или имя сервера терминалов
/v: имя сервера терминалов или его IP адрес
/p: пароль пользователя зарегистрированного на сервере терминалов (Если не указывать, пароль запрашиваться)
/f: полноэкранный режим удаленного рабочего стола. Комбинация <Ctrl>+<Alt>+<Enter>позволяет приключаться между оконным и полноэкранным режимами.
/kbd-type: раскладка клавиатуры. Вывести список всех раскладок можно при помощи опции /kbd-list
/bpp: глубина цвета (32, 16, 8)
/network: тип сетевого подключения (modem, broadband [-low|-high], wan, lan, auto)
/sec: принудительно использовать протокол безопасности (rdp | tls | nla | ext)
/cert-ignore: игнорировать сертификат сервера терминалов
Для подключения к серверу через шлюз удаленных рабочих столов используем дополнительные ключи:
xfreerdp /u:user /d:domain /v:server /p:PassWd /f /g:gate:mydomain.ru:23400 /gu:GateUser /gd:GateDomainUser /gp:GateUserPassword /kbd-type:en-us /bpp:32 /network:auto /sec:tls /cert-ignore
/g: указать шлюз удаленных рабочих столов + порт (по умолчанию если не настроен то 443, тогда можно не указывать), например: gate.mydomain.ru:23400.
/gu: указать пользователя имеющего права авторизоваться через шлюз удаленных рабочих столов.
/gd: указать домен/имя компьютера для авторизации пользователя через шлюз удаленных рабочих столов.
/gp: указать пароль пользователя для авторизации через шлюз удаленных рабочих столов.
Ознакомится с полным перечнем всевозможных ключей можно на сайте проекта FreeRDP или в руководстве пользователя доступном по команде: xfreerdp /help
Проверяем/тестируем на Windows Server 2012R2 и через какое то время в процессе работы видим самопроизвольные вылетания/разрывы сессии.
Включаем логирование добавив опцию /log:level, и следующую запись перед командной xfreerdp /u...
WLOG_APPENDER=file WLOG_FILEAPPENDER_OUTPUT_FILE_NAME=freerdp.log WLOG_FILEAPPENDER_OUTPUT_FILE_PATH=/tmp
Итого, команда примет следующий вид:
WLOG_APPENDER=file WLOG_FILEAPPENDER_OUTPUT_FILE_NAME=freerdp.log WLOG_FILEAPPENDER_OUTPUT_FILE_PATH=/tmp xfreerdp /u:user /d:domain /v:server /f /kbd-type:en-us /bpp:32 /network:broadband /sec:tls /cert-ignore /log:level:error
где, /log-level может принимать следующие значения: FATAL, ERROR, WARN, INFO, DEBUG, TRACE.
Для того что бы запускать данную конструкцию при помощи ярлыка/кнопки запуска с рабочего стола пользователя, добавим код в отдельный .sh файл и разместим его например в корне диска в каталоге /freerdp.
mkdir freerdp cd freerdp nano rdp.sh chmod +x rdp.sh
После чего запускаем фаил и ждем когда наш лог-фаил появится в каталоге /tmp, где будет ошибка следующего содержания:
[08:12:55:200] [48815:48816] [ERROR][com.freerdp.core] - rdp_set_error_info:freerdp_set_last_error_ex ERRINFO_GRAPHICS_SUBSYSTEM_FAILED [0x0001112F] [08:12:55:201] [48815:48816] [ERROR][com.freerdp.core.transport] - BIO_read returned a system error 104: Соединение разорвано другой стороной
или такого:
[16:06:03:762] [11388:11389] [ERROR][com.freerdp.core.transport] - BIO_should_retry returned a system error 104: Соединение разорвано другой стороной [16:06:03:762] [11388:11389] [ERROR][com.freerdp.core] - transport_default_write:freerdp_set_last_error_ex ERRCONNECT_CONNECT_TRANSPORT_FAILED [0x0002000D] [16:06:03:763] [11388:11389] [ERROR][com.freerdp.core.transport] - transport_check_fds: transport->ReceiveCallback() - -1
Согласно рекомендациям разработчика надо изменить "тип сетевого подключения" на auto и добавить поддержку кодеков RemoteFX (/rfx) и h264 AVC444 (/gfx:avc444)
WLOG_APPENDER=file WLOG_FILEAPPENDER_OUTPUT_FILE_NAME=freerdp.log WLOG_FILEAPPENDER_OUTPUT_FILE_PATH=/tmp xfreerdp /u: /d:pkm /v:Server /kbd-type:en-us /f /bpp:16 /rfx /network:auto /sec:tls /cert-ignore /log-level:error
К слову сказать, для устранения данной ошибки достаточно добавить ключ /network:auto. RemoteFX - будет работать только если данный протокол включен на сервере. AVC444 - работает начиная с Windows Server 2016 и RDP 10-й версии.
4. Известные проблемы и их решения
// license connection sequence aborted или дословно Последовательность подключения лицензии прервана. Вполне возможно что ошибка в истекшем сроке действия ранее полученной временной лицензии, наподобие того как это бывает в Windows. Подробнее.
[19:52:42:854] [1540:1541] [ERROR][com.freerdp.core.connection] - license connection sequence aborted
Достаточно грохнуть каталог freerdp находящийся в /home/user/.config/ и при следующем запуске проблема не возникнет.