chnroutes是一个提供国内ip地址路由表的项目,主要是为了在连接openvpn的时候所有国内的地址直接访问,国外的地址才经由vpn转发。但是需要在客户端电脑上进行设置。所以想直接使用openvpn服务器端的push功能,把route直接push到客户端,而不需要在客户端电脑上进行什么很复杂的设置了。
先在客户端的配置文件的最前面添加
max-routes 5000
然后在openvpn服务器端的openvpn.conf文件中加入
client-config-dir /etc/openvpn/route/
然后写一个脚本
#!/bin/bash
dir=~/route
svn checkout http://chnroutes.googlecode.com/svn/trunk/ $dir
cd $dir
python2 $dir/chnroutes.py
cat $dir/routes.txt | sed 's/route/push \"route/' |sed 's/net_gateway 5/net_gateway\"/'> /etc/openvpn/route/route
这个就是从chnroutes的项目svn中下载chnroutes.py脚本,生成路由表,但是这个路由表是客户端的格式,所以要先修改成服务器端的格式,然后放到client-config-dir中。这个目录的所用是当有人登录的时候,如果这个目录中有和common name相同的文件,就运行这个文件中的内容,如果没有match到,就运行DEFAULT这个文件中的内容,如果没有DEFAULT文件就什么都不运行。
但是因为windows客户端添加route的时候得用的时间实在是长的离谱,所以openvpn.conf里keepalive的时间需要长一些,否则route还没添加完就断开连接就无法连上了。linux下的就没问题。
其实除了路由表,dns也能push,比如用
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
这样就能把google的DNS推送到客户端上。
Windows的客户端是不会有问题的。但是linux下需要一些设置。kde的plasmoid不能添加route,权限问题,所以需要直接在terminal中用root权限运行openvpn。但这样push DNS就失效了,所以需要安装openresolv,然后在client.conf中添加
script-security 2
up dns
down dns
在同一个目录下建立名为dns的文件
#!/bin/bash
[ -x /usr/sbin/resolvconf ] || exit 0
case $script_type in
up)
for optionname in ${!foreign_option_*} ; do
option="${!optionname}"
echo $option
part1=$(echo "$option" | cut -d " " -f 1)
if [ "$part1" == "dhcp-option" ] ; then
part2=$(echo "$option" | cut -d " " -f 2)
part3=$(echo "$option" | cut -d " " -f 3)
if [ "$part2" == "DNS" ] ; then
IF_DNS_NAMESERVERS="$IF_DNS_NAMESERVERS $part3"
fi
if [ "$part2" == "DOMAIN" ] ; then
IF_DNS_SEARCH="$part3"
fi
fi
done
R=""
if [ "$IF_DNS_SEARCH" ] ; then
R="${R}search $IF_DNS_SEARCH
"
fi
for NS in $IF_DNS_NAMESERVERS ; do
R="${R}nameserver $NS
"
done
echo -n "$R" | /usr/sbin/resolvconf -a "${dev}.inet"
;;
down)
/usr/sbin/resolvconf -d "${dev}.inet"
;;
esac
原来linux下不能push dns是这原因