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 --dns
contiene:
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.1
o 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?
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.conf
los 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 ::1
como 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 ipsec0
como 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?
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:
(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)
netstat -nr
y las líneas sin comentar /etc/resolv.conf
antes y después de que se establezca la VPN, ya que son las tablas de enrutamiento las que gobiernan principalmente las cosas. @CraigOtis/etc/resolv.conf
se 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.
scutil
: superuser.com/a/86188scutil
. 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.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 scutil
ejecutándolo en la línea de comandos y escribiendo help
.
bmike
Thorbjorn Ravn Andersen
craig otis