我有分寸

Mac 下用自定义脚本配置 Tunnelblick 的自定义路由

gnawux macopenvpnscriptscriptstunnelblickVPN

Mac下的 Tunnelblick 是个很好用的 openvpn 管理工具,嗯,这年月谁还没几个 VPN 啊,你懂的。

不过呢,总有一些路由希望不走 VPN,比如内网,又比如某些网站,话说原来是在 ovpn 配置文件里用 route 命令配置路由到 net_gateway 的,比如

route 192.168.0.0 255.255.0.0 net_gateway

不过,如果有多个VPN配置文件,要修改 IP 列表的时候就很麻烦,放在脚本里,集中起来保持同步才是好办法,根据 openvpn 的文档( https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage ),这是可以通过 up/down 或 route-up/route-pre-down 做到的,简单说一下,以 up 为例,配置文件要这么写

up "/path/to/your/up-script optional parameters"

之后,脚本里还会跟进一些 openvpn 送来的参数,比如设备名、mtu、本机和远端 ip 地址等,还有很多环境变量,我们要用的是 route_net_gateway ,这个是开 VPN 之前的缺省网关。

但是,这么放脚本之后,你会几乎无可置疑地发现脚本根本就没有运行,这个脚本并没有被执行,通过日志可以看出,原因在于——Tunnelblick 会用命令行加入它的自定义脚本,覆盖掉我们指定的,这样我们的就白写了。

根据 Tunnelblick 的文档(http://code.google.com/p/tunnelblick/wiki/cUsingScripts ),我们知道,这组脚本是用来获取/设置 DNS 的,只要在配置中选择不设置DNS,就可以执行我们的自定义脚本了。

但是,我们还是需要这组脚本运行的,我们可以替它调用这些脚本的,这样办法就来了——在配置文件里这么写:

up-restart
up "/Users/gnawux/bin/bypass-route.sh up"
down /Users/gnawux/bin/bypass-route.sh
route-pre-down "/Applications/Tunnelblick.app/Contents/Resources/client.route-pre-down.tunnelblick.sh -m -w -d -atADGNWradsgnw"

上面第二、三行是指定到我们的脚本,用一个参数区分up和down就可以了,第四行是 tunnelblick 的 route-pre-down 脚本,up和down脚本我们会通过我们自己的脚本来调用,脚本如下,注意最后调用了 tunnelblick 的脚本

#!/bin/bash

PREFIX=/Users/gnawux
LOGFILE=${PREFIX}/bin/route.log

echo "Cmd run on `date` with arguments: $@; Original Net Gateway: ${route_net_gateway}" > ${LOGFILE}

if [ $# -lt 6 ] ; then
    echo "[WARN] not enough arguments: $@" >> ${LOGFILE}
    exit 1
fi

OPERATION=delete
TB_SCRIPT=/Applications/Tunnelblick.app/Contents/Resources/client.down.tunnelblick.sh
if [ "$1" = "up" ] ; then
    OPERATION=add
    TB_SCRIPT=/Applications/Tunnelblick.app/Contents/Resources/client.up.tunnelblick.sh
fi

while read scope ; do
    echo /sbin/route ${OPERATION} -net ${scope} ${route_net_gateway} >> ${LOGFILE}
    /sbin/route ${OPERATION} -net ${scope} ${route_net_gateway} 2>> ${LOGFILE}
done <<ENDLIST
10.53.0.0/16
58.215.0.0/16
ENDLIST

exec bash ${TB_SCRIPT} -m -w -d -atADGNWradsgnw $@
#route-pre-down /Applications/Tunnelblick.app/Contents/Resources/client.route-pre-down.tunnelblick.sh -m -w -d -atADGNWradsgnw

中间的 IP 网段列表各位就自行选择吧,最后,别忘了给这个文件执行权限就好了。

 

gnawux
me!#$!@#$@#$wangxu!@#$%^&*()_me