Answers:
这里的问题是两个VPN连接配置文件都在一个10网络中,正式附带一个/8
aka 255.0.0.0
aka 0xff000000
网络掩码。因此,当同时建立两个VPN连接时,最终只能在10个网络的路由表中使用一个目标。并且该路由条目将所有10.xxx流量路由到第一个建立的ppp连接,但第二个ppp连接中的本地和远程IP地址除外。
$ netstat -nr -f inet
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 192.168.0.1 UGSc 10 0 en0
default 10.0.1.1 UGScI 0 0 ppp0
default 10.0.0.1 UGScI 0 0 ppp1
10 ppp0 USc 1 0 ppp0
10.0.0.1 10.0.0.12 UHr 2 0 ppp1
10.0.1.1 10.0.1.200 UHr 1 0 ppp0
修复方法是使用所需条目手动扩展路由表。无需删除10条目,只需添加新的路由条目。只要新添加的路由条目寻址较小的子网,该条目就会具有优先权。请将其读作:子网的/X
编号越大。例如/24
,然后更高,/8
因此10/24
条目将优先于10/8
路由条目。建立第二个VPN连接后,基本上添加一个新的路由条目,如:$ sudo /sbin/route -n add -net 10.0.2.0/24 -interface ppp1
这很麻烦,并且在建立辅助VPN连接后必须手动输入路由时会引入错误。幸运的是,ppp守护进程内置了一个解决方案if-up
,正如您可以阅读的那样$ man pppd
。每次建立使用IPv4寻址的ppp(VPN)连接时,/etc/ppp/if-up
都会调用script(),您可以在其中执行自定义规则/命令(即挂钩)。
下面的脚本被广泛评论,应该是自我解释的。
您的Mac可能没有此脚本($ ls /etc/ppp
)。在这种情况下,$ sudo touch /etc/ppp/ip-up
使用e x ecutable权限($ sudo chmod +x /etc/ppp/ip-up
)创建it ()。
#!/bin/sh
#
# This script is run by the pppd after the link is established.
# It should be used to add routes, set IP address, etc.
#
# Tested with Mavericks (Mac OS X 10.9)
#
# This script is called with the following arguments:
# Arg Name Example
# $0 Script full location /etc/ppp/ip-up
# $1 Interface name ppp0
# $2 TTY device <blank>
# $3 Speed 0
# $4 Local IP address 10.0.0.200
# $5 Remote IP address 10.0.0.1
# $6 LAN gateway 192.168.0.1
# source for $1-$6 is $ man -P 'less -p " /etc/ppp/ip-up"' pppd
# ppp.log for non english systems do still have an english timestamp
export LC_TIME="C";
# Note: there is no static assignment for ppp0 to PPTP and ppp1 to L2TP
# therefore $1 isn't useful to differentiate VPN networks
# To debug, uncomment the line below
#echo "$(date +%c) : \$5=$5" >> /var/log/ppp.log
# Add your routing table corrections here
# note: 2>&1 will redirect errors to the standard output
case "$5" in
10.0.0.1) OUT=$(exec /sbin/route -n add -net 10.0.0.0/24 -interface "$1" 2>&1) ;;
10.0.1.1) OUT=$(exec /sbin/route -n add -net 10.0.1.0/24 -interface "$1" 2>&1) ;;
esac
# If standard output is not empty, log it prepended by a timestamp
[ ! -z "$OUT" ] && echo "$(date +%c) : $OUT" >>/var/log/ppp.log
# There is automatic route removal on ppp disconnect.
# So no need to manually remove the above route(s) in /etc/ppp/ip-down
感谢来自jalbrecht2000的想法http://hints.macworld.com/article.php?story=20030906232648318