关于我
 

xjpvictor's Blog
小老鼠,上灯台,两只耳朵竖起来

Openvpn服务器推送chnroutes


各种折腾·archlinuxlinuxscriptvpnwindows

本文最后编辑于超过3964天以前,部分内容可能已经失效

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

本文 "Openvpn服务器推送chnroutes" 由 K. Huang 首先发表于 xjpvictor's Blog 并以 CC BY-NC 4.0 许可证发布 © 2012
转载注明引用来源 https://blog.xjpvictor.info/2012/01/openvpn-push-chnroute/


推广:使用 Vultr 搭建属于你自己的博客,每月低至 2.5 美元,全球多数据中心,稳定高速

打赏我

一条评论

  1. 原来linux下不能push dns是这原因

    回复

评论

你的邮箱地址不会被公开。必填项以 * 标出

无意义或不相关评论将被删除

允许使用以下html标签:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

你可以上传文件,粘贴代码或长文至 Drop.it.r

本博客是言论不自由博客,评论只接受询问及赞同,不同观点请出门左转微博/发表于自己的博客。谢谢合作!

评论意味着你 同意 上传部分私人数据,包括邮箱和 IP, 这些数据不会被分享给第三方,不会用于商业用途或再推广用途。

更多相似文章