Почему в таблице маршрутизации VPN в Windows видны 0.0.0.0/1 и 128.0.0.0/1
Опция шлюза по умолчанию добавляет два половинных маршрута, а не один. Прочитайте префикс, метрику и интерфейс, прежде чем добавлять или удалять маршрут на клиенте.
Подключитесь к VPN в Windows и откройте таблицу маршрутизации, и два записи бросаются в глаза: 0.0.0.0/1 и 128.0.0.0/1. Это не опечатка, и они не заменяют маршрут по умолчанию. Их появление зависит от одной опции профиля, а пара — это способ построения полного туннеля, а не функция разделённого туннеля. Прочитайте опцию, префикс и интерфейс вместе, прежде чем менять хотя бы одну строку.
Что устанавливает опция шлюза по умолчанию
Опция профиля, которая отправляет всё через туннель, работает, добавляя эти два префикса. Снимите опцию — и они исчезнут, оставив маршрут, который покрывает только подсеть, выданную адаптеру туннеля. Флажок управляет парой; он не переписывает единственный маршрут по умолчанию. Поэтому таблица после снятия флажка выглядит как частичная перезапись, а не как удаление.
0.0.0.0/1 покрывает нижнюю половину пространства IPv4, а 128.0.0.0/1 — верхнюю, поэтому вместе они покрывают каждый одноадресный адрес. Каждый из них конкретнее маршрута по умолчанию 0.0.0.0/0, а значит, совпадение по самому длинному префиксу отправляет обычный трафик в туннель, тогда как физический маршрут по умолчанию остаётся на месте. Сохранять этот маршрут по умолчанию — не косметика: пакеты, которые оборачивают зашифрованную полезную нагрузку, адресованы публичному адресу сервера и должны выходить через физический адаптер. Замените маршрут по умолчанию вместо того, чтобы делить его, и транспорт самого туннеля попытается войти в туннель, что является петлёй, а не соединением.
Поэтому буквальный 0.0.0.0/0, указывающий на адаптер VPN, стоит остановить и рассмотреть. Встроенный клиент обычно такого не пишет, значит, ручной маршрут или конфигурация другого клиента изменили таблицу у вас за спиной. Найдите его, прежде чем отлаживать что-либо ниже.
Разбор дешевле сохранения шлюза
Разбор — практический аргумент в пользу двух записей вместо одной. Пока клиент подключён, он владеет ровно двумя маршрутами и удаляет их при отключении, оставляя то, что физический адаптер держит в этот момент. Клиенту, который заменил бы единственный маршрут по умолчанию, пришлось бы помнить прежний шлюз, а после изменения аренды DHCP он мог бы восстановить шлюз, которого больше нет. Две собственные записи такого состояния не несут.
Другие клиенты приходят к тому же решению. Профиль OpenVPN с redirect-gateway def1 устанавливает эти два префикса вместо удаления маршрута по умолчанию, и клиент Windows следует той же схеме по той же причине маршрутизации.
Именно поэтому таблица может выглядеть как полный туннель, когда вы ждали разделения. Пара — это способ построения полного туннеля, а не доказательство ошибки разделённого туннеля. Если профиль настроен на использование удалённого шлюза, маршрутизируется всё, чего бы ни достигло одно локальное приложение.
Самый длинный префикс побеждает до любой метрики
Длина префикса определяет поиск раньше любого другого поля. Метрика только разрешает ничью между маршрутами с одинаковым префиксом, поэтому запись /1 побеждает маршрут по умолчанию /0 даже при худшей метрике. Привязка к интерфейсу определяет, что останется, когда два маршрута делят префикс и Windows должен выбрать, какой адаптер отправит пакет.
route print -4
Get-NetRoute -AddressFamily IPv4 | Sort-Object DestinationPrefix
Find-NetRoute -RemoteIPAddress 10.50.5.20
Таблица разделённого туннеля содержит физический маршрут по умолчанию, два половинных, маршрут подсети туннеля и любой добавленный офисный префикс. Физический маршрут по умолчанию может иметь меньшую или большую метрику в зависимости от клиента и профиля, и пока пара /1 существует, эта разница ничего не меняет. Она меняет всё в момент удаления пары, и тогда проявляется устаревший шлюз или неверный интерфейс. Читайте всю таблицу, а не ту одну строку, которую вы собирались изменить.
Выберите одного владельца офисного префикса
Для разделённого туннеля называйте только тот префикс, который должен использовать VPN, и выберите один способ им владеть. Направление маршрута на назначенный адрес туннеля работает до тех пор, пока этот адрес не изменится, а привязка к интерфейсу переживает смену адреса, но ломается, когда индекс переназначается после пересборки профиля. Cmdlet, привязанный к профилю, избегает обеих проблем ценой необходимости в профиле.
route -p add 10.50.0.0 mask 255.255.0.0 172.16.8.1
route -p add 10.50.0.0 mask 255.255.0.0 0.0.0.0 IF 31
Add-VpnConnectionRoute -ConnectionName Office -DestinationPrefix 10.50.0.0/16
Cmdlet привязывает префикс к именованному профилю, поэтому маршрут появляется вместе с соединением и уходит вместе с ним, чего и хочет управляемый ноутбук. Постоянный маршрут переживает перезагрузки и переживает профиль, который его вызвал, и именно так выведенный из эксплуатации VPN оставляет записи на годы. Выберите один метод на префикс и запишите выбор, потому что постоянный маршрут плюс маршрут профиля для одного и того же префикса создают дубликаты, которые при разборе мучительно распутывать. Что бы вы ни выбрали, владение должно быть видно в заявке, а не только на машине.
Владение — это вопрос, на который отвечает этот раздел, а не синтаксис. Два владельца одного префикса — это режим отказа, которого стоит избегать.
Проверяйте по назначению, а не по сайту
Проверьте назначение, которое должно пройти через туннель, а не сайт, сообщающий адрес выхода. Find-NetRoute возвращает выбранный маршрут и адрес источника, поэтому вы видите, победил ли офисный префикс или физический маршрут по умолчанию, и затем открываете саму общую папку.
Find-NetRoute -RemoteIPAddress 10.50.5.20
Get-VpnConnection -Name Office
Сайт с адресом выхода — слабая проверка, потому что DNS, IPv6 и прокси браузера могут отправить этот запрос каждый своим путём. IPv4 и IPv6 также имеют отдельные настройки в одном и том же диалоге, и снятие одного флажка оставляет другое семейство нетронутым, поэтому машина с двойным стеком может вести IPv6 через туннель, пока IPv4 следует разделённому маршруту. Проверьте оба семейства, прежде чем называть профиль разделённым. Если маршрут верен, а служба всё равно не работает, оставшийся слой — фильтрация, а не маршрутизация.
Управляемый клиентом брандмауэр может блокировать офисную подсеть при идеальной таблице маршрутизации. Эта политика принадлежит тому, кто развернул профиль, а не тому, кто редактирует маршруты.