连接到我的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之后运行,并在断开连接后再次运行(我还没有找到一种自动运行它的方法)。一些注意事项:
我的帐户以未锁定“网络偏好设置”的管理员身份运行,因此,我不确定此脚本对其他任何方面的公平性。
您需要在脚本中将vpn_srvc_name设置为您的vpn服务名称。
我敢肯定,这样做可能更简单,所以请发表评论。
剧本:
#!/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。
networksetup -setdnsservers "$@"
。我的Mac Pro具有两个以太网连接(“ Ethernet 1”和“ Ethernet 2”是默认名称),因此必须用引号引起来。编辑:为什么要这样做