使用VPN的OS X> 10.6.5 DNS查找顺序


13

连接到我的VPN后,从OS X 10.6.5(从.4版)更新到OS X 10.6.5后,应用程序似乎没有以正确的顺序(根据网络首选项中的服务顺序)查找主机名。

我当前的设置是在AirPort服务之前的Cisco IPSec VPN服务。将自动为VPN连接设置DNS服务器(确定),并且AirPort服务DNS指向我的路由器(192.168.1.1,它指向OpenDNS服务器)。

连接我的VPN时,我希望DNS查找首先通过VPN DNS服务器,但是我的所有应用程序(Firefox,Thunderbird,ssh)似乎都首先使用了AirPort DNS服务器(OpenDNS)。

在更新之前,这工作得很好。

谢谢你的帮助。

** 编辑 **

我遇到了这篇文章,并在接受的答案中运行了命令。似乎没有帮助。

搜索更多之后,我遇到了以下命令:scutil --dns

命令的输出如下。一切看起来都是正确的,除了我认为应该首先使用解析器2,并且在解析器1中有一个搜索域(显然不是foobar.com,而是真正的VPN域)。我认为这是错误(或任何错误)的所在。我没有手动指定它,也没有在AirPort连接的DNS选项卡上。当VPN断开连接时,该搜索域将不存在,解析器#2也应消失了。

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

** 编辑 **

好吧,除非有人能够回答我的问题,否则我已经写了一个脚本来帮助解决以下提到的问题。它应该在连接VPN之后运行,并在断开连接后再次运行(我还没有找到一种自动运行它的方法)。一些注意事项:

  1. 我的帐户以未锁定“网络偏好设置”的管理员身份运行,因此,我不确定此脚本对其他任何方面的公平性。

  2. 您需要在脚本中将vpn_srvc_name设置为您的vpn服务名称。

  3. 我敢肯定,这样做可能更简单,所以请发表评论。

剧本:

#!/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

** 编辑 **

看起来这在Lion中也仍然是一个问题。我正在更新标题并添加标签。

** 编辑 **

显然,Lion还带来了一些无线变化,包括将AirPort服务重命名为Wi-Fi。如果有人通过无线连接连接到其VPN,这可能会导致我提供的解决方法脚本出现问题。Lion(出于某种原因)将名为AirPort的服务保留在引擎盖下。要解决此问题,您需要将Wi-Fi服务重命名为AirPort以外的名称。如果您想保留Wi-Fi名称,则必须先将其重命名为其他名称,然后再将其重命名为Wi-Fi。


当您查看“系统偏好设置”并单击“网络”时,在左侧的VPN连接下,选择“高级”(右下方的核心管理器)。现在,您应该在顶部看到一个DNS选项卡。左侧是DNS的IP,右侧则显示您的域。这些是否正确(指向VPN DNS服务器)?
Everett

是的,它们是正确的。
citrusmoose

set_dns_ips中的行应为networksetup -setdnsservers "$@"。我的Mac Pro具有两个以太网连接(“ Ethernet 1”和“ Ethernet 2”是默认名称),因此必须用引号引起来。编辑:为什么要这样做
克里斯·唐纳利

你说得对,@ chris。我已经更新了脚本。不知道“为什么要这么做”是什么意思。
citrusmoose 2012年

抱歉,@ citrusmoose。只是想说为什么我编辑了评论;我点击了提交,然后意识到我没有说为什么要更改它,也不想只是出于没有充分理由而提倡更改的想法。
克里斯·唐纳利

Answers:


1

就我而言,FQDN请求没有解析到正确的内部地址。相反,他们指向的是外部地址。

我通过IPsec连接到我的Cisco ASA。在网络连接中正确设置顺序后,由于更新到10.6.5,DNS请求不会遵循该顺序。

要解决此问题,我为VPN手动将DNS服务器分配给了机场连接(因为我是无线的)。完成VPN连接后,我将删除手动添加的DNS地址。


是的,这也是我的解决方法(但很烦人)。我很高兴其他人遇到这个问题,因为看来我是唯一的一个。我想其他人可能不会注意到,因为大多数对内部域的查找将失败并退回到正确的DNS服务器。但是,就我而言,由于某种原因,很少有内部域在外部DNS服务器中具有条目。
citrusmoose

有一种比这更好的方法,@Citrusmoose,您是否有一点运气,不用手动,但功能更强大?
MightyE 2011年

不,我还没有遇到任何事情。
citrusmoose

1

要阻止OS X 10.8为您的VPN连接创建默认路由,请打开Internet Connect(在“应用程序”中)。从“连接”菜单中选择“选项”,然后取消选中“通过VPN连接发送所有流量”选项。单击确定,完成。

要在VPN连接的另一端建立到子网的自定义路由,请阅读其余提示...

以root用户身份创建/ etc / ppp / ip-up,并输入以下代码:

#!/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

笔记:

  1. 创建文件后,执行chmod u+x /etc/ppp/ip-up
  2. $ 5变量是您的远程IP地址(您在远程网络上的IP地址)。
  3. 在第一种情况下,将192.168.x条目更改为远程网络的前三个八位位组。在这种情况下,远程IP为192.168.3.1,远程网络为192.168.30.0/24(远程VPN盒进行路由-这样SAMBA可以工作而无需代理ARP)。
  4. 从调试行中取消注释(删除##),以查看该脚本在做什么。输出将被写入/tmp/ip-up-debug.txt文件。完成测试后,请记住将##重新放回去。
  5. 该脚本具有用于三个不同VPN连接的选项。只需将192.168.x条目更改为不同VPN的不同网络地址即可。

这里找到

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.