В Windows 10/11 используется максимально упрощенные графический интерфейс настройки VPN подключений. Чтобы задать специфические настройки для VPN подключения приходится использовать как классический интерфейс настройки VPN подключения в панели управления, так и современное приложение настройки сети в панели Параметры (команда
ms-settings:network-vpn
для быстрого доступа к настройкам). В этой статье мы посмотрим на особенности управления VPN-подключениями в Windows с помощью PowerShell: рассмотрим, как создать создать/изменить/удалить VPN подключение и подключится/отключиться к VPN серверу.
Для создания нового VPN подключения в Windows используется командлет Add-VpnConnection. В самом простом случае для создания нового VPN подключения нужно указать его имя и адрес VPN сервера.
Add-VpnConnection -Name "WorkVPN" -ServerAddress "vpn.winitpro.ru” -PassThru
Чтобы задать кастомные настройки для VPN подключения, используйся следующие опции (наиболее распространённые):
- TunnelType – тип VPN туннеля. Доступны следующие варианты:
-
Automatic
– Windows сама пытается определить тип VPN туннеля -
IKEv2
— Internet Key Exchange -
PPTP
– Point to Point Tunneling Protocol -
L2TP
– Layer 2 Tunneling Protocol /IPsec с сертификатом или общим ключом (Pre-share key) -
SSTP
– Secure Socket Tunneling Protocol
-
- L2TPPsk — предварительный общий ключ для аутентификации (только для L2TP). Если этот параметр не указан, для L2TP аутентификации используется сертификат;
- AuthenticationMethod – тип аутентификации. Возможно использовать:
Pap, Chap, MSChapv2, Eap, MachineCertificate
; - EncryptionLevel – настройки шифрования (
NoEncryption, Optional, Required, Maximum, Custom
); - SplitTunneling – нужно ли заворачивать весь трафик компьютера в VPN туннель (аналогично опции
Use default gateway on remote network
в настройках параметра VPN адаптера); - UseWinlogonCredential – использовать учетные данные текущего пользователя для аутентификации на VPN сервере;
- AllUserConnection – разрешить использовать VPN подключение для всех пользователей компьютера;
- RememberCredential – разрешить сохранять учетные данные для VPN подключения (учетная запись и пароль сохраняются в диспетчер учетных данных Windows после первого успешного подключения);
- PassThru – параметр позволяет вывести на экран результаты команды (рекомендуем использовать во всех командах).
Ниже приведем несколько примеров PowerShell команд для создания разных типов VPN подключений.
- L2TP/IPsec:
Add-VpnConnection -Name "WorkVPN_L2TP" -ServerAddress "vpn.winitpro.ru" -TunnelType L2TP -L2tpPsk "str0ngSharedKey2" -Force -EncryptionLevel "Required" -AuthenticationMethod MSChapv2 -UseWinlogonCredential -RememberCredential -AllUserConnection –PassThru
- PPTP:
Add-VpnConnection -Name "WorkVPN_PPTP" -ServerAddress "vpn.winitpro.ru" TunnelType "PPTP" -EncryptionLevel "Required" -AuthenticationMethod MSChapv2 -SplitTunneling -PassThru
- SSTP: необходимо сначала импортировать в хранилище сертификатов компьютера корневой CA VPN сервера, и использовать в качестве адреса FQDN VPN сервера, которое указано в сертификате (CN — Common Name, или в Subject Alternative Name)
Add-VpnConnection -Name "WorkVPN_SSTP" -ServerAddress "vpn.winitpro.ru" -TunnelType "SSTP" -EncryptionLevel "Required" -AuthenticationMethod MSChapv2 -RememberCredential -SplitTunneling -PassThru
При использовании само подписанных сертификатов, вы можете добавить в сертификат несколько имен с помощью PowerShell. - IKEv2:нужно предварительно импортировать корневой CA в хранилище доверенных корневых сертификатов Windows, а сертификат компьютера в личные сертификаты:
Import-PfxCertificate -FilePath $comp_certificate -CertStoreLocation Cert:\LocalMachine\My\ -Password $password
Import-Certificate -FilePath $ca_cert -CertStoreLocation Cert:\LocalMachine\Root\
Add-VpnConnection -Name "WorkVPN_IKEv2" -ServerAddress "vpn.winitpro.ru" -TunnelType Ikev2 -EncryptionLevel "Maximum" -AuthenticationMethod MachineCertificate -SplitTunneling $True -PassThru
Подключения, доступные для всех пользователей (созданные с параметром
AllUserConnection
), отображаются в панели управления сетями, а в качестве Owner указана
System
. У подключения пользователя здесь будет указано
domain\username
.
Общие VPN подключения сохраняются в текстовый файл
%ProgramData%\Microsoft\Network\connections\Pbk\rasphone.pbk
.
Чтобы изменить параметры существующего VPN подключения, используется команда Set-VpnConnection:
Set-VpnConnection -Name "WorkVPN_SSTP" –splittunneling $false –PassThru
Если вам нужно изменить параметры IPsec для существующего VPN подключения используется командлет Set-VpnConnectionIpsecConfiguration (только для IKEv2 и L2TP VPN)
Set-VpnConnectionIPsecConfiguration -ConnectionName "WorkVPN_IKEv2" -AuthenticationTransformConstants SHA256128 -CipherTransformConstants AES256 -DHGroup Group14 -EncryptionMethod AES256 -IntegrityCheckMethod SHA256 -PfsGroup PFS2048 –PassThru
Для принудительного сохранения имени и пароля для VPN подключения можно использовать модуль VPNCredentialsHelper.
Установите модуль на компьютер из PowerShellGallery (также можно установить PowerShell модуль в офлайн режиме):
Install-Module -Name VPNCredentialsHelper
После этого вы можете сохранить в Windows Credential Manager определенное имя и пароль для вашего VPN подключения:
$user = "vpnusername"
$plainpass = "vpn_password"
Set-VpnConnectionUsernamePassword -connectionname "WorkVPN_SSTP" -username $user -password $plainpass
В современных версиях Windows вы можете динамически добавлять в таблицу маршрутизации маршруты при подключении к VPN.
Add-VpnConnectionRoute -ConnectionName "workVPN" -DestinationPrefix 192.168.111.0/24 –PassThru
Такой маршрут будет активирован только после успешного подключения к серверу VPN.
Вывести список всех VPN подключений, доступных пользователю:
Get-VpnConnection
Для удаления VPN подключения, выполните:
Remove-VpnConnection -Name "WorkVPN_SSTP"
Для подключения к VPN серверу с ранее настроеннм профилем VPN, выполните:
rasdial "WorkVPN_SSTP"
Вывести статусы всех VPN подключений:
Get-Vpnconnection | Select Name, Connectionstatus
Вадим, учитывая, что так и так Вы упоминаете старый ламповый расдиал и *.pbk, может имеет смысл в статье выделить, чего именно не удастся добиться банальным созданием этого файла например командой echo из батника.
Install-Module -Name VPNCredentialsHelper
Не работает, пробовал сохранять скачанный модуль по стандартному пути в документах пользователя — всё равно не сохраняются учётные данные для подключения.
ошибка
PPTP: Add-VpnConnection -Name «WorkVPN_PPTP» -ServerAddress «vpn.winitpro.ru» TunnelType «PPTP» -EncryptionLevel «Required» -AuthenticationMethod MSChapv2 -SplitTunneling -PassThru
PPTP: Add-VpnConnection -Name «WorkVPN_PPTP» -ServerAddress «vpn.winitpro.ru» -TunnelType «PPTP» -EncryptionLevel «Required» -AuthenticationMethod MSChapv2 -SplitTunneling -PassThru
Еще одно немаловажное дополнение к статье, если в пароле l2tp ключа, например «MyPSKpas$word» используется символ $ то перед ним надо ставить символ `, в итоге это будет выглядеть так «MyPSKpas`$word» в противном случае он скриптом не добавится в соединение.
Верно, символ $ нужно экранировать
А как быть, если соединений настроено на машине несколько к разным серверам по IKEv2 и аутентификация по сертификатам? В хранилище личных сертификатов машины лежит несколько штук, а Windows при соединении берет из кучи какой-то неподходящий для данного соединения сертификат клиента и , ка крезультат, не соединяется.
По идее должен исопльзоваться сретификат, в чьем Subject Name или Subject Alternative Name содержится адрес вашей точки VPN подключения.
У вас несколько сертификатов с одинаковыми CN для хоста?
И судя по описанию команды
Add-VpnConnection, у нее есть параметр [-MachineCertificateIssuerFilter ]
Или так
Set-VpnConnection -MachineCertificateIssuerFilter
Да должен, но ощущение, что реально нет. Сертификаты разные. С разным CN. Берет из хранилища то ли случайно, то ли в каком-то алфавитном порядке, то ли последний по дате записи в хранилище. Прямо видно в логах на VPN сервере, что мой клиент пытается подсунуть ему клиентский сертификат, для работы с другим сервером. В принципе, на сервере можно настроить, чтобы принимался любой клиентский сертификат, подписанный его сертифкатом CA (самозаверерным), но и CA ведь тоже разные на разных VPN серверах (используются самозаверенные).
Про опцию выбора сертификата для соединения спасибо, попробую.
Тоже столкнулся с такой проблемой. По моим наблюдениям подхватывает первый установленный сертификат. Удалось как-то решить проблему?
Пока нет, в настоящий момент острой потребности нет, занят другими проблемами. Однако задачу решать предполагаю путем создания VPN соединения через PowerShell с указанием конкретного сертификата для этого соединения и, возможно, других параметров, например добавить маршруты. Можете сами попробовать, возможно, вы решити раньше чем я.
После импорта сертификата CA и клиентского(машинного) сертификатов, удалось добиться, чтобы add-vpnconnection создавал соединение с привязкой к сертификату, но не клиентскому, а через издателя с параметром -MachineCertificateIssuerFilter из хранилища корневых сертификатов достаю сертификат нужного CA и пихаю в значения параметров. Но не всё так гладко.
1. Соединение создается с владельцем Система. get-vpnconnection его не видит без ключа -AllUserConnection. При попытке использования ключа -AllUserConnection при создании соединения команда выпадает в ошибку
Причем при любом значении указанного параметра — как $True, так и $False
2. Выбор идет по сертификату CA, а значит, для одного CA можно таким методом использовать только 1 клиентский сертификат, что иногда нужно (например, для каких-то тестов). Как При создании соединения указать конкретный клиентский сертификат, я пока не разобрался, не знаю, возможно ли это вообще. Так как , по логике вещей, если машина одна, то и сертификат у нее может быть только один, это же не сертификат юзера…
Проверено, действительно если указать конкретный ca для команды Set-VpnConnection -Name «Your_Name» -MachineCertificateIssuerFilter «C:\Path_to_your_ca.crt\your_ca.crt» все работает как надо.
То есть, его даже импортировать не нужно?
Импортировать нужно, но после подключения можно удалить с диска машины (потому как нужно указать путь к корневому сертификату) и все продолжает работать, пока они лежат в хранилище сертификатов.
Не увидел где примеры скриптов для автоматизации подключений к уже имеющимся ВПН соединениям??