Зависание RDP сессий при использовании протокола UDP
Хочу поделиться решением проблемы зависания RDP сессии при подключении к удаленному рабочему столу через VPN. Полагаю, кому-то эта заметка существенно сократит время поиска проблемы, да и самому чтобы не забыть.
Опишу кратко, что происходит. Попытка подключения к удаленному рабочему столу в Windows 10 завершается ошибкой:
При попытке клиента подключиться, произошла ошибка лицензирования (лицензирование прервано по таймауту). Попытайтесь подключиться к удаленному компьютеру снова.
Ключевой момент тут, что попытка соединения была прервана по таймауту. В macOS ситуация выглядит несколько иначе и здесь всё останавливается на фразе «Detecting network quality».
Следует заметить, что такое поведение наблюдалось только при подключении клиента через VPN (конкретно в моем случае OpenVPN).
Покопавшись в сети, удалось выяснить, что действительно существует проблема с "замиранием" или невозможностью подключиться по RDP и связана она с использованием протокола UDP.
Современные версии Windows 10/11 и Windows Server (начиная с 2016 и выше) в RDP сессии используют не только стандартный порт TCP/3389, но и UDP порт 3389. В TCP сессии передаются клавиатура и мышь, а UDP сессия отвечает за вывод картинки. По утверждениям Microsoft использование UDP существенно повышает отзывчивость удаленного рабочего стола и возможность работать на нестабильных подключениях с высокими задержками.
Впрочем, не всё так однозначно и в ряде случаяв использование протокола UDP приводит к "зависанию" RDP сессий, что может выражаться в периодическом замирании картинки, обрыву сессии или отображении черного экран вместо удаленного рабочего стола. Кроме того, при использовании RDP сессий внутри VPN туннелей может наблюдаться фрагментирование UDP пакетов из-за разных настроек MTU и чаще всего такое рассогласование наблюдается с OpenVPN серверами.
Решение проблемы зависания RDP сессий при использовании UDP
Наиболее очевидным решением было бы просто отключить использование протокола UDP для RDP сессии. Сделать это можно через консоль редактора локальной GPO (gpedit.msc) в разделе:
Computer Configuration -> Administrative Templates -> Windows Components -> Remoter Desktop Services -> Remote Desktop Session Host -> Connections
Включаем параметр политик Select RDP transport protocols и устанавливаем его значение Select Transport Type = Use only TCP.
Для применения настроек потребуется перезагрузить RDP сервер, но как по мне, полное отключение UDP в RDP сессиях не самая удачная идея, так как этот транспорт ускоряет и сглаживает графику.
Более правильным решением будет отключение URCP (Universal Rate Control Protocol) для терминальных служб на сервере, что также решает проблему черного экрана в Windows 10 при RDP подключении.
Для этого открываем редактор реестра (regedit) и переходим в ветку:
HKLM\SOFTWARE\Microsoft\Terminal Server Client
Здесь создаем новый параметр REG_DWORD (32-бит) с именем UseURCP и присваиваем ему десятичное значение `0`. После перегрузки, всё должно заколоситься.
Если считаете статью полезной,
не ленитесь ставить лайки и делиться с друзьями.