Управляем VPN-соединениями в Windows при помощи PowerShell

  • Автор:

powershell-vpnconnection-management-000.pngУправление VPN-подключениями в последних версиях Windows трудно назвать понятным и удобным. Часть настроек производится через современное приложение Параметры, другая часть, как и прежде, находится в Панели управления. Какие-то шаги к упорядочению этой ситуации сделаны только в Windows 11, но практического опыта работы с ней еще недостаточно. Но есть гораздо более простой и удобный способ управления VPN-соединениями - это PowerShell, его можно использовать как в интерактивном режиме, так и для написания скриптов автоматизации, которые будут производить настройку подключения в один клик.

Тема VPN является номером один для системных администраторов второй год, сложная эпидемиологическая обстановка диктует свои условия и требует обеспечить простой и безопасный способ удаленной работы для пользователей. И если с созданием VPN-сервера особых проблем нет - на выбор большое количество протоколов и технологий, то с клиентскими устройствами все намного сложнее.

Как мы уже говорили выше, самостоятельно создать VPN-подключение, не совершив при этом ошибок, для обычного пользователя будет достаточно сложной задачей, что потребует от администратора либо длительных консультаций в телефонном режиме, либо самостоятельной настройки через удаленное подключение. Да и в повседневной работе ввести одну команду гораздо быстрее и удобнее, нежели прокликивать несколько форм в разных местах.

Для управления VPN-соединениями мы будем использовать PowerShell, данные возможности поддерживаются начиная с Windows 8 и Windows Server 2012.

Создание VPN-соединения

Для того, чтобы создать новое VPN-подключение используется командлет Add-VpnConnection, использовать который достаточно просто, обязательных параметров всего два: имя подключения и адрес сервера. Но это, конечно же, не наш метод, если возможности позволяют выполнить тонкую настройку, а они позволяют, то ее нужно выполнить. Поэтому давайте изучим доступные параметры, которые могут нам пригодиться:

  • Name - имя подключения, произвольная строка
  • ServerAddress - адрес VPN сервера, можно указать как IP, так и FQDN
  • TunnelType - тип туннеля, доступные значения: Pptp, L2tp, Sstp, Ikev2, Automatic
  • EncryptionLevel - уровень шифрования данных, можно использовать: NoEncryption, Optional, Required, Maximum
  • AuthenticationMethod - способ проверки подлинности, доступно: Pap, Chap, MSChapv2, Eap, MachineCertificate
  • L2tpPsk - только для L2TP - предварительный общий ключ
  • SplitTunneling - отключает перенаправление всего трафика в туннель, аналогично снятию флага Использовать основной шлюз в удаленной сети
  • RememberCredential - запоминать учетные данные пользователя
  • UseWinlogonCredential - использовать для VPN-подключения учетные данные для входа в систему
  • AllUserConnection - создать подключение для всех пользователей

Также нам пригодятся два служебных параметра:

  • PassThru - выводит на экран результат выполнения команды
  • Force - подавляет вывод запросов и некритичных ошибок, в запросах применяется действие по умолчанию

Ниже мы рассмотрим команды для создания подключений всех поддерживаемых типов.

PPTP

Устаревший и небезопасный протокол, то один из самых быстрых типов подключения, все еще продолжает использоваться там, где не предъявляются высокие требования к защите данных, либо для этого используются иные механизмы, например, SSL/TLS. В качестве способа аутентификации следует использовать MS-CHAP v2, а уровень шифрования не ниже Required, что соответствует параметру Обязательное (отключиться если нет шифрования) в графическом интерфейсе.

Add-VpnConnection -Name "PPTP PS" -ServerAddress "192.168.3.107" -TunnelType "Pptp" -EncryptionLevel "Required" -AuthenticationMethod MSChapv2 -RememberCredential -SplitTunneling -PassThru 

Также мы добавили опции для отключения перенаправления трафика в туннель и разрешили запоминать учетные данные.

powershell-vpnconnection-management-001.pngЕсли вы указали параметр PassThru, то на экране появятся свойства созданного подключения, как на рисунке выше, без указания этого параметра вывод у команды отсутствуют.

L2TP/IPsec

В качестве L2TP будем рассматривать подключение с общим ключом, также используем MS-CHAP v2 и уровень шифрования Required и выше.

Add-VpnConnection -Name "L2TP PS" -ServerAddress "192.168.3.107" -TunnelType "L2tp" -L2tpPsk "MySharedKey" -Force -EncryptionLevel "Required" -AuthenticationMethod MSChapv2 -SplitTunneling -RememberCredential -PassThru

powershell-vpnconnection-management-002.pngОбратите внимание, что в данной команде мы использовали ключ Force, чтобы предотвратить появление запроса о том, что подтверждаем ли мы передачу общего ключа в открытой форме. Также, как и с PPTP-подключением мы отключили шлюз в VPN-сети и разрешили запоминать учетные данные.

SSTP

Для использования SSTP вам потребуется импортировать корневой CA-сертификат центра сертификации, выдавшего сертификат серверу в локальное хранилище компьютера, а также использовать в качестве адреса сервера FQDN-имя, указанное в его сертификате. В остальном все несложно, соединение создается уже привычной командой:

Add-VpnConnection -Name "SSTP PS" -ServerAddress "sstp.interface31.lab" -TunnelType "Sstp" -EncryptionLevel "Required" -AuthenticationMethod MSChapv2 -RememberCredential -SplitTunneling -PassThru

powershell-vpnconnection-management-003.pngКомментировать здесь мы ничего не будем, если вы внимательно читали статью, то все параметры будут вам понятны.

IKEv2

А вот здесь уже интереснее, мы будем настраивать соединение с аутентификацией по сертификатам. Здесь вам также потребуется импортировать сертификаты в хранилище компьютера: сертификат CA и сертификат пользователя. А для настройки соединения используем следующую команду:

Add-VpnConnection -Name "IKEv2 PS" -ServerAddress "vpn.interface31.lab" -TunnelType "Ikev2" -EncryptionLevel "Required" -AuthenticationMethod MachineCertificate -SplitTunneling -PassThru 

powershell-vpnconnection-management-004.png

Обращает внимание новый метод аутентификации MachineCertificate и отсутствие параметра RememberCredential, в данном случае пользователю не нужно вводить никаких учетных данных, поэтому и запоминать тут нечего. В качестве имени сервера используем FQDN или IP, в зависимости от того, что указано в Common Name сертификата сервера.

Изменение параметров VPN-соединения

Создавать подключения мы уже научились, но как быть, когда нам требуется что-то в них изменить? На помощь придёт командлет Set-VpnConnection, он использует все те же параметры что и Add-VpnConnection и позволяет изменить любой из них, для указания подключения используется параметр Name. Скажем, мы хотим изменить адрес сервера для PPTP подключения, нет ничего проще, указываем имя подключения, требуемый параметр и его новое значение:

Set-VpnConnection -Name "PPTP PS" -ServerAddress "vpn.interface31.lab"

Немного сложнее с параметрами, использующими булево значение, такими как RememberCredential и аналогичными. Командлет Add-VpnConnection считал, что если параметр указан, то его значение - True или Истина (логическая 1), иначе - False или Ложь (логический 0). С Set-VpnConnection такой фокус не проходит, если мы просто укажем параметр, то он не поймет, чего именно мы от него хотим и выдаст сообщение об ошибке. Значение параметра потребуется указать явно.

Например, включим разрешение запоминать учетные данные:

Set-VpnConnection -Name "PPTP PS" -RememberCredential $True

Для отключения введите:

Set-VpnConnection -Name "PPTP PS" -RememberCredential $False

powershell-vpnconnection-management-005.pngВ тоже время служебные параметры PassThru и Force можно просто указывать без ввода значения, само их наличие воспринимается как Истина.

Получение информации о VPN-соединении

Для получения информации о настроенных VPN-соединениях мы можем использовать командлет Get-VpnConnection, из параметров он поддерживает только Name и AllUserConnection, что позволяет отобразить параметры конкретного соединения и уточнить, что мы хотим видеть соединения всех пользователей, а не только текущего.

Чтобы увидеть все VPN-соединения выполните:

Get-VpnConnection

Для получения данных о конкретном соединении:

Get-VpnConnection -Name "PPTP PS"

powershell-vpnconnection-management-006.pngВозможностей у командлета немного, но со своей работой он справляется.

Удаление VPN-соединения

Для удаления соединения используется командлет, ему достаточно передать единственный параметр - Name, также можно дополнительно указать Force, если вы не хотите подтверждать запрос об удалении соединения.

Remove-VpnConnection -Name "PPTP PS"

powershell-vpnconnection-management-007.pngНо будьте осторожны и используйте Force только тогда, когда вы точно знаете какое соединение хотите удалить. Не рекомендуем использовать этот параметр интерактивно, так как есть риск, что вы можете указать не то соединение, все-таки запрос - лишний повод остановиться и подумать.

Добавление маршрута при подключении

Автоматическое добавление маршрутов при установлении VPN-подключения - больная тема для пользователей Windows, но PowerShell позволяет решить и этот вопрос, для этих целей есть отдельный командлет Add-VpnConnectionRoute, он весьма прост в использовании, вам нужно указать имя соединения в параметре ConnectionName и сеть назначения в параметре DestinationPrefix.

Например, добавим маршрут к сети 192.168.111.0/24 через подключение L2TP PS:

Add-VpnConnectionRoute -ConnectionName "L2TP PS2" -DestinationPrefix 192.168.111.0/24 -PassThru

powershell-vpnconnection-management-008.pngЕсли маршрутов нужно несколько - выполняем команду несколько раз. Для удаления маршрутов используем командлет Remove-VpnConnectionRoute с точно таким же синтаксисом. Более подробно об управлении маршрутами можете прочитать в нашей статье: Автоматическое добавление маршрутов для VPN-соединения в Windows.

Автоматизация создания VPN-соединения

Для автоматического создания соединения важно чтобы конечный пользователь совершал минимум необходимых действий. В целях безопасности PowerShell скрипты нельзя запустить двойным кликом, поэтому будем использовать старый добрый CMD, в котором уже будем запускать PS и передавать ему нужные команды.

Ниже пример простого командного файла, который создает VPN-соединение и прописывает маршрут для него:

powershell -executionpolicy bypass -command "Add-VpnConnection -Name 'L2TP PS2' -ServerAddress '192.168.3.107' -TunnelType 'L2tp' -L2tpPsk 'MySharedKey' -Force -EncryptionLevel 'Required' -AuthenticationMethod MSChapv2 -SplitTunneling -RememberCredential"
powershell -executionpolicy bypass -command "Add-VpnConnectionRoute -ConnectionName 'L2TP PS2' -DestinationPrefix 192.168.111.101/32"

Обратите внимание, что команда полностью берется в двойные кавычки, а все двойные кавычки внутри команды заменены на одинарные. Данное содержимое вносим в Блокнот и сохраняем с расширением .bat или .cmd, для создания подключения не требуется повышения прав.

Что будет, если пользователь запустит командный файл повторно? Ничего страшного, он выдаст сообщение, что соединение с таким именем уже существует и завершит работу.

powershell-vpnconnection-management-009.pngЕсли вам нужно внести какие-либо изменения в параметры подключения, вы точно также можете создать новый командный файл, в котором будете использовать командлет Set-VpnConnection.

В целом PowerShell предоставляет достаточно широкие возможности по простому и удобному управлению VPN-соединениями на компьютере и позволяет решать множество связанных с этим задач в один клик, используя скрипты и командные файлы.

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Поддержи проект!

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал



Loading Comments