从 .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 后运行,并在您断开连接后再次运行(我还没有找到自动运行它的方法)。一些注意事项:
我的帐户以管理员身份运行,并且网络偏好设置已解锁,所以我不确定这个脚本在其他情况下会如何表现。
您需要将脚本中的 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。
答案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
笔记:
- 创建文件后,执行
chmod u+x /etc/ppp/ip-up
。 - $5 变量是您的远程 IP 地址(远程网络上的 IP 地址)。
- 在第一个 case 语句中,将 192.168.x 条目更改为远程网络的前三个八位字节。在本例中,远程 IP 为 192.168.3.1,远程网络为 192.168.30.0/24(远程 VPN 盒正在执行路由 - 这样 SAMBA 就可以正常工作而无需代理 ARP)。
- 取消注释(删除 ##)调试行以查看此脚本正在执行的操作。输出将写入 /tmp/ip-up-debug.txt 文件。测试完成后,请记住将 ## 放回原处。
- 此脚本有三种不同的 VPN 连接选项。只需将 192.168.x 条目更改为不同 VPN 的不同网络地址即可。
成立这里