Я запускаю 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?
У меня похожая ситуация, когда я должен использовать очень неуклюжее портальное соединение 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, но я надеюсь, что для вас есть способ)
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.
scutil
: superuser.com/a/86188scutil
. При подключении AnyConnect сбивает эти настройки, но, по крайней мере, их можно обновлять вручную после каждого подключения. Конфигурация VPN не может сообщить ОС, как она может разрешать DNS-имена, поэтому переопределение должно работать.Ваш 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
.
bmike
Торбьерн Равн Андерсен
Крейг Отис