Развертывание 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 Имя_соединения