Я работаю в компании, где — по нескольким странным причинам — у меня следующая ситуация:
- 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 по мере необходимости.
Используйте его только в том случае, если вы точно понимаете, что он делает.
Лучше всего создать новый Location
using, System Preferences > Network
прежде чем начинать экспериментировать с этим скриптом, поскольку это позволит вам отменить любые изменения, переключившись обратно на заведомо исправный Location
.
Что он будет делать:
- Перечислите все сетевые интерфейсы и определите, какой из них подключен к корпоративной сети, а какой — к другой сети, на основе ихШЛЮЗЫ ПО УМОЛЧАНИЮIP-адрес (не адрес, назначенный самому интерфейсу)
- Настройте встроенный
BIND
DNS-сервер для обработки запросов как для корпоративной сети, так и для Интернета и пересылайте их по домену. Например,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») этого было достаточно, чтобы
создайте файл в /etc/resolver (например, /etc/resolver/per-domain-resolver или любое другое имя, которое вам больше нравится)
заполните его последовательностьюдомен,сервер имен, ипорядок_поискадирективы, например
domain mydomain.tld nameserver 10.10.10.128 search_order 1 nameserver 8.8.8.8
Стоит подчеркнуть, что мои испытания стали рабочими решениями, как только они были внедреныдоменипорядок_поискадирективы.