Найти тему
It-Assistant

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

Оглавление

Управление 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

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

Если вы указали параметр PassThru, то на экране появятся свойства созданного подключения, как на рисунке выше, без указания этого параметра вывод у команды отсутствуют.
Если вы указали параметр 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

Обратите внимание, что в данной команде мы использовали ключ Force, чтобы предотвратить появление запроса о том, что подтверждаем ли мы передачу общего ключа в открытой форме. Также, как и с PPTP-подключением мы отключили шлюз в VPN-сети и разрешили запоминать учетные данные.
Обратите внимание, что в данной команде мы использовали ключ 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

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

IKEv2

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

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

-4

Обращает внимание новый метод аутентификации 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

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

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

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

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

Get-VpnConnection

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

Get-VpnConnection -Name "PPTP PS"

Возможностей у командлета немного, но со своей работой он справляется.
Возможностей у командлета немного, но со своей работой он справляется.

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

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

Remove-VpnConnection -Name "PPTP PS"

Но будьте осторожны и используйте Force только тогда, когда вы точно знаете какое соединение хотите удалить. Не рекомендуем использовать этот параметр интерактивно, так как есть риск, что вы можете указать не то соединение, все-таки запрос - лишний повод остановиться и подумать.
Но будьте осторожны и используйте 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

Если маршрутов нужно несколько - выполняем команду несколько раз. Для удаления маршрутов используем командлет Remove-VpnConnectionRoute с точно таким же синтаксисом. Более подробно об управлении маршрутами можете прочитать в нашей статье: Автоматическое добавление маршрутов для VPN-соединения в Windows.
Если маршрутов нужно несколько - выполняем команду несколько раз. Для удаления маршрутов используем командлет 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, для создания подключения не требуется повышения прав.

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

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

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

Источник