В современных версиях Windows есть интересная возможность автоматического добавления статических маршрутов при активации определённого VPN подключения. Когда VPN подключение разрывается, данный маршрут автоматически удаляется из таблицы маршрутизации Windows. Для добавления IPv4 или IPv6 маршрута для VPN подключения используется PowerShell командлет Add-VpnConnectionRoute.
Допустим, вы хотите, чтобы через ваше VPN подключение маршрутизировались только пакеты для двух подсетей (192.168.111.24/ и 10.1.0.0/16), а весь основной трафик должен идти через вашего провайдера.
Откройте консоль PowerShell и выведите список всех настроенных VPN подключений в Windows:
Get-VpnConnection
В первую очередь нужно отключить опцию “Use default gateway in remote network” (Использовать основной шлюз в удаленной сети). Это можно сделать в свойствах VPN подключения в панели управления или командой:
Set-VpnConnection –Name workVPN -SplitTunneling $True
Добавим два статических маршрута для нашего VPN-соединения:
Add-VpnConnectionRoute -ConnectionName "workVPN" -DestinationPrefix 192.168.111.0/24 –PassThru
Add-VpnConnectionRoute -ConnectionName "workVPN" -DestinationPrefix 10.1.0.0/16 –PassThru
DestinationPrefix : 192.168.111.0/24 InterfaceIndex : InterfaceAlias : workVPN AddressFamily : IPv4 NextHop : 0.0.0.0 Publish : 0 RouteMetric : 1
Если у вас активно VPN подключение, вам нужно переподключиться, чтобы новые маршруты добавились в таблицу маршрутизации.
Новые маршруты привязаны к VPN подключению и добавляются при его запуске. Когда вы отключаетесь от VPN сервера, маршруты автоматически удаляются.
Отключитесь от VPN и проверьте таблицу маршрутизации. Маршрут к вашей удаленной сети удалился автоматически, а Get-NetRoute вернет, что маршрут не найден:
Get-NetRoute : No MSFT_NetRoute objects found with property 'DestinationPrefix' equal to '192.168.111.0/24'. Verify the value of the property and retry. CmdletizationQuery_NotFound_DestinationPrefix,Get-NetRoute
Вывести список статических маршрутов для подключения:
(Get-VpnConnection -ConnectionName workVPN).Routes
Чтобы полностью удалить статических маршрут для VPN подключения, используйте команду:
Remove-VpnConnectionRoute -ConnectionName workVPN -DestinationPrefix 192.168.111.0/24 -PassThru
В предыдущих версиях Windows (Windows 7/ Server 2008R2) для динамического добавления маршрутов после установления VPN подключений приходилось использовать CMAK и различные скрипты с командами
add route
.
Например, можно создать командный файл vpn_route.netsh для добавления маршрутов.
interface ipv4
add route prefix=192.168.111.24 interface="workVPN" store=active
add route prefix=10.1.0.0/16 interface="workVPN" store=active
exit
Данный файл нужно запускать через задание планировщика, которое срабатывает на событие установки VPN подключения в Event Viewer (RasMan 20225)
schtasks /create /F /TN "Add VPN routes" /TR "netsh -f C:\PS\vpn_route.netsh" /SC ONEVENT /EC Application /RL HIGHEST /MO "*[System[(Level=4 or Level=0) and (EventID=20225)]] and *[EventData[Data='My VPN']]"
На GitHub есть замечательный Powershell скрипт который позволяет создавать впн подключения и так же добавляет маршруты для сплит-тунеля
Спасибо )
Спасибо.
Что вы там все свои адреса замазываете, как будто они кому-то нужны…
Как можно повысить привилегии в сеансе обычного пользователя при исполнении скрипта PowerShell? Выполнение Add-Vpnconnectionroute требует прав администратора.
Задача следующая: пользователь в вин 10 без полных прав запускает скрипт с помощью которого поднимается подключение к VPN с добавлением маршрутов командлетом Add-Vpnconnectionroute. Выдавать пользователю полные права запрещено политикой предприятия и здравым смыслом.
1) Сначала создайте задание планировщика, которое будет запускать команду Add-Vpnconnectionroute от имени админа или system.
2) Добавьте в ваш скрипт пользователя команду запуска этого задания (или можно запускать скрипт по событию https://winitpro.ru/index.php/2016/01/21/zapusk-powershell-skripta-pri-vozniknovenii-opredelennogo-sobytiya/)
Я предполагал задействовать 1 скрипт для всего, в котором перед Add-VpnconnectionRoute должно выполняться что-то вроде обращения в хранилище Диспетчера учетных данных (Credential manager) для получения учетных данных с повышенными правами. Что-то вроде runas /savecred в командной строке. Такое возможно?
Можно, но придется ставить дополнительный модуль:
CredentialManager (https://winitpro.ru/index.php/2012/04/17/upravlenie-soxranennymi-parolyami-v-windows-7/)
или SecretManagement (https://winitpro.ru/index.php/2021/05/11/modul-powershell-secret-management-hranenie-paroley/)
И это не решит проблему с тем, что пользователь при желании сможет использовать пароль админа из Credential Manager для запуска любой команды с правами админа или даже сменить его пароль.
Просмотреть настроенные маршруты для соединения:
(Get-VpnConnection -ConnectionName «VPN name»).Routes
Можно в статью добавить…
Да полезно, добавил.спс!
Спасибо автор, владельцы микротиков с отключенным Use default gateway in remote network массово удаляют статические маршруты прописанные ручками))))
Мне нравится Ваш сайт, часто сюда захожу, поэтому хочу внести свою маленькую лепту:
Строка
по сути содержит ошибку в выражении
: Вместо символа Hyphen-Minus Юникод 002D там стоит символ Юникод 2013 En Dash. Соответственно при копипасте в некоторых пожилых версиях PowerShell выскакивает непонятная ошибка синтаксиса. Терминал Windows 11, например, спокойно проглатывает это, а вот в PowerShell Win10 — нет.
абсолютно не рабочий вариант для VPN anyconnect от Cisco к сожалению.
Нет таких настроек в TCP/IP соединении, PS не видит vpn никаких командой Get-VpnConnection
Интересно, а что Вы хотели? Это же совершенно отдельное стороннее ПО, и Windows не может им управлять.
Соответственно делается это все через Киску и ника иначе, например так