Настройка фермы RDP в Windows Server 2022: установка и балансировка

Архитектура фермы Remote Desktop Services

Ферма RDP — это кластер терминальных серверов, которые работают как единое целое. Пользователь подключается по одному адресу, а дальше система сама решает, на какой сервер его отправить — туда, где нагрузка поменьше. В Windows Server 2022 архитектура RDS строится на нескольких специализированных ролях, и понимать их разграничение важно ещё до того, как вы откроете Server Manager.

Основные компоненты фермы:

  • RD Connection Broker — мозг всей конструкции: распределяет входящие подключения между серверами, следит за сессиями и, что особенно ценно, переподключает пользователя к его же сессии, если соединение оборвалось
  • RD Session Host — рабочие лошадки фермы, серверы, на которых пользователи реально работают
  • RD Web Access — веб-портал, через который можно запустить опубликованное приложение или рабочий стол прямо из браузера, без установки клиента
  • RD Gateway — точка входа снаружи: заворачивает RDP-трафик в HTTPS на порт 443, так что пробрасывать 3389 наружу не нужно
  • RD Licensing — следит за клиентскими лицензиями (CAL), без него ферма через 120 дней перестанет принимать подключения

На практике минимальная рабочая конфигурация — три сервера: один берёт на себя Connection Broker и Web Access, два оставшихся работают как Session Host. Когда нагрузка растёт и один Broker становится точкой отказа, его разворачивают в режиме High Availability — с базой на SQL Server и общим DNS-именем для фермы.

Требования к инфраструктуре

Прежде чем запускать мастер установки, пробегитесь по чеклисту. Половина проблем при развёртывании — именно из-за пропущенной подготовки:

  • Все серверы введены в домен Active Directory — без этого ферма просто не заработает
  • DNS-записи прописаны для всех узлов фермы, включая отдельную A-запись для имени фермы
  • На каждом сервере назначен статический IP — с DHCP в продуктивной среде лучше не экспериментировать
  • Минимум 8 ГБ RAM и 4 vCPU на каждый Session Host — это закрывает примерно 25–30 одновременных пользователей при офисной нагрузке
  • Учётная запись для развёртывания входит в группу Domain Admins и добавлена в локальные администраторы на всех узлах — иначе мастер молча падает на середине

Сетевая задержка между узлами не должна превышать 1 мс. Если серверы раскиданы по разным сегментам — объедините их в один VLAN. Мы видели фермы, где из-за лишних 3–4 мс задержки Broker терял сессии при переподключении.

Установка ролей RDS через Server Manager

Развёртывание запускается централизованно из Server Manager — с любого сервера домена. Открываете Server Manager, идёте в Manage → Add Roles and Features, тип установки выбираете Remote Desktop Services installation. Именно этот путь позволяет распределить роли по разным машинам сразу в ходе мастера.

Режим развёртывания — Standard deployment, не Quick Start. Quick Start удобен для лабораторий: сваливает все роли на один сервер за пять минут. Для фермы он не годится — роли потом не разнести без переустановки.

Дальше мастер последовательно спрашивает, какой сервер берёт каждую роль. Ошибиться несложно, поэтому заранее запишите, что куда идёт:

# Пример распределения ролей:
RD-BROKER.domain.local  → Connection Broker, Web Access
RD-HOST01.domain.local  → Session Host
RD-HOST02.domain.local  → Session Host

По завершении мастера серверы уйдут на перезагрузку автоматически. Вся процедура занимает 10–15 минут. Статус установки смотрите в Server Manager → Remote Desktop Services → Overview — там сразу видно, какие роли поднялись, а какие ещё нет.

Установка через PowerShell

Если серверов больше пяти или нужно воспроизводить установку многократно — удобнее развернуть ферму через модуль RemoteDesktop в PowerShell:

# Создание сессии развёртывания
New-RDSessionDeployment `
  -ConnectionBroker "RD-BROKER.domain.local" `
  -WebAccessServer "RD-BROKER.domain.local" `
  -SessionHost @("RD-HOST01.domain.local", "RD-HOST02.domain.local")

# Проверка статуса развёртывания
Get-RDServer -ConnectionBroker "RD-BROKER.domain.local"

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

Настройка коллекций сессий

Коллекция сессий — это логическая группа Session Host-серверов с одинаковыми настройками для конкретной категории пользователей. В одной ферме их может быть несколько. Классический пример из нашей практики: коллекция «Бухгалтерия» с 1С на выделенных хостах и коллекция «Менеджеры» с офисными приложениями — ресурсы не делятся, производительность у каждой группы своя.

# Создание коллекции
New-RDSessionCollection `
  -CollectionName "Accounting" `
  -SessionHost @("RD-HOST01.domain.local", "RD-HOST02.domain.local") `
  -ConnectionBroker "RD-BROKER.domain.local" `
  -CollectionDescription "Коллекция для бухгалтерии"

# Ограничение доступа группой AD
Set-RDSessionCollectionConfiguration `
  -CollectionName "Accounting" `
  -UserGroup "DOMAIN\RDP-Accounting" `
  -ConnectionBroker "RD-BROKER.domain.local"

Для каждой коллекции отдельно задаются таймауты сессий, политики перенаправления устройств (принтеры, диски, буфер обмена) и лимиты по ресурсам. Не копируйте одни настройки для всех — у бухгалтеров и менеджеров совершенно разные сценарии работы.

Параметры таймаутов и отключения

Таймауты — то, о чём многие забывают при первичной настройке, а потом удивляются, куда уходит RAM. Брошенные сессии висят часами и жрут память. Настройте их сразу:

Set-RDSessionCollectionConfiguration `
  -CollectionName "Accounting" `
  -IdleSessionLimitMin 60 `
  -DisconnectedSessionLimitMin 120 `
  -ActiveSessionLimitMin 0 `
  -AutomaticReconnectionEnabled $true `
  -BrokenConnectionAction Disconnect `
  -ConnectionBroker "RD-BROKER.domain.local"

IdleSessionLimitMin — неактивная сессия отключается через 60 минут. DisconnectedSessionLimitMin — отключённая сессия полностью завершается через 2 часа, память освобождается. ActiveSessionLimitMin со значением 0 означает, что активная рабочая сессия не ограничена по времени — и это правильно, обрывать работающего пользователя не нужно.

Балансировка нагрузки между серверами

Connection Broker умеет балансировать двумя способами: Round Robin и по весам (Relative Weight). Round Robin — честное чередование: каждое новое подключение идёт на следующий сервер по кругу. Звучит справедливо, но не учитывает, что один хост может быть вдвое мощнее другого.

Режим весов решает именно эту проблему — более мощный сервер получает пропорционально больше подключений. Настраивается через PowerShell:

# Назначение весов серверам
Set-RDSessionHost `
  -SessionHost "RD-HOST01.domain.local" `
  -NewConnectionAllowed Yes `
  -ConnectionBroker "RD-BROKER.domain.local"

# Через реестр задаём вес (значение 100-999, по умолчанию 100)
# На RD-HOST01 (мощный сервер, 64 ГБ RAM):
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server" `
  -Name "LBWeight" -Value 200

# На RD-HOST02 (стандартный сервер, 32 ГБ RAM):
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server" `
  -Name "LBWeight" -Value 100

После изменения весов перезапустите службу Remote Desktop Services на каждом хосте. Broker сразу начнёт направлять на RD-HOST01 вдвое больше новых подключений — пропорционально заданным коэффициентам.

Мониторинг распределения нагрузки

За нагрузкой удобно следить прямо из PowerShell — не нужно лезть в GUI каждый раз:

# Количество сессий на каждом хосте
Get-RDUserSession -ConnectionBroker "RD-BROKER.domain.local" |
  Group-Object HostServer |
  Select-Object Name, Count |
  Sort-Object Count -Descending

# Детальная информация о сессиях
Get-RDUserSession -ConnectionBroker "RD-BROKER.domain.local" |
  Select-Object UserName, HostServer, SessionState, CreateTime |
  Format-Table -AutoSize

Настройте оповещения на порог 80% по CPU и RAM на каждом хосте. Если хотя бы один сервер устойчиво держит такую нагрузку — пора добавлять новый Session Host в коллекцию. Лучше сделать это заранее, чем разбираться с жалобами пользователей на тормоза.

Настройка SSL-сертификатов

Без правильно настроенных сертификатов пользователи будут видеть предупреждения безопасности при каждом подключении — и рано или поздно кто-нибудь нажмёт «не подключаться». В ферме RDS сертификаты назначаются на четыре роли:

  • RD Connection Broker — Enable Single Sign On
  • RD Connection Broker — Publishing
  • RD Web Access
  • RD Gateway (при наличии)

Оптимальный вариант — один SAN-сертификат (Subject Alternative Name), в который включены имена всех серверов фермы и общее DNS-имя фермы. Один сертификат вместо четырёх отдельных — проще следить за сроком и обновлять:

# Создание запроса на сертификат
$params = @{
  Subject = "CN=rdp.domain.com"
  DnsName = "rdp.domain.com", "RD-BROKER.domain.local", "RD-HOST01.domain.local", "RD-HOST02.domain.local"
  CertStoreLocation = "Cert:\LocalMachine\My"
  KeyLength = 2048
  KeyExportPolicy = "Exportable"
  NotAfter = (Get-Date).AddYears(3)
}
$cert = New-SelfSignedCertificate @params

# Экспорт в PFX для установки на других серверах
$password = ConvertTo-SecureString -String "P@ssw0rd!" -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath "C:\Certs\rdp-farm.pfx" -Password $password

В продуктивной среде самоподписанный сертификат — не вариант. Используйте сертификат от внутреннего CA (Active Directory Certificate Services) или любого публичного центра сертификации.

Применение сертификата к ролям

Установить сертификат можно через Server Manager → Remote Desktop Services → Overview → Tasks → Edit Deployment Properties → Certificates. Либо через PowerShell — особенно удобно, если серверов несколько:

# Применение сертификата ко всем ролям
$roles = @("RDRedirector", "RDPublishing", "RDWebAccess", "RDGateway")
foreach ($role in $roles) {
  Set-RDCertificate `
    -Role $role `
    -ImportPath "C:\Certs\rdp-farm.pfx" `
    -Password (ConvertTo-SecureString "P@ssw0rd!" -Force -AsPlainText) `
    -ConnectionBroker "RD-BROKER.domain.local" `
    -Force
}

Лицензирование RDS

Без лицензий Remote Desktop Services проработает ровно 120 дней в grace-period — а потом жёстко обрежет подключения. Для фермы нужны лицензии RDS CAL (Client Access License), и тут придётся выбирать: Per User или Per Device.

Per User — лицензия привязана к учётной записи AD. Пользователь подключается хоть с пяти устройств сразу — всё по одной лицензии. На практике это оптимальный выбор для сотрудников, которые работают и с офисного ПК, и с ноутбука, и с планшета.

Per Device — лицензия уходит устройству, а не человеку. Классика для посменной работы: один терминал, за которым за день сидят три-четыре сотрудника.

# Установка роли лицензирования
Add-RDServer `
  -Server "RD-BROKER.domain.local" `
  -Role "RDS-LICENSING" `
  -ConnectionBroker "RD-BROKER.domain.local"

# Указание сервера лицензий для развёртывания
Set-RDLicenseConfiguration `
  -LicenseServer "RD-BROKER.domain.local" `
  -Mode PerUser `
  -ConnectionBroker "RD-BROKER.domain.local" `
  -Force

Активируйте сервер лицензий через Remote Desktop Licensing Manager (licmgr.exe) и установите пакеты CAL, полученные через Volume Licensing. Не затягивайте — grace-period кончается быстрее, чем кажется.

Оптимизация производительности фермы

Когда пользователей становится много, сервера Session Host начинают жаловаться на жизнь. Вот что реально влияет на производительность и что мы настраиваем в первую очередь:

# Групповая политика: Computer Configuration → Admin Templates → 
# Windows Components → Remote Desktop Services → 
# Remote Desktop Session Host → Remote Session Environment

# Ограничение глубины цвета для снижения нагрузки на сеть
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" `
  -Name "ColorDepth" -Value 3  # 16 бит

# Отключение визуальных эффектов
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" `
  -Name "fDisableWallpaper" -Value 1
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" `
  -Name "fDisableCam" -Value 1

# Ограничение перенаправления принтеров (частая причина зависаний)
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" `
  -Name "fDisableCpm" -Value 1

Отключайте индексацию Windows Search, службу Superfetch и все анимации на серверах Session Host — это не косметика, это ощутимые миллисекунды на каждую операцию. И ещё один момент: замените роуминг-профили на UPD (User Profile Disks). Вход ускоряется заметно — мы видели разницу в 30-40 секунд на нагруженных серверах.

User Profile Disks

UPD хранят профили пользователей в VHDX-файлах на общем ресурсе. При входе диск подключается автоматически, пользователь этого вообще не замечает:

# Включение UPD для коллекции
Set-RDSessionCollectionConfiguration `
  -CollectionName "Accounting" `
  -EnableUserProfileDisk `
  -MaxUserProfileDiskSizeGB 10 `
  -DiskPath "\\FileServer\RDS-UPD$" `
  -ConnectionBroker "RD-BROKER.domain.local"

# Проверка NTFS-разрешений на папке
# Группа "RD-HOST01$" и "RD-HOST02$" должны иметь Full Control

Главный плюс UPD — пользователь всегда получает свой профиль, на какой бы сервер его ни закинул Connection Broker при балансировке. Никаких «а где мои настройки» после перезагрузки.

Troubleshooting типичных проблем

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

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

# Проверка, видит ли Broker сессию
Get-RDUserSession -ConnectionBroker "RD-BROKER.domain.local" |
  Where-Object { $_.UserName -eq "ivanov" }

# Если сессия «зависла» — принудительное завершение
Invoke-RDUserLogoff -HostServer "RD-HOST01.domain.local" `
  -UnifiedSessionID 3 -Force

Ошибка «No Remote Desktop License Servers available»:

  • Проверьте, активирован ли сервер лицензий: Get-WmiObject Win32_TSLicenseServer
  • Убедитесь, что порт 135 (RPC) открыт между хостами и сервером лицензий — файрвол здесь блокирует чаще, чем хочется думать
  • Проверьте принадлежность компьютеров к группе Terminal Server License Servers в AD

Медленный вход: в 80% случаев виноваты тяжёлые GPO, перенаправление принтеров или антивирус, который сканирует профиль при каждом логине. Смотрите сюда: eventvwr.msc → Applications and Services Logs → Microsoft → Windows → TerminalServices-LocalSessionManager — там всё написано с таймингами.

Часто задаваемые вопросы

Зависит от нагрузки. Для офисной работы — Word, Excel, 1С тонкий клиент — реально выходит 25-30 пользователей на сервер с 32 ГБ RAM и 8 vCPU. Если в ход идут CAD или тяжёлая графика — уже 8-12, и то смотреть надо. Нагрузочное тестирование перед запуском в продуктив — обязательно, без вариантов.

Да, и это одно из главных удобств фермы. Новый сервер добавляется в коллекцию прямо на лету: Add-RDSessionHost -SessionHost "RD-HOST03.domain.local" -CollectionName "Accounting" -ConnectionBroker "RD-BROKER.domain.local". Существующие сессии не трогаются, новые подключения сразу начинают уходить на добавленный сервер.

В ферме RDS несколько пользователей работают на одном сервере и делят его ресурсы между собой. В VDI каждый получает отдельную виртуальную машину. RDS дешевле в лицензировании и проще в обслуживании — для большинства компаний до 50 рабочих мест это оптимальный выбор. VDI имеет смысл, когда нужна полная изоляция или когда сотрудники ставят несовместимое между собой ПО.

Connection Broker в режиме High Availability требует полноценный SQL Server — Express не подойдёт. Плюс общее DNS-имя для клиентов. Настройка выглядит так: Set-RDConnectionBrokerHighAvailability -ConnectionBroker "RD-BROKER01.domain.local" -DatabaseConnectionString "DRIVER=SQL Server Native Client 11.0;SERVER=SQL01;..." -ClientAccessName "rdp.domain.com". Второй брокер добавляется через Add-RDServer.

Нужна помощь с настройкой?

Если не хочется разбираться со всем этим самостоятельно — специалисты АйТи Фреш возьмут на себя внедрение и настройку фермы RDS. 15+ лет в теме, обслуживание от 15 000 ₽/мес.

📞 Связаться с нами
#ферма RDP#Windows Server 2022#Remote Desktop Services#Connection Broker#балансировка RDP#RDS ферма#терминальный сервер#лицензирование RDS
Комментарии 0

Оставить комментарий

загрузка...