OS X> 10.6.5 Orden de búsqueda de DNS con VPN

13

Después de actualizar a OS X 10.6.5 (desde .4), las aplicaciones no parecen buscar nombres de host en el orden correcto (de acuerdo con el orden de servicio en las Preferencias de red) cuando mi VPN está conectada.

Mi configuración actual es un servicio VPN IPSec de Cisco frente a un servicio AirPort. Los servidores DNS se configuran automáticamente para la conexión VPN (lo cual está bien), y el servicio AirPort DNS apunta a mi enrutador (192.168.1.1, que apunta a los servidores OpenDNS).

Cuando mi VPN está conectada, me gustaría que las búsquedas de DNS pasen primero por los servidores DNS de VPN, pero todas mis aplicaciones (Firefox, Thunderbird, ssh) parecen estar usando primero mi servidor DNS AirPort (OpenDNS).

Esto funcionaba bien antes de la actualización.

Gracias por cualquier ayuda.

** editar **

Encontré esta publicación y ejecuté los comandos en la respuesta aceptada. Sin embargo, no pareció ayudar.

Después de buscar un poco más, me encontré con este comando: scutil --dns

El resultado del comando está debajo. Todo parece correcto, excepto que creo que el resolutor # 2 debería ser lo primero, y hay un dominio de búsqueda en el resolutor # 1 (obviamente no es foobar.com, sino el dominio VPN real). Creo que esto es donde se encuentra el error (o lo que sea). No lo especifiqué manualmente, y no está en la pestaña DNS para mi conexión AirPort. Cuando se desconecta la VPN, ese dominio de búsqueda no está allí, y el resolutor # 2 desaparece, como debería ser.

resolver #1
  search domain[0] : foobar.com
  nameserver[0] : 192.168.1.1
  order   : 200000

resolver #2
  domain : foobar.com
  nameserver[0] : 172.30.50.100
  nameserver[1] : 172.30.50.80
  order   : 100200

resolver #3
  domain : local
  options : mdns
  timeout : 2
  order   : 300000

resolver #4
  domain : 254.169.in-addr.arpa
  options : mdns
  timeout : 2
  order   : 300200

resolver #5
  domain : 8.e.f.ip6.arpa
  options : mdns
  timeout : 2
  order   : 300400

resolver #6
  domain : 9.e.f.ip6.arpa
  options : mdns
  timeout : 2
  order   : 300600

resolver #7
  domain : a.e.f.ip6.arpa
  options : mdns
  timeout : 2
  order   : 300800

resolver #8
  domain : b.e.f.ip6.arpa
  options : mdns
  timeout : 2
  order   : 301000

** editar **

Bueno, hasta que alguien pueda responder mi pregunta, he escrito un script para ayudar con la solución mencionada a continuación. Debe ejecutarse después de haber conectado su VPN, y volver a ejecutarse después de desconectarse (no he encontrado una manera de ejecutarlo automáticamente). Algunas notas

  1. Mi cuenta se ejecuta como administrador con las preferencias de red desbloqueadas, por lo que no estoy seguro de cómo este script sería justo en otra cosa que no sea.

  2. Debe establecer vpn_srvc_name en el script para su, lo adivinó, nombre de servicio vpn.

  3. Estoy seguro de que probablemente haya una manera más fácil de hacerlo, así que siéntase libre de publicar sus comentarios.

La secuencia de comandos:

#!/bin/bash

function get_pri_srvc_id ()
{
  cat <<EOF | scutil | \
    grep 'PrimaryService' | \
    awk -F': ' '{print $2}'
show State:/Network/Global/IPv4
EOF
}

function get_srvc_name ()
{
  cat <<EOF | scutil | \
    grep 'UserDefinedName' | \
    awk -F': ' '{print $2}'
show Setup:/Network/Service/$1
EOF
}

function get_srvc_ids ()
{
  cat <<EOF | scutil | \
    sed -nEe '
/ServiceOrder/ {
  :ids
  n
  /[0-9]+ :/ {
    s/ *[0-9]+ : ([0-9A-Z-]+) */\1/p
    b ids
  }
}'
show Setup:/Network/Global/IPv4
EOF
}

function get_srvc_id_by_name ()
{
  local srvc_ids=$(get_srvc_ids)

  for srvc_id in $srvc_ids
  do
    local srvc_name=$(get_srvc_name "$srvc_id")
    if [[ "$srvc_name" == "$1" ]]
    then
      echo $srvc_id
      return
    fi
  done
}

function get_dns_ips ()
{
  local srvc_id=$(get_srvc_id_by_name "$1")

  cat <<EOF | scutil | \
    sed -nEe '
/ServerAddresses/ {
  :ips
  n
  /[0-9]+ :/ {
    s/ *[0-9]+ : ([0-9.]+) */\1/p
    b ips
  }
}'
show $2:/Network/Service/$srvc_id/DNS
EOF
}

function set_dns_ips ()
{
  networksetup -setdnsservers "$@"
}

vpn_srvc_name='NAME OF VPN SERVICE'
ip_file='/tmp/setup_dns_ips'

pri_srvc_id=$(get_pri_srvc_id)
pri_srvc_name=$(get_srvc_name "$pri_srvc_id")

if [[ ! -e "$ip_file" ]]
then
  setup_dns_ips=$(get_dns_ips "$pri_srvc_name" "Setup")
  state_dns_ips=$(get_dns_ips "$pri_srvc_name" "State")
  vpn_ips=$(get_dns_ips "$vpn_srvc_name" "State")

  set_dns_ips "$pri_srvc_name" $vpn_ips $setup_dns_ips $state_dns_ips

  if [[ -z "$setup_dns_ips" ]]
  then
    setup_dns_ips="Empty"
  fi

  echo $setup_dns_ips >$ip_file
else
  setup_dns_ips=$(cat $ip_file)

  set_dns_ips "$pri_srvc_name" $setup_dns_ips

  rm $ip_file
fi

** editar **

Parece que esto sigue siendo un problema en Lion también. Estoy actualizando el título y agregando una etiqueta.

** editar **

Aparentemente, Lion también trajo algunos cambios inalámbricos, incluido el cambio de nombre del servicio AirPort a Wi-Fi. Esto puede causar problemas con el script de solución que proporcioné si uno se conecta a su VPN a través de una conexión inalámbrica. Lion (por alguna razón) mantiene el servicio llamado AirPort debajo del capó. Para solucionarlo, debe cambiar el nombre de su servicio Wi-Fi a otro que no sea AirPort. Si desea mantener el nombre de Wi-Fi, primero debe cambiarle el nombre a algo diferente y luego cambiarlo a Wi-Fi.

cítricos
fuente
Cuando busque en Preferencias del sistema y haga clic en redes, debajo de la conexión VPN en el lado izquierdo, seleccione avanzado (núcleo central inferior derecho). Ahora debería ver una pestaña DNS en la parte superior. A la izquierda están las IP para el DNS, y la derecha muestra su dominio. ¿Son correctos (apuntando al servidor DNS VPN)?
Everett
Sí, ellos son correctos.
citrusmoose
La línea en set_dns_ips debería ser networksetup -setdnsservers "$@". Mi Mac Pro tiene dos conexiones Ethernet ("Ethernet 1" y "Ethernet 2" son los nombres predeterminados), por lo que deben indicarse entre comillas. EDITAR: por qué hacer esto
Chris R. Donnelly
Tienes razón, @chris. He actualizado el guión. No estoy seguro de lo que quieres decir con "por qué hacer esto".
citrusmoose
Lo siento, @citrusmoose. Solo estaba tratando de decir por qué edité el comentario; Presioné enviar y luego me di cuenta de que no dije por qué cambiar eso y no quería decir que solo abogaba por el cambio sin una buena razón.
Chris R. Donnelly

Respuestas:

1

En mi caso, las solicitudes de FQDN no se resolvían en la dirección interna correcta. En cambio, apuntaban a la dirección externa.

Me conecto a mi Cisco ASA a través de IPsec. Si bien el pedido está configurado correctamente en la conexión de red, las solicitudes de DNS no siguen el pedido desde la actualización a 10.6.5.

Para solucionarlo, asigné manualmente el servidor DNS para mi VPN a la conexión del aeropuerto (ya que soy inalámbrico). Una vez que haya terminado con la conexión VPN, elimino la dirección DNS agregada manualmente.

KevinTM
fuente
Sí, esta es mi solución también (pero muy molesta). Me alegra que alguien más esté teniendo este problema, ya que parece que fui el único. Supongo que otros podrían no darse cuenta ya que la mayoría de las búsquedas de dominios internos fallarán y recurrirán a los servidores DNS correctos. Sin embargo, en mi caso, hay pocos dominios internos que (por alguna razón) tienen entradas en servidores DNS externos.
citrusmoose
Tiene que haber un mejor enfoque que este, @Citrusmoose, ¿has tenido suerte con algo menos manual y más robusto?
MightyE
No, todavía no he encontrado nada.
citrusmoose
1

Para evitar que OS X 10.8 cree una ruta predeterminada a su conexión VPN, abra Internet Connect (en Aplicaciones). Elija Opciones en el menú Conectar, luego desmarque la opción "Enviar todo el tráfico a través de la conexión VPN". Haga clic en Aceptar y listo.

Para hacer una ruta personalizada a la subred en el otro lado de la conexión VPN, lea el resto de la sugerencia ...

Como root, cree / etc / ppp / ip-up e introduzca el siguiente código:

#!/bin/sh
# When the ppp link comes up, this script is called with the following
# parameters
#       $1      the interface name used by pppd (e.g. ppp3)
#       $2      the tty device name
#       $3      the tty device speed
#       $4      the local IP address for the interface
#       $5      the remote IP address
#       $6      the parameter specified by the 'ipparam' option to pppd

DEBUGFILE=/tmp/ip-up-debug.txt
## echo "1:$1 2:$2 3:$3 4:$4 5:$5 6:$6" > $DEBUGFILE
NET=`echo $5 | cut -d. -f1,2,3`
## echo $NET >> $DEBUGFILE

case $NET in 192.168.3)
     ## echo "CASE1" >> $DEBUGFILE
     RESULT=`/sbin/route add -net 192.168.30.0 $5 255.255.255.0`
     ##echo $RESULT >> $DEBUGFILE
     ;;
     192.168.2)
     ## echo "CASE2" >> $DEBUGFILE
     RESULT=`/sbin/route add -net 192.168.20.0 netmask 255.255.255.0 gw $5`
     ## echo $RESULT >> $DEBUGFILE
     ;;
     192.168.1)
     ## echo "CASE3" >> $DEBUGFILE
     RESULT=`/sbin/route add -net 192.168.10.0 netmask 255.255.255.0 gw $5`
     ## echo $RESULT >> $DEBUGFILE
     ;;
     *)
     ## echo "No match" >> $DEBUGFILE
     ;;
esac

Notas:

  1. Una vez que cree el archivo, haga un chmod u+x /etc/ppp/ip-up.
  2. La variable de $ 5 es su dirección IP remota (su dirección IP en la red remota).
  3. En la primera declaración de caso, cambie la entrada 192.168.x a los primeros tres octetos de su red remota. En este caso, la IP remota es 192.168.3.1 y la red remota es 192.168.30.0/24 (la caja VPN remota está haciendo el enrutamiento; esto es para que SAMBA funcione sin necesidad de proxy ARP).
  4. Descomente (elimine los ## 's) de las líneas de depuración para ver qué está haciendo este script. La salida se escribirá en el archivo /tmp/ip-up-debug.txt. Recuerde volver a colocar los ## cuando termine la prueba.
  5. Este script tiene opciones para tres conexiones VPN diferentes. Simplemente cambie las entradas 192.168.x a las diferentes direcciones de red de sus diferentes VPN.

Encontrado aquí

Antonio
fuente