Как удалить устаревший маршрут, оставленный VPN в Windows
Найдите запись, которая действительно устарела, просмотрите её удаление в правильном хранилище политик и убедитесь, что поиск выбирает ожидаемый интерфейс.
Сеанс завершился несколько часов назад, адаптер исчез, а маршрут всё ещё в таблице и указывает на интерфейс 42. Удалить эту строку — одна команда; решить, что это нужная строка, — четыре проверки. Таблица маршрутов общая, поэтому широкое удаление убирает пути, которыми ещё пользуются другие подключения, включая тот, что несёт туннель. Каждый шаг ниже сужает цель, пока совпасть не сможет только одна запись.
1. Решите, запись устарела или сделана намеренно
Запись, пережившая перезагрузку, была где-то записана, и это место обычно решение, а не случайность. Разделённый туннель опирается на маршруты, которые выглядят точно как остатки, а политику, продвигающую один префикс через туннель, в одном списке не отличить от устаревшей записи. Спросите, когда маршрут появился: тот, что существует только пока туннель поднят, принадлежит конфигурации клиента, поэтому команда очистки — неподходящий инструмент. Удалите намеренный маршрут, и следующее подключение упадёт на шаге, за которым никто не следит.
Маршрут до конечной точки заслуживает отдельного предупреждения. Когда клиент добавляет маршрут к узлу VPN-сервера, чтобы зашифрованные пакеты доходили до него через локальное подключение, удаление этого маршрута обрушивает туннель при следующем переподключении, и симптом читается как сбой сервера. Прежде чем что-то трогать, сравните назначение с адресом, к которому подключается клиент: единственный публичный адрес, совпадающий с VPN-сервером, — это внешний путь, а не мусор.
2. Запишите четыре поля, которые называют запись
Один префикс — не идентичность, потому что два интерфейса могут иметь маршруты к одному назначению. Запишите префикс назначения, индекс интерфейса, следующий переход и хранилище политик, поскольку эти четыре значения описывают ровно одну запись. Один список даёт их все:
Get-NetRoute -AddressFamily IPv4 | Sort-Object RouteMetricСортировка по метрике поднимает маршруты, которым машина действительно отдаёт предпочтение, и обычно именно там сидит остаток. Сравните запись, пока туннель поднят, и снова после того, как он упадёт: маршрут, уходящий вместе с адаптером, принадлежал клиенту, а оставшийся записало что-то другое. Хранилище политик — поле, которое люди пропускают, и именно оно объясняет повторное появление, потому что запись, удалённая из активного хранилища, возвращается после следующего обновления политик. Запишите четыре значения, прежде чем запускать что-либо, меняющее состояние.
3. Просмотрите удаление, затем удалите одну запись
Remove-NetRoute принимает тот же префикс и индекс интерфейса, что напечатал Get-NetRoute, и у него есть переключатель предварительного просмотра, поэтому гадать ничего не нужно. Запустите пару в таком порядке:
Remove-NetRoute -DestinationPrefix 10.20.0.0/16 -InterfaceIndex 42 -WhatIf
Remove-NetRoute -DestinationPrefix 10.20.0.0/16 -InterfaceIndex 42Предварительный просмотр печатает объект, который был бы удалён, поэтому перед тем как отпустить переключатель, сравните префикс, интерфейс и следующий переход со своими заметками. Ни одна из строк не достигает постоянной записи, потому что активное хранилище задано по умолчанию; добавьте -PolicyStore PersistentStore, когда найденный маршрут живёт там, иначе удаление выглядит успешным, а запись возвращается при следующем обновлении политик. Держите внешний путь восстановления, когда сеанс удалённый, поскольку удаление маршрута, несущего ваше собственное подключение, обрывает его. Никогда не тянитесь к команде, очищающей таблицу.
4. Найдите компонент, который возвращает её
Удаление не исправление, пока владелец всё ещё настроен устанавливать маршрут. Владелец обычно один из трёх: профиль VPN-клиента со списком разделённого туннеля, скрипт или запланированная задача, добавляющая маршруты при входе, либо доменная политика, применённая к машине. Сначала проверьте профиль, потому что он выполняется при каждом подключении:
Get-VpnConnection | Select-Object Name,SplitTunneling,ServerAddress
Get-NetRoute -PolicyStore PersistentStoreПостоянные записи видны без подключения чего-либо, поэтому маршрут, возвращающийся после перезагрузки без сеанса VPN, почти всегда живёт в этом хранилище или в скрипте запуска. Исправьте там владельца, и ручное удаление станет проверкой вместо лечения.
5. Проверьте поиск, соседей и заметку
Чистый результат — это не «маршрут исчез», а поиск, который теперь выбирает ожидаемый интерфейс. Спросите машину, куда пойдёт пакет к затронутому префиксу, потому что остаток всё ещё называет мёртвый индекс, а чистый ответ называет интерфейс на связи или правильный шлюз. Find-NetRoute отвечает на это для одного адреса за раз:
Find-NetRoute -RemoteIPAddress 10.20.4.7Затем проверьте соседа: выберите второй префикс, который ещё нужен разделённому туннелю, и убедитесь, что его поиск не изменился, поскольку убрать один маршрут лишним — ошибка, к которой приглашает эта очистка. Повторите попытку приложения, изначально упавшего, и запишите, какой компонент теперь владеет префиксом. Документация Microsoft по Get-NetRoute перечисляет поля, которые вы записали на втором шаге. Через полгода именно эта заметка не даст диагностировать одну и ту же запись дважды.