Разделённый DNS через OpenVPN: что должен делать домен маршрутизации в каждой операционной системе
Суффикс поиска, домен маршрутизации и IP-маршрут — три разные вещи. Задайте политику для каждой платформы, а затем докажите, какой сервер ответил на запрос.
Каждый запрос разделённого DNS начинается с одной и той же фразы: имена компании идут в DNS компании, всё остальное продолжает работать. Превратить эту фразу в конфигурацию — значит ответить на три вопроса для каждой операционной системы, и ответы в каждой используют разные механизмы. Профили, которые работают на ноутбуке с Linux, часто отказывают в Windows по причинам, не имеющим ничего общего с туннелем. Разница обычно в настройке резолвера, принятой за маршрут.
Сначала назовите политику, затем выберите примитив платформы, который её выражает.
Три настройки, которые легко перепутать
Суффикс поиска расширяет короткое имя: ввод files превращается в files.corp.example, когда резолвер перебирает суффиксы по порядку. Домен маршрутизации выбирает, какой резолвер отвечает на запросы внутри пространства имён. IP-маршрут лишь делает выбранный резолвер доступным. Эти три живут в разных слоях, и замена одного другим даёт конфигурацию, которая выглядит правильной и ничего не решает.
У путаницы есть цена: добавление суффикса поиска отправляет каждое короткое имя на рабочий резолвер, включая имена, принадлежащие другому месту. Выбор домена маршрутизации оставляет несвязанные запросы на локальном резолвере и всё же отправляет *.corp.example через туннель.
Linux: домен только для маршрутизации, а не суффикс поиска
В systemd-resolved домен с тильдой в начале — это домен только для маршрутизации, то есть запросы для этого пространства имён идут к связанному резолверу, не становясь также суффиксом поиска. resolvectl domain tun0 '~corp.example' задаёт это, а resolvectl dns tun0 10.8.0.1 называет сервер. Обе настройки принадлежат интерфейсу, поэтому исчезают вместе с ним. Тильда — та часть, которую люди опускают, и без неё короткие имена начинают разрешаться через рабочий резолвер.
Не устанавливайте тот же домен ещё и как глобальный суффикс поиска. Эти две настройки не избыточны; одна маршрутизирует, а другая переписывает то, что вы ввели.
Windows нужна политика пространства имён, а не суффикс
Windows хранит политику разделённого DNS в Name Resolution Policy Table, а не в DNS-суффиксе адаптера. Правило сопоставляет пространство имён с конкретными серверами: Add-DnsClientNrptRule -Namespace .corp.example -NameServers 10.8.0.1. Установка одного лишь суффикса меняет вид коротких имён; она не направляет запрос другому серверу.
Проверьте действующую политику с помощью Get-DnsClientNrptPolicy после подключения, потому что правило из предыдущего соединения может пережить туннель. Удаляйте правила по имени, когда туннель падает, и держите отображаемое имя стабильным, чтобы очистка попадала в нужную запись.
Один владелец резолвера на платформу
Менеджер рабочего стола, up-скрипт OpenVPN и локальный демон резолвера могут все пытаться записать одну и ту же конфигурацию. Когда они не согласны, побеждает последний писавший, и результат зависит от порядка демонтажа. Выберите один компонент, владеющий состоянием резолвера, позвольте остальным сообщать, а не писать, и проверьте переподключение: политика должна пережить его без дублирования правил. Проверьте и отключение, потому что именно оставшееся состояние заставляет следующее соединение вести себя иначе.
Приложения, которые приносят собственный шифрованный резолвер, полностью игнорируют политику операционной системы. Это свойство приложения, а не дефект туннеля.
Проверяйте результат, а не текст профиля
Разрешите одно имя, которое должно идти через туннель, и одно, которое не должно, на каждой платформе, и подтвердите, какой сервер ответил. resolvectl query host.corp.example и Resolve-DnsName host.corp.example оба сообщают ответивший сервер. Повторите после переподключения. Затем подтвердите, что резолвер туннеля доступен по адресу, который продвигает профиль, потому что правильная политика, указывающая на недоступный сервер, отказывает так же, как отсутствие политики.
Запишите предполагаемое поведение в заметках профиля: какой суффикс маршрутизирует, какой сервер отвечает на него и что происходит со всем остальным. Следующей поддерживаемой платформе эта фраза понадобится больше, чем файл конфигурации.