Порядок DNS-резолверов или добавление «эксклюзивных» маршрутов в Mac OS X?

Порядок DNS-резолверов или добавление «эксклюзивных» маршрутов в Mac OS X?

Я работаю в компании, где — по нескольким странным причинам — у меня следующая ситуация:

  • Ethernet: находится в гостевой сети и имеет доступ к Интернету
  • Wi-Fi: находится в корпоративной сети и имеет доступ к интрасети
  • порядок адаптеров устанавливается таким образом, что сначала идет Ethernet
  • route addиспользуется для добавления нужных мне маршрутов интрасети (10.[4/6/1/39].xx и т.д.)

Проблема теперь в том, что некоторые программы не работают, так как они не используют IP, а именованные адреса. Следовательно, scutil --dnsесть преобразователь № 1 с внешними DNS-серверами, а затем следует преобразователь № 2 с DNS-серверами интрасети. (если я отключаю кабель и нахожусь только в Wi-Fi corp, имена разрешаются просто отлично).

Я подумал о двух возможных решениях, но не знаю, как заставить их работать:

  • Несмотря на то, что Wi-Fi является первым адаптером в порядке, я каким-то образом переключаю порядок DNS-преобразователей так, чтобы DNS-сервер интрасети проверялся до DNS-сервера интернета.
  • поместите адаптер Wi-Fi на первое место, а затем найдите команду «исключающего» маршрута, которая не говорит «отправить IP X через en0», а вместо этого «отправить любой IP, не равный X, через en1»

Может ли кто-нибудь мне здесь помочь?

решение1

Похоже, я работаю в одной и той же компании ;-)

По ссылке ниже вы найдете скрипт Ruby, который вы можете адаптировать для решения своих задач.Хеннес описывает как вариант 4), хотя он использует пересылку DNS-запроса вместо просмотров. Это должно быть легко исправить. https://github.com/simonair/pubcode/blob/master/multihome_setup/multihome_setup.rb

Этот скрипт будет использовать sudo по мере необходимости.

Используйте его только в том случае, если вы точно понимаете, что он делает.

Лучше всего создать новый Locationusing, System Preferences > Networkпрежде чем начинать экспериментировать с этим скриптом, поскольку это позволит вам отменить любые изменения, переключившись обратно на заведомо исправный Location.

Что он будет делать:

  • Перечислите все сетевые интерфейсы и определите, какой из них подключен к корпоративной сети, а какой — к другой сети, на основе ихШЛЮЗЫ ПО УМОЛЧАНИЮIP-адрес (не адрес, назначенный самому интерфейсу)
  • Настройте встроенный BINDDNS-сервер для обработки запросов как для корпоративной сети, так и для Интернета и пересылайте их по домену. Например, example.comбудет пересылаться на корпоративные серверы имен, тогда как example.netбудет пересылаться на другие серверы имен.
  • Установить маршрутизацию к списку подсетей через корпоративный интерфейс, остальные через другую сеть
  • При правильной настройке он также может инициировать VPN-подключение.

Вам необходимо адаптировать сценарий под свои нужды.

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

решение2

Я не уверен, что это полный ответ, но размещать его в нескольких комментариях кажется глупостью.

1) Быстрое решение:

Добавьте имена интрасети в файл хоста. (Он находится в/частный/и т.д./хосты). Это работает, если вам нужен доступ только к нескольким серверам, и это относительно легко сделать. Это также кажется мелочью, и если IP-адреса серверов когда-либо изменятся, вам придется вручную обновить файл hosts.

2) Предполагая, что DNS-сервер в интрасети также вращает имена в Интернете, вы можете использовать только этот DNS-сервер. Я считаю это маловероятным, поскольку вы явно упомянули, что гостевая сеть имеет доступ в Интернет, а другая — в интрасеть. (Может быть, если интрасеть имеет доступ в Интернет, но он заблокирован некоторыми правилами брандмауэра, которые не блокируют все. Например, не порт 53).

3) Использование обоих DNS-серверов (что вы и пытаетесь сделать) может не сработать.

У меня нет машины OS/X, чтобы проверить это, но недавно я узнал на собственном горьком опыте, что некоторые операционные системы не запрашивают DNS-серверы по порядку и не переходят на вторичный сервер имен, когда первый выходит из строя. Вместо этого они, похоже, используют перечисленные серверы имен случайным образом.

Результатом этого будет:
(заказ DNS Интернета, DNS интрасети)
Запрос хоста в Интернете -> работает.
Запрос хоста в интрасети -> Не удалось выполнить поиск через DNS-сервер в Интернете, лучше отказаться от дальнейшей попытки.

Я не знаю, так ли это на OS/X, и у меня нет Mac, чтобы проверить это.

4)Локальный сервер имен

(Выделено жирным шрифтом, потому что я считаю это лучшим решением).

OS/X поставляется сСВЯЗЫВАТЬи кажется, что это легковключить егоКлючевое слово, которое вам нужно искать в BIND, — это views.

решение3

У меня была похожая проблема намакосс несколькими физическими и виртуальными сетевыми интерфейсами и необходимостью запрашивать разрешение имен на разных серверах в зависимости от доступности или недоступности этих сетевых интерфейсов.

После некоторых поисков и попыток я нашел наиболее полную информацию в более обширном обсуждении вhttps://rakhesh.com/infrastructure/macos-vpn-doesnt-use-the-vpn-dns. Короче говоря, для того, чтобы определить конкретные решатели иизменение приоритетов системного резолвера macos, для каждой конкретной моей потребности в разрешении (например,«Необходимо запросить частный DNS-сервер 10.10.10.128 для mydomain.tld, когда он доступен, в противном случае — публичный сервер Google 8.8.8.8») этого было достаточно, чтобы

  1. создайте файл в /etc/resolver (например, /etc/resolver/per-domain-resolver или любое другое имя, которое вам больше нравится)

  2. заполните его последовательностьюдомен,сервер имен, ипорядок_поискадирективы, например

    domain mydomain.tld
    nameserver 10.10.10.128
    search_order 1
    nameserver 8.8.8.8
    

Стоит подчеркнуть, что мои испытания стали рабочими решениями, как только они были внедреныдоменипорядок_поискадирективы.

Связанный контент