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

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

从 .4 更新到 OS X 10.6.5 后,当我的 VPN 连接时,应用程序似乎没有按照正确的顺序(根据网络偏好设置中的服务顺序)查找主机名。

我当前的设置是 Cisco IPSec VPN 服务位于 AirPort 服务之前。DNS 服务器会自动为 VPN 连接设置(这没问题),并且 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。

答案1

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

我通过 IPsec 连接到我的 Cisco ASA。虽然网络连接中顺序设置正确,但自更新到 10.6.5 以来,DNS 请求不遵循顺序。

为了解决这个问题,我手动将 VPN 的 DNS 服务器分配到 Airport 连接中(因为我是无线的)。完成 VPN 连接后,我删除了手动添加的 DNS 地址。

答案2

要阻止 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. 在第一个 case 语句中,将 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 的不同网络地址即可。

成立这里

相关内容