Принудительное разрешение DNS за пределами VPN

Я запускаю Mojave (10.14) и у меня есть Cisco AnyConnect VPN, через которую отправляется трафик для выбранных маршрутов (определяемых профилем VPN, вне моего контроля).

Маршрутизация трафика работает нормально, проблема в том, что разрешение DNS происходит через VPN для имен хостов, которые не находятся во внутренней сети.

Вывод scutil --dnsсодержит:

craig@TBMBP:~$ scutil --dns
DNS configuration

resolver #1
  search domain[0] : a.mycompany.com
  search domain[1] : b.mycompany.com
  search domain[2] : c.mycompany.com
  search domain[3] : d.mycompany.com
  search domain[4] : hsd1.ma.comcast.net <-- (my ISP)
  nameserver[0] : 10.70.yy.yy

Кроме того, он содержит:

DNS configuration (for scoped queries)

resolver #1
  search domain[0] : hsd1.ma.comcast.net
  nameserver[0] : 2601:184:497f:...     <-- (some ipv6 address)
  nameserver[1] : 192.168.1.1
  if_index : 10 (en0)
  flags    : Scoped, Request A records, Request AAAA records
  reach    : 0x00000002 (Reachable)

Это означает, что когда я открываю www.apple.com, я вижу через VPN:

39  2.316879    10.70.xx.xx 10.70.yy.yy DNS 63  Standard query 0xefee A www.apple.com

И я не хочу, чтобы это произошло. Скорее, я хочу, чтобы разрешение DNS происходило между мной и моим интернет-провайдером (или между мной и 1.1.1.1или 8.8.8.8) , а затем , если разрешение не удается, проконсультироваться с VPN.

Как мне обновить резолвер, чтобы сначала использовать Cloudflare/Google для DNS, используя командную строку на Mac?

Надеюсь, я ошибаюсь в своем ответе, вы не можете этого сделать, но давайте посмотрим, как выглядит ваша сетевая маршрутизация. У меня нет VPN, которая позволяет тестировать раздельное туннелирование, но вы предоставили превосходную информацию, и, поскольку конфигурация VPN находится вне вашего контроля, вы можете застрять с тем, что она диктует.
Какова основная причина, по которой вы хотите это сделать?
@ ThorbjørnRavnAndersen У меня были проблемы с VPN DNS, который медленно разрешался, и я хотел бы настроить свою сеть для использования вместо этого Google / Cloudflare, но VPN всегда имеет приоритет, даже если маршрут на самом деле не защищен по VPN.

Ответы (3)

У меня похожая ситуация, когда я должен использовать очень неуклюжее портальное соединение Wi-Fi с очень неуклюжим, очень жутким виртуальным брандмауэром. Он не только отслеживает защищенные соединения, но и имитирует IP-адреса DNS-сервера, используя DPI (при обнаружении запроса).

Единственное, что работает для меня, — это пройти через VPN / брандмауэр, а не пытаться проникнуть под него, используя dnscrypt-proxy , используя только DNS-over-HTTPS, поскольку он может обнаруживать протокол dnscrypt. Прямо сейчас он вообще не знает о DNS-over-HTTPS.

Я реализую его с помощью LaunchAgent, который отслеживает /etc/resolve.confизменения, и когда он обнаруживает изменение, он перезапускает dnscrypt-proxy, а затем запускает networksetup -setdnsservers Wi-Fi 127.0.0.1.

В стороне: я уже давно использую Quad9 и предпочитаю его Google и CloudFlare.

Редактировать: немного поиграв с этим, я заметил, что (каким-то образом я даже не понял, куда идет трафик), адреса IPv6 каким-то образом разрешаются ::1в качестве DNS-сервера, даже если нет установлены другие DNS-сервера. Так что, возможно, лучше просто отключить IPv6, если это возможно.


Редактировать 2:

Да, я думаю, что возможность разделить этот маршрут может быть слишком много общего с более новой реализацией VPN на системном уровне; Я думаю, что DNS-прокси, вероятно, ваш лучший выбор. Возможно, можно удалить ipsec0маршрут по умолчанию, а затем добавить его обратно для ограниченного диапазона IP-адресов ... но каждый раз, когда я пытаюсь это сделать (с IKEv2, а не с AnyConnect, но я предполагаю, что они используют один и тот же API), это просто... останавливается.

Что касается остаточного трафика, может быть, это Rendezvous? sudo killall -HUP mDNSResponder; sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist?

Кроме того, возможно, вы сможете использовать такое приложение, как Shimo? Это доступно в Setapp! Я не знаю точно, как работает AnyConnect, но он говорит, что поддерживает его, и у него есть доступные параметры конфигурации, которые именно то, что вы ищете для других протоколов, включая IKE, так что... может быть?

Шимо

Молодцы с ответом - супертехническим и многообещающим. Для комментариев туда и обратно - загляните в этот чат для этого конкретного вопроса .

Короткий ответ: вы, скорее всего, не сможете внести это изменение.

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

Чтобы исправить это, вам необходимо:

  • измените конфигурацию VPN, чтобы разрешить разделенный туннель - возможно, вам понадобятся сетевые администраторы, чтобы благословить это изменение / сделать его эффективным.
  • Не использовать VPN вообще
  • Настройте виртуальную машину, чтобы вы могли контролировать свою ОС и разрешать только гостевой ОС подключаться к VPN.
  • убедить сетевого администратора изменить DNS на другом конце в соответствии с вашими потребностями (вторичная настройка DNS, которая у вас есть перед подключением к VPN, изменением серверов пересылки и т. д.)
  • используйте другой клиент или настройку клиента, чтобы избежать профиля, который вы запускаете в Cisco (при условии, что cisco не позволит вам изменить конфигурацию) - принудительно указать IP-адрес DNS-сервера при подключении к VPN

(это распространенный вопрос, на который никогда не будет ответа, кроме как - не используйте VPN, но я надеюсь, что для вас есть способ)

Я считаю, что VPN в настоящее время является разделенным туннелем. Как только происходит разрешение DNS (скажем, для apple.com) через VPN, сам трафик затем отправляется за пределы VPN моему провайдеру.
Ссылка «изменить VPN» содержит шаги для проверки того, разрешено ли раздельное туннелирование Cisco. Можете ли вы пропинговать локальный немаршрутизируемый IP-адрес в вашей локальной подсети после подключения к VPN? Кроме того, вам может потребоваться добавить результаты netstat -nrи незакомментированные строки /etc/resolv.confдо и после установки VPN, поскольку в первую очередь это регулируют таблицы маршрутизации. @КрейгОтис
Я не думаю , что /etc/resolv.confв наши дни он используется в macOS. Файл содержит:This file is not consulted for DNS hostname resolution, address resolution, or the DNS query routing mechanism used by most processes on this system.
Он обновляется, чтобы показать мне изменения CiscoVPN с точки зрения основного DNS, поэтому я включаю его в поиск и устранение неполадок. Вы правы в том, что файл может никогда не быть прочитан macOS, но он показывает полезную информацию для меня на 10.14.1, чтобы указать, что VPN изменил состояние DNS.
Этот ответ, вероятно, неверен, вы, вероятно, можете внести это изменение с помощью scutil: superuser.com/a/86188
@Neil В какой версии Cisco VPN вы можете внести это изменение, если настройка туннеля заблокирована для предотвращения разделения VPN? Я хотел бы узнать больше. Этот вопрос касается Cisco AnyConnect, когда разделение явно отключено, а не о том, можно ли вообще это сделать, когда оно не применяется.
@bmike Я не думаю, что это имеет значение. Вопрос заключался в том, как заставить ОС использовать обычный DNS перед использованием VPN DNS, и это можно сделать, отредактировав конфигурацию DNS с помощью scutil. При подключении AnyConnect сбивает эти настройки, но, по крайней мере, их можно обновлять вручную после каждого подключения. Конфигурация VPN не может сообщить ОС, как она может разрешать DNS-имена, поэтому переопределение должно работать.
@Neil Пожалуйста, покажите нам, как - любая моя попытка изменить разрывает VPN-соединение, поэтому вы можете иметь свой собственный DNS или VPN-соединение, но не то и другое одновременно. Возможно, я не вижу точного использования, которое вы вызываете, хотя...
@bmike Я просто размышляю, так что предположим, что это не сработает для меня. Я дам вам знать, если я могу заставить его работать.

Ваш VPN-клиент регистрирует свое состояние DNS с помощью scutil, и вы можете использовать тот же инструмент, чтобы изменить DNS на то, что вам нужно.

Чтобы просмотреть зарегистрированные в настоящее время состояния DNS:

scutil <<< list | awk '{ print $4 }' | egrep '^State:/.+/DNS$'

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

mydns=1.1.1.1
states=$(scutil <<< list | awk '{ print $4 }' | egrep '^State:.+/DNS$')
for state in $states ; do
  printf "d.init\nd.add ServerAddresses * ${mydns}\nset ${state}\nquit\n" | scutil
done

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

Вы можете поэкспериментировать scutil, запустив его в командной строке и набрав help.