Forzar la resolución de DNS para que ocurra fuera de VPN

Estoy ejecutando Mojave (10.14) y tengo una VPN Cisco AnyConnect a través de la cual se envía el tráfico para las rutas seleccionadas (determinado por el perfil VPN, fuera de mi control).

El enrutamiento de tráfico funciona bien, el problema es que la resolución de DNS se realiza a través de la VPN para nombres de host que no están en la red interna.

La salida de scutil --dnscontiene:

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

Además, contiene:

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)

Eso significa que cuando abro www.apple.com, veo sobre la VPN:

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

Y no quiero que esto suceda. Más bien, quiero que la resolución de DNS ocurra entre mi ISP y yo (o entre yo y 1.1.1.1o 8.8.8.8) y luego, si la resolución falla, consultar con la VPN.

¿Cómo actualizo la resolución para usar Cloudflare/Google primero para DNS, usando la línea de comando en Mac?

Espero estar equivocado con mi respuesta, no puede hacer esto, pero veamos cómo se ve el enrutamiento de su red. No tengo una VPN que permita probar la tunelización dividida, pero ha proporcionado detalles superiores y dado que la configuración de VPN está fuera de su control, es posible que se quede atascado con lo que dicta.
¿Cuál es la razón subyacente por la que quieres hacer esto?
@ThorbjørnRavnAndersen He tenido problemas con el DNS de la VPN que tarda en resolverse, y me gustaría configurar mi red para usar Google/Cloudflare en su lugar, pero la VPN siempre parece tener prioridad, incluso si la ruta no está realmente protegida por la VPN.

Respuestas (3)

Tengo una situación similar en la que tengo que usar una conexión Wi-Fi de portal cautivo de mano dura con un cortafuegos virtual muy espeluznante y de mano dura . No solo husmea en las conexiones seguras, sino que se hace pasar por las direcciones IP del servidor DNS, utilizando DPI (cuando detecta la solicitud).

Lo único que funciona para mí es pasar por encima de la VPN/cortafuegos en lugar de intentar escabullirme, usando dnscrypt-proxy usando solo DNS sobre HTTPS, ya que puede detectar el protocolo dnscrypt. En este momento, no es consciente de DNS-over-HTTPS en absoluto.

Lo implemento usando un LaunchAgent que observa /etc/resolve.conflos cambios, y cuando detecta un cambio, reinicia dnscrypt-proxy y luego ejecuta networksetup -setdnsservers Wi-Fi 127.0.0.1.

Aparte: he estado usando Quad9 por un tiempo y lo prefiero a Google y CloudFlare.

Editar: después de jugar un poco más con esto, me doy cuenta de que (de alguna manera, ni siquiera he descubierto de dónde proviene el tráfico), las direcciones IPv6 se resuelven de alguna manera ::1como un servidor DNS, incluso si no hay otros servidores DNS establecidos. Entonces, probablemente sea mejor simplemente deshabilitar IPv6 si puede.


Edición 2:

Sí, creo que ser capaz de dividir esa ruta podría tener mucho que ver con la implementación de VPN a nivel de sistema más nueva; Creo que el proxy de DNS es probablemente su mejor opción. Podría ser posible eliminarla ipsec0como la ruta predeterminada y luego volver a agregarla para un rango de IP restringido ... pero cada vez que intento esto (con IKEv2, no con AnyConnect, pero asumo que están usando la misma API) simplemente... se detiene.

En cuanto al tráfico residual, ¿quizás sea Rendezvous? sudo killall -HUP mDNSResponder; sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist?

Además, ¿quizás puedas usar una aplicación como Shimo? ¡Está disponible con Setapp! No sé exactamente cómo funciona AnyConnect, pero dice que lo admite y tiene opciones de configuración disponibles que son exactamente lo que está buscando para otros protocolos, incluido IKE, así que... ¿quizás?

Shimo

Bien hecho con la respuesta: súper técnica y prometedora. Para comentarios de ida y vuelta, eche un vistazo a esta sala de chat para esta pregunta específica .

La respuesta corta es que probablemente no puedas hacer este cambio.

Esta es una situación muy típica en la que la configuración administrada no permite una situación de túnel VPN dividido . Literalmente, cuando se conecta a la puerta de enlace VPN, se asegura de que ya no pueda alcanzar ningún destino de red, excepto el DNS y la configuración que se encuentra en el otro extremo de la red donde termina la VPN.

Para arreglar esto, necesitas:

  • cambie la configuración de su VPN para permitir un túnel dividido , posiblemente necesitando que los administradores de red bendigan este cambio / lo hagan efectivo.
  • No involucrar la VPN en absoluto
  • Configure una máquina virtual para que pueda mantener el control de su sistema operativo y solo permita que el sistema operativo invitado se conecte a la VPN
  • convencer al administrador de la red para que cambie el DNS en el otro extremo para satisfacer sus necesidades (secundariamente, una configuración de DNS que tenga antes de conectarse a la VPN, cambiar los reenviadores, etc.)
  • use un cliente diferente o una configuración de cliente para evitar el perfil que ejecuta en Cisco (suponiendo que Cisco no le permita cambiar la configuración) - Forzar la IP del servidor DNS mientras está conectado a VPN

(Esta es una pregunta común que nunca obtiene una respuesta que no sea: no use VPN, pero espero que haya una manera para usted)

Creo que la VPN es actualmente un túnel dividido. Una vez que ocurre la resolución de DNS (por ejemplo, a apple.com) a través de la VPN, el tráfico en sí se envía fuera de la VPN a mi ISP.
El enlace para "cambiar su VPN" tiene pasos para probar que se permitió el túnel dividido de Cisco. ¿Puede hacer ping a una dirección IP local no enrutable en su subred local una vez que se conecta a la VPN? Además, es posible que deba agregar los resultados netstat -nry las líneas sin comentar /etc/resolv.confantes y después de que se establezca la VPN, ya que son las tablas de enrutamiento las que gobiernan principalmente las cosas. @CraigOtis
No creo que /etc/resolv.confse use en estos días en macOS. El archivo contiene:This file is not consulted for DNS hostname resolution, address resolution, or the DNS query routing mechanism used by most processes on this system.
Se actualiza para mostrarme qué cambia CiscoVPN en términos de DNS principal, por lo que lo incluyo en mi resolución de problemas. Tiene razón en que es posible que macOS nunca lea el archivo, pero muestra información útil para mí en 10.14.1 para indicar que VPN ha cambiado el estado de DNS.
Es probable que esta respuesta sea incorrecta, probablemente pueda hacer este cambio con scutil: superuser.com/a/86188
@Neil ¿Qué versión de VPN de Cisco puede realizar este cambio si la configuración del túnel está bloqueada para evitar la VPN dividida? Me encantaría aprender más. Esta pregunta es sobre Cisco AnyConnect cuando la división está deshabilitada explícitamente y no sobre si, en general, puede hacer esto cuando no se aplica.
@bmike No creo que importe. La pregunta era cómo hacer que el sistema operativo use el DNS normal antes de usar el DNS de VPN, y eso se puede hacer editando la configuración de DNS con scutil. Al conectarse, AnyConnect eliminará esta configuración, pero al menos es posible actualizarla manualmente después de cada conexión. La configuración de VPN no puede decirle al sistema operativo cómo puede resolver los nombres de DNS, por lo que debería funcionar una anulación.
@Neil Por favor, muéstrenos cómo: cualquier intento que haga para cambiar rompe la conexión VPN para que pueda tener su propio DNS o puede tener una conexión VPN, no ambos. Tal vez no estoy viendo el uso exacto que invocas, sin embargo...
@bmike Solo estoy especulando, así que suponga que no funciona para mí, entonces. Te dejaré saber si puedo hacerlo funcionar.

Su cliente VPN está registrando su estado de DNS con scutil, y puede usar la misma herramienta para cambiar el DNS a lo que desee.

Para enumerar los estados de DNS actualmente registrados:

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

No sé cómo registrar su propio estado y hacer que anule a los demás, pero puede modificar todos los estados registrados para reflejar su servidor DNS preferido fácilmente:

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

Este código se ejecuta a través de la lista de estados registrados y, para cada uno, lo sobrescribe con uno nuevo que solo contiene el servidor DNS de su elección. También puede agregar dominios de búsqueda u otras opciones.

Puede experimentar scutilejecutándolo en la línea de comandos y escribiendo help.