Есть две разумные причины вкладывать туннели один в другой на ноутбуке разработчика. Либо корпоративный клиент должен выглядеть так, будто приходит из определённой страны, либо две частные сети должны быть доступны одновременно. В обоих случаях внешний туннель должен нести собственное соединение внутреннего клиента.

Запуск двух клиентов в любом порядке этого не даёт. Это делает маршрутизация.

Сравните два возможных порядка

Выберите внешним уровнем тот туннель, конечная точка которого доступна из публичного интернета. Внутренний уровень — это туннель, сервер которого отвечает только через этот выход. В Windows практическое разделение таково: WireGuard снаружи, корпоративный клиент внутри. Решающий фактор — контроль.

Официальный клиент WireGuard применяет полный файл конфигурации, включая маршруты и DNS. Коммерческие корпоративные клиенты обычно скрывают и то и другое. Если поставить скрытый клиент снаружи, придётся догадываться о пути под ним.

Обратный порядок не невозможен. Просто о нём труднее рассуждать, потому что внешний клиент переписывает маршруты по расписанию, которого вы никогда не видите.

Пусть AllowedIPs называет только корпоративный диапазон

AllowedIPs перечисляет назначения, которые WireGuard направляет в туннель. Для вложения ему нужны только адрес внутреннего сервера и корпоративные префиксы. Всё остальное остаётся в локальной сети, включая принтеры и гипервизор. Это разделённый туннель по замыслу, и он полностью избегает проблемы исключения.

Внешнему уровню с полным туннелем нужно 0.0.0.0/0 минус локальные диапазоны. Формат не может выразить исключение, поэтому дополнение приходится вычислять и вставлять вручную.

[Interface]
PrivateKey = ...
Address = 10.99.4.2/32

[Peer]
PublicKey = ...
Endpoint = 198.51.100.44:51820
AllowedIPs = 198.51.100.44/32, 10.20.0.0/16, 10.21.0.0/16

Когда внутренний клиент не устанавливает свои маршруты, перечислите корпоративные префиксы сами. Префикс, пропущенный в этой строке, — это назначение, которое внешний туннель никогда не несёт. Устаревшая копия списка хуже, чем её отсутствие, потому что она всё ещё выглядит правильной.

Порядок, метрики и второй адаптер

Сначала подключите внешний туннель, затем запустите корпоративный клиент. Тогда его соединение с конечной точкой выходит через WireGuard, а не через локальный шлюз. Дайте корпоративному интерфейсу меньшую метрику, чтобы его префиксы побеждали для адресов, которыми он владеет.

# which interface currently claims the corporate prefix?
Find-NetRoute -RemoteIPAddress 10.20.10.5 | Select-Object -First 1

# prefer the corporate interface for its own prefixes
Set-NetIPInterface -InterfaceAlias 'Corp VPN' -InterfaceMetric 3
Set-NetIPInterface -InterfaceAlias 'wg-personal' -InterfaceMetric 40

wg show interfaces

Метрики — это шаг, который люди пропускают. Без порядка для перекрывающегося префикса побеждает маршрут, установленный последним. Это меняется между загрузками, поэтому проблема выглядит периодической.

Клиенты на базе OpenVPN 2.6 добавляют свою ловушку. Когда адаптер разгрузки канала данных уже занят, второй экземпляр просто отказывается запускаться. Добавление disable-dco в профиль возвращает к более старому пути TAP, и тогда оба работают бок о бок.

Где ломается вложенный путь

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

Ожидайте меньший полезный MTU. Каждый уровень добавляет накладные расходы, поэтому начальная пара около 1420 и 1400 — хорошая отправная точка. Передача, которая зависает на больших пакетах, пока небольшие запросы проходят, — обычный признак. Корпоративная политика — другой предел, потому что клиент, требующий управляемого устройства, может считать вложенный путь нарушением.

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

Похожие статьи