Развертывание VPN и RDP клиентов для удаленных пользователей
В рамках данного блога были публикации о настройке VPN сервера.
2020 год принес всем сюрприз в виде съеденной летучей мыши.
В марте нынешнего года пришлось организовывать несколько десятков удаленных рабочих мест штатными средствами (Windows 7, 8 и 10 ).
Для себя я выбрал связку Softether VPN как VPN сервер и Windows Terminal Server как Сервер терминалов:)
Для быстроты развертывания на клиентской стороне VPN и RDP были созданы скрипты простые автоматизации.
Забегая вперед — полностью автоматизировать настройку у меня не получилось, удалось сократить время настройки на 70-80% удалось.
Общая идея:
- Автоматизировать VPN и RDP подключение пользователем запуском одного файла.
- При отключении RDP сессии отключаться от VPN сервера.
- Ускорить развёртывание на стороне клиента
Реализация:
- Шаблон VPN соединения
- Шаблон RDP файла
- Программа cmdow для сокрытия активного окна CMD
- Bat скрипт автоматизации подключения
- Bat скрипт создания клиентских подключений
Считаем, что VPN сервер (L2TP/IPSec) настроен и доступен по адресу vpn.mydomain.ru.
В сети до сих пор есть описания о создании терминальных серверов с пробросами портов в инет.
Как защиту предлагают сменить стандартный порт 3389 на другой.
!Никогда так не делайте, обязательно ставьте в разрыв VPN сервер!
Создадим директорию проекта:
mkdir %SystemDrive%\VPNconnect
Создание «шаблона» VPN подключения:
Настраиваем и тестируем VPN соединение, после удачного теста сохраняем его данные в текстовый файл под именем my.pbk.
Для этого открываем текстовым редактором файл:
notepad %USERPROFILE%\AppData\Roaming\Microsoft\Network\Connections\Pbk\rasphone.pbk
Если на вашей машине одно соединение, то можно просто скопировать данный файл в рабочую папку проекта.
Если несколько подключений, то скопируйте руками в новый файл данные нужного подключения.
Ориентир — название подключения в квадратных скобках:
 [vpn.mydomain.ru]
Конец конфигурации заканчивается блоком:
 DEVICE=vpn
Encoding=1
 PBVersion=4
 Type=2
 AutoLogon=0
 UseRasCredentials=1
 LowDateTime=1140277904
 HighDateTime=30850051
 DialParamsUID=4810171
 Guid=0CDB884F96A5084D83311721A107FAF9
 VpnStrategy=3
 ExcludedProtocols=8
 LcpExtensions=1
 DataEncryption=256
 SwCompression=0
 NegotiateMultilinkAlways=0
 SkipDoubleDialDialog=0
 DialMode=0
 OverridePref=15
 RedialAttempts=3
 RedialSeconds=60
 IdleDisconnectSeconds=0
 RedialOnLinkFailure=1
 CallbackMode=0
 CustomDialDll=
 CustomDialFunc=
 CustomRasDialDll=
 ForceSecureCompartment=0
 DisableIKENameEkuCheck=0
 AuthenticateServer=0
 ShareMsFilePrint=1
 BindMsNetClient=1
 SharedPhoneNumbers=0
 GlobalDeviceSettings=0
 PrerequisiteEntry=
 PrerequisitePbk=
 PreferredPort=VPN3-0
 PreferredDevice=WAN Miniport (L2TP)
 PreferredBps=0
 PreferredHwFlow=1
 PreferredProtocol=1
 PreferredCompression=1
 PreferredSpeaker=1
 PreferredMdmProtocol=0
 PreviewUserPw=1
 PreviewDomain=1
 PreviewPhoneNumber=0
 ShowDialingProgress=1
 ShowMonitorIconInTaskBar=0
 CustomAuthKey=0
 AuthRestrictions=512
 IpPrioritizeRemote=1
 IpInterfaceMetric=0
 IpHeaderCompression=0
 IpAddress=0.0.0.0
 IpDnsAddress=0.0.0.0
 IpDns2Address=0.0.0.0
 IpWinsAddress=0.0.0.0
 IpWins2Address=0.0.0.0
 IpAssign=1
 IpNameAssign=1
 IpDnsFlags=0
 IpNBTFlags=1
 TcpWindowSize=0
 UseFlags=2
 IpSecFlags=1
 IpDnsSuffix=
 Ipv6Assign=1
 Ipv6Address=::
 Ipv6PrefixLength=0
 Ipv6PrioritizeRemote=1
 Ipv6InterfaceMetric=0
 Ipv6NameAssign=1
 Ipv6DnsAddress=::
 Ipv6Dns2Address=::
 Ipv6Prefix=0000000000000000
 Ipv6InterfaceId=0000000000000000
 DisableClassBasedDefaultRoute=0
 DisableMobility=0
 NetworkOutageTime=0
 ProvisionType=0
 PreSharedKey=
 CacheCredentials=1
 NumCustomPolicy=0
 NumEku=0
 UseMachineRootCert=0
 NumServers=0
 NumRoutes=0
 NumNrptRules=0
 AutoTiggerCapable=0
 NumAppIds=0
 NumClassicAppIds=0
 SecurityDescriptor=
 ApnInfoProviderId=
 ApnInfoUsername=
 ApnInfoPassword=
 ApnInfoAccessPoint=
 ApnInfoAuthentication=1
 ApnInfoCompression=0
 WebPreAuth=
 DisableDefaultDnsSuffixes=0
 NumTrustedNetworks=0
 NumDnsSearchSuffixes=0
 PowershellCreatedProfile=0
 ProxyFlags=0
 ProxySettingsModified=0
 ProvisioningAuthority=
 AuthTypeOTP=0
 GREKeyDefined=0
 NumPerAppTrafficFilters=0
 AlwaysOnCapable=0
 PrivateNetwork=0
NETCOMPONENTS=
 ms_msclient=1
 ms_server=1
MEDIA=rastapi
 Port=VPN3-0
 Device=WAN Miniport (L2TP)
DEVICE=vpn
 PhoneNumber=vpn.mydomain.ru
 AreaCode=
 CountryCode=0
 CountryID=0
 UseDialingRules=0
 Comment=
 FriendlyName=
 LastSelectedPhone=0
 PromoteAlternates=0
 TryNextAlternateOnFail=1
Этот файл в дальнейшем мы будем импортировать клиентам.
При импорте мы потеряем логин, пароль и общий ключ IPSec.
Создадим в директории проекта RDP файл (текстовый файл c расширением rdp):
 
screen mode id:i:2
 use multimon:i:0
 desktopwidth:i:1920
 desktopheight:i:1080
 session bpp:i:32
 winposstr:s:0,3,0,0,800,600
 compression:i:1
 keyboardhook:i:2
 audiocapturemode:i:0
 videoplaybackmode:i:1
 connection type:i:2
 networkautodetect:i:1
 bandwidthautodetect:i:1
 displayconnectionbar:i:1
 enableworkspacereconnect:i:0
 disable wallpaper:i:0
 allow font smoothing:i:0
 allow desktop composition:i:0
 bitmapcachepersistenable:i:1
 full address:s:192.168.66.223
 audiomode:i:0
 redirectprinters:i:1
 redirectcomports:i:0
 redirectsmartcards:i:1
 redirectclipboard:i:1
 redirectposdevices:i:0
 autoreconnection enabled:i:1
 authentication level:i:0
 prompt for credentials:i:1
 negotiate security layer:i:1
 remoteapplicationmode:i:0
 alternate shell:s:
 shell working directory:s:
 gatewayhostname:s:
 gatewayusagemethod:i:4
 gatewaycredentialssource:i:4
 gatewayprofileusagemethod:i:0
 promptcredentialonce:i:0
 gatewaybrokeringtype:i:0
 use redirection server name:i:0
 rdgiskdcproxy:i:0
 kdcproxyname:s:
 redirectdirectx:i:1
 drivestoredirect:s:Локальный диск (C:);
 username:s:MYDOMAIN\vladimir
Обращаем внимание на 3 строки и меняем их на нужные:
- full address:s:192.168.66.223 — адрес вашего терминального сервера
- drivestoredirect:s:Локальный диск (C:); — перенаправление локального диска пользователя
- username:s:MYDOMAIN\vladimir — логин пользователя
Более полное описание доступных переменных в rdp файле
Докидываем в директорию проекта cmdow.exe из скаченного архива по пути \bin\Release (альтернативная ссылка).
Итого в директории у нас 3 файла:
- my.pbk — шаблон VPN соединения
- my.rdp — RDP файл
- cmdow.exe — программа для скрытия рабочего окна скрипта
Создадим 2 bat-скрипта в директории проекта:
- install.bat — скрипт установщик
- connect.bat — скрипт запуска VPN и RDP сессий
notepad++ %SystemDrive%\VPNconnect\connect.bat
cmdow @ /HID rasdial vpn.mydomain.ru username password mstsc.exe my.rdp rasdial vpn.mydomain.ru /disconnect
notepad++ %SystemDrive%\VPNconnect\install.bat
copy my.rdp connect.bat %USERPROFILE%\Desktop copy cmdow.exe %LOCALAPPDATA%| type my.pbk >> %USERPROFILE%\AppData\Roaming\Microsoft\Network\Connections\Pbk\rasphone.pbk REM Открываем в панели управления сетевые адаптеры для установки IPSec общего ключа ncpa.cpl
Заполняем корректными данными RDP файл (адрес сервера, имя пользователя).
В файле connect.bat указываем корректные имя и пароль.
Разворачиваем клиентов
Копируем директорию проекта на компьютер клиента.
Переходим в директорию и запускаем от администратора install.bat.
Устанавливаем IPSec ключ в свойствах сетевого адаптера:
 
- connect.bat — поднимает VPN соединение, RDP сессию (на основе файла my.rdp)
 гасит VPN коннект после отключения RDP сессии
- my.rdp — необходим для RDP сессии
После запуска connect.bat произойдет подключение к VPN серверу и после этого запустится RDP сессия.
На этом наверное все:)
 P.S. Из массы разнообразных домашних компьютеров попались два экземпляра:
Windows XP — вообще ни как штатными средствами не удалось настроить VPN
Windows 7 (32) — при попытке соединения выдавал различные ошибки
Пришлось на этих двух машинах установить VPN клиент от SoftEther.
После его настройке можно автоматизировать запуск с помощью его CLI:
- vpncmd localhost /client /cmd AccountConnect Имя_соединения
- vpncmd localhost /client /cmd AccountDisconnect Имя_соединения




