From c55b2a5a0a889204c04c4b60dc0d891a79fb592f Mon Sep 17 00:00:00 2001 From: shendongming Date: Tue, 5 Aug 2014 09:42:28 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E8=A7=A3=E5=86=B3=20mac=2010.9=20=E4=B8=8B?= =?UTF-8?q?=20=E7=94=9F=E6=88=90=E7=9A=84=20ip-up=20=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E4=B8=8D=E8=83=BD=E8=BF=90=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OLDGW=`netstat -nr | grep '^default' | grep -v 'ppp' | sed 's/default *\\([0-9\.]*\\) .*/\\1/' | awk '{if($1){print $1}}'` 去掉 oldgw 前面多余的空行 --- chnroutes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chnroutes.py b/chnroutes.py index 9c235a2..06bc4e5 100755 --- a/chnroutes.py +++ b/chnroutes.py @@ -70,7 +70,7 @@ def generate_mac(metric): #!/bin/sh export PATH="/bin:/sbin:/usr/sbin:/usr/bin" - OLDGW=`netstat -nr | grep '^default' | grep -v 'ppp' | sed 's/default *\\([0-9\.]*\\) .*/\\1/'` + OLDGW=`netstat -nr | grep '^default' | grep -v 'ppp' | sed 's/default *\\([0-9\.]*\\) .*/\\1/' | awk '{if($1){print $1}}'` if [ ! -e /tmp/pptp_oldgw ]; then echo "${OLDGW}" > /tmp/pptp_oldgw From 6c9a84ee03c536a007e3598de9021a62b3ed9068 Mon Sep 17 00:00:00 2001 From: tranch Date: Sun, 15 Mar 2015 02:20:07 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20README=20=E8=AF=B4?= =?UTF-8?q?=E6=98=8E=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将说明文档从 Google Code 转移了过来。 --- README.md | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..752c3b1 --- /dev/null +++ b/README.md @@ -0,0 +1,87 @@ +## 介绍 + +这几个脚本主要利用来自 http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest 的数据生成路由命令脚本, 让vpn客户端在进行连接的时候自动执行. 通过这些路由脚本, 可以让用户在使用vpn作为默认网络网关的时候, 不使用vpn进行对中国国内ip的访问, 从而减轻vpn的负担, 和增加访问国内网站的速度. + +## 基本约定 + +在使用这些脚本之前, 请确保你在自己的电脑上已经成功配置好一个vpn连接(pptp 或者 openvpn), 并且让之以默认网络网关的方式运行, 这通常也是默认配置, 即vpn接入之后所有网络流量都通过vpn进行. + +## OpenVPN + +使用此法之前, 请确认openvpn版本是否为 v2.1 或者以上, 如果不是请参看下方不同系统关于openvpn部分的描述 + +### 客户端设置 + +本方法适用于使用openvpn v2.1或更高版本的用户. 因为openvpn v2.1比之前版本增加了一个名为max-routes的新参数, 通过设置该参数, 我们可以在配置文件里(服务端, 客户端)直接添加超过100条以上的路由信息. 具体设置步骤如下: + +1. 下载 chnroutes.py 文件 + 在命令行里执行 python chnroutes.py, 这将生成一个名为 routes.txt 的文本文件. 对于不想安装python的用户, 可以直接从项目下来列表里下载该文件. 它将会每月更新一次. +2. 使用你喜欢的文本编辑器打开上述文件, 并把内容复制粘贴到openvpn配置文件的末尾 +3. 同时在openvpn配置文件的头部添加一句 max-routes num, 其中num是一个不小于文件routes.txt的行数的数字, 实际上因为还有一些服务器端push过来的路由信息, 所以保险起见可以用 routes.txt的行数加上50, 比如目前得到的routes.txt的行数是940, 你可以把数字设置为1000: max-routes 1000 +4. 修改完之后, 重新进行openvpn连接, 你可以用之前描述过的方法进行测试是否成功 + +以上方法在Mac OSX, Linux 和 Windows上测试通过. 但需要注意的是, 这里用到一个net_gateway的变量表示未连接openvpn前的网关地址, 但openvpn的文档里有说明这个不是所有系统都支持的, 如果发生这个情况, 可以修改一下生成脚本, 把net_gateway修改为你的局域网的网关地址. 对于windows 7 和 vista, OpenVPN的windows客户端可能需要设置Windows XP兼容模式才能使用, 安装文件要在属性选择中的兼容性选择Windows XP和以管理员的身份运行,安装好的运行文件也同样选择这两个选项。如果还是不能连接到VPN的网络,可以尝试在配置文件中加入: + +``` +route-method exe +route-delay 2 +``` + +### 注意事项 + +* 因为这些ip数据不是固定不变的, 尽管变化不大, 但还是建议每隔两三个月更新一次 +* 使用此法之后, 可能会导致google music无法访问, 这个其实是因为连上vpn之后, 使用的dns也是国外的, 国外dns对google.cn 解析出来的是国外的ip, 所以一个简单的解决方法是修改本机的hosts文件, 把国内dns解析出来的google.cn的地址写上去: 203.208.39.99 www.google.cn google.cn + +## PPTP + +### Mac OSX + +* 下载 chnroutes.py +* 从终端进入下载目录, 执行 `python chnroutes.py -p mac`, 执行完毕之后同一目录下将生成两个新文件'ip-up'和'ip-down' +* 把这两个文件copy到 `/etc/ppp` 目录, 并使用 `sudo chmod a+x ip-up ip-down` 命令把它们设置为可执行 +* 设置完毕, 重新连接vpn. 测试步骤同上. + +### Linux + +* 下载 chnroutes.py +* 从终端进入下载目录, 执行 `python chnroutes.py -p linux`, 执行完毕之后同一目录下将生成两个新文件'ip-pre-up'和'ip-down'. +* 把 `ip-pre-up` 拷贝到 `/etc/ppp` 目录, `ip-down` 拷贝到 `/etc/ppp/ip-down.d` 目录. 测试步骤同上. + +### Windows + +* 下载 chnroutes.py +* 从终端进入下载目录, 执行 `python chnroutes.py -p win`, 执行之后会生成vpnup.bat和vpndown.bat两个文件. + +由于windows上的pptp不支持拨号脚本, 所以也只能在进行拨号之前手动执行vpnup.bat文件以设置路由表. 而在断开vpn之后, 如果你觉得有必要, 可以运行vpndown.bat把这些路由信息给清理掉. + +如果机器上没有安装python, 可以直接从下载页面上下载已经预生成的bat文件. + +### Android + +由于没在android上进行过测试, 无法确定上文描述的openvpn v2.1的使用方法是否也在android手机上适用, 所以保留以下内容 + +#### openvpn + + +* 下载 chnroutes.py +* 从终端进入下载目录, 执行 `python chnroutes.py -p linux`, 这将成 + 'vpnup.sh'和'vpndown.sh'两个文件. +* 把步骤2生成的两个文件拷贝到 android 的 /sdcard/openvpn/目录下, 然后修改openvpn配置文件, + 在文件中加上以上三句: + + ``` + script-security 2 + up "/system/bin/sh /sdcard/openvpn/vpnup.sh" + down "/system/bin/sh /sdcard/openvpn/vpndown.sh" + ``` + + 注意自行修改其中的路径以符合你的android rom的实际路径 + +另外, 这里假定了你的android已经安装过busybox, 否则请先安装busybox再进行以上操作, 还需要知道的是, 这个脚本在手机上执行会花费比较长的时间, 如非必要, 就不要用了. 也许采用非redirect-gateway方式, 然后在ovpn配置文件里添加几条需要路由的ip段是比较快捷方便的做法. +基于Linux的第三方系统的路由器 + +一些基于Linux系统的第三方路由器系统如: OpenWRT, DD-WRT, Tomato 都带有VPN(PPTP/Openvpn)客户端的, 也就是说, 我们只需要在路由器进行VPN拨号, 并利用本项目提供的路由表脚本就可以把VPN针对性翻墙扩展到整个局域网. 当然, 使用这个方式也是会带来副作用, 即局域网的任何机器都不适合使用Emule或者BT等P2P下载软件. 但对于那些不使用P2P, 希望在路由器上设置针对性翻墙的用户, 这方法十分有用, 因为只需要一个VPN帐号, 局域网内的所有机器, 包括使用wifi的手机都能自动翻墙. 相信配置方式请参考: Autoddvpn 项目. + +## 信息反馈 + +本项目的脚本都是在使用路由器进行拨号的情况下测试通过的, 如果在其它拨号方式下, 脚本不能运作, 请添加一个新的issue. 另外, 在配合openvpn使用的时候, 可能会出现一种情况是因为网络质量不好, openvpn非主动断开, 这时候vpndown脚本也会被自动调用, 但重新连上之后, 可能会找不到默认的路由而添加失败, 这时候你可以通过停止openvpn重连, 并手动设置好原来的默认路由再重新进行openvpn拨号. \ No newline at end of file From d30cffc9cc5344d7137b0b61000238ac1d7fc52d Mon Sep 17 00:00:00 2001 From: Mingye Wang Date: Sun, 25 Oct 2015 00:28:19 -0400 Subject: [PATCH 3/5] Now you can use your favorite script without bash Also used `printf` to avoid `echo` mess --- chnroutes.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/chnroutes.py b/chnroutes.py index 46e3cce..1e431a6 100755 --- a/chnroutes.py +++ b/chnroutes.py @@ -22,26 +22,26 @@ def generate_ovpn(metric): def generate_linux(metric): results = fetch_ip_data() upscript_header=textwrap.dedent("""\ - #!/bin/bash + #!/bin/sh export PATH="/bin:/sbin:/usr/sbin:/usr/bin" - OLDGW=`ip route show | grep '^default' | sed -e 's/default via \\([^ ]*\\).*/\\1/'` + OLDGW=$(ip route show | grep '^default' | sed -e 's/default via \\([^ ]*\\).*/\\1/') - if [ $OLDGW == '' ]; then + if [ "$OLDGW" == '' ]; then exit 0 fi if [ ! -e /tmp/vpn_oldgw ]; then - echo $OLDGW > /tmp/vpn_oldgw + printf '%s\n' "$OLDGW" > /tmp/vpn_oldgw fi """) downscript_header=textwrap.dedent("""\ - #!/bin/bash + #!/bin/sh export PATH="/bin:/sbin:/usr/sbin:/usr/bin" - OLDGW=`cat /tmp/vpn_oldgw` + OLDGW=$(cat /tmp/vpn_oldgw) """) @@ -73,7 +73,7 @@ def generate_mac(metric): OLDGW=`netstat -nr | grep '^default' | grep -v 'ppp' | sed 's/default *\\([0-9\.]*\\) .*/\\1/'` if [ ! -e /tmp/pptp_oldgw ]; then - echo "${OLDGW}" > /tmp/pptp_oldgw + printf '%s\n' "$OLDGW" > /tmp/pptp_oldgw fi dscacheutil -flushcache From add659efa38229e6c0f0a2f7352d32899344a152 Mon Sep 17 00:00:00 2001 From: Mingye Wang Date: Sun, 25 Oct 2015 01:49:56 -0400 Subject: [PATCH 4/5] Remove busybox dependency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 配上一点测试,busybox 就是可选依赖了。 --- chnroutes.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/chnroutes.py b/chnroutes.py index 082db2c..85c6519 100755 --- a/chnroutes.py +++ b/chnroutes.py @@ -220,19 +220,26 @@ def generate_android(metric): upscript_header=textwrap.dedent("""\ #!/bin/sh - alias nestat='/system/xbin/busybox netstat' - alias grep='/system/xbin/busybox grep' - alias awk='/system/xbin/busybox awk' - alias route='/system/xbin/busybox route' - - OLDGW=`netstat -rn | grep ^0\.0\.0\.0 | awk '{print $2}'` - + busybox="$(PATH="/system/xbin/busybox:$PATH" which busybox || echo /system/xbin/busybox)" + phas(){ type "$@" &>/dev/null; } + bhas(){ "$busybox" "$@" &>/dev/null; } + + phas netstat || alias nestat='"$busybox" netstat' + phas grep || alias grep='"$busybox" grep' + phsa route || alias route='"$busybox" route' + + read _ OLDGW _ << EOF + $(netstat -rn | grep ^0\.0\.0\.0) + EOF + """) downscript_header=textwrap.dedent("""\ - #!/bin/sh - alias route='/system/xbin/busybox route' - + busybox="$(PATH="/system/xbin/busybox:$PATH" which busybox || echo /system/xbin/busybox)" + phas(){ type "$@" &>/dev/null; } + bhas(){ "$busybox" "$@" &>/dev/null; } + phas route || alias route='/system/xbin/busybox route' + """) upfile=open('vpnup.sh','w') From 75c0f012aa46057fe0c563ccfea353f12709d0c5 Mon Sep 17 00:00:00 2001 From: Mingye Wang Date: Sun, 25 Oct 2015 02:44:50 -0400 Subject: [PATCH 5/5] Refactor README --- README.en.md | 134 ++++++++++++++++++++++++++++++++++++++++++ README.md | 161 ++++++++++++++++++++++++++++++++++----------------- 2 files changed, 241 insertions(+), 54 deletions(-) create mode 100644 README.en.md diff --git a/README.en.md b/README.en.md new file mode 100644 index 0000000..4f1ba81 --- /dev/null +++ b/README.en.md @@ -0,0 +1,134 @@ +chnroutes +========= + +These scripts uses country data from [APNIC Delegated List] to generate scripts +to run when you connect to a VPN. With those scripts, a Chinese VPN user can +avoid piping his/her domestic connection thru VPN, and save some money and time. + +To use this, you need a VPN connection, either PPTP or OpenVPN, running as a +network gateway on your computer. This is often the default, and pipes things +globally. If you don't have Python to run and generate those things, we have +pregenerated things for you. + +The effect of the configuration can be tested using domestic IP-displaying +sites, like ip.cn. + +OpenVPN Usage +------------- + +For using this, you need OpenVPN >= v2.1. Otherwise, read the additional +instructions below. + +OpenVPN 2.1 added `max-routes` so we can add more than 100 routing info into +the config. Here is how you should do that (tested on OS X, Windows and Linux): + +1. Get the `routes.txt` list. + - Download `chnroutes.py` and use `python chnroutes.py` to generate one. +2. Append the contents of the list to your OpenVPN configuration. +3. Add a line `max-routes NUM` to the top of your OpenVPN configuration, where + NUM should be no less than the line count of `routes.txt`. Since the server + may also push a few routing info to you, you can add 50 to the line count + and use it as NUM. +4. Reconnect your OpenVPN. You can use Chinese sites like ip.cn to test it. + +If you don't have access to OpenVPN >= 2.1, consider the Android method. + +### Notes + +* We use the `net_gateway` variable to show the gateway before OpenVPN was + connected, but the document says not all systems support that. If you happen + to be one example, replace `net_gateway` manually with your current gateway. +* You may need to enable Windows XP compatible mode, and give it administrator + privilege for both the OpenVPN installer and the installed programs. If it + still fails, add those lines to your config: + ```Bash + route-method exe + route-delay 2 + ``` +* Sometimes the network will cause OpenVPN to disconnect, therefore calling the + vpndown script. When it tries to reconnect later, it may be unable to find + the default routing and fail. You can stop reconnecting and manually reset + the routing, and then reconnect. + +### Android & OpenVPN < 2.1 + +We haven't tested the method above on Android yet and some people still need +legacy compatibility, so we kept this section. + +1. As usual, download `chnroutes.py.` +2. Enter the download destination from your terminal and run + `python chnroutes.py -p android`. This generates `vpnup.sh` and `vpndown.sh`. +3. Copy the files somewhere, say, `/sdcard/openvpn/`. Add those to OVPN config: + ``` + script-security 2 + up "/system/bin/sh /sdcard/openvpn/vpnup.sh" + down "/system/bin/sh /sdcard/openvpn/vpndown.sh" + ``` + You can modify the path to `sh` and `vpn{up,down}.sh` for your own needs. + +Here we assume that you have `netstat`, `grep` and `route`. You can get them in +`busybox`. + +Since there is [a lot of ip entries][chinaip],the script runs `route` a lot of +times and it takes [significant time][PR48] on a phone, so you may not really +want to use it. Maybe not using `redirect-gateway` mode and add some IP ranges +to route is better. + +PPTP Usage +---------- + +All those scripts generated in this section are general-purpose. That means you +can use it somewhere else, like in other type of connections. + +### OS X / Linux + +1. Download `chnroutes.py`. +2. `python chnroutes.py -p "$(uname)"`; chmod a+x ip-*; sudo cp ip-* /etc/ppp`. + - If you have other files in `/etc/ppp`, you may want to append not overwrite + them. +3. Done. Reconnect and test. + +### Windows + +* Download `chnroutes.py`. I am tired of saying this. +* `cd` into the download destination and run `python chnroutes.py -p win`. This + generates `vpnup.bat` and `vpndown.bat`. + +Since Windows doesn't provide hook scripts for PPTP dialing, you have to run +those manually before connecting and after disconnecting. + +Using this on a router +---------------------- + +Many Linux-based third party router OSes, like OpenWRT, DD-WRT, Tomato, provide +OVPN/PPTP functionalities. Dial up the VPN, and all the connected devices can +get nice VPN access with chnroutes capabilities. + +[autoddvpn] provides such a solution. Please be aware that using VPN makes +devices not suitable for P2P transport like emule and BT. + +Precautions +----------- + +* The IP data in those generated scripts keeps being updated. Although that not + really frequent, but you still want to regenerate them every three months. +* Using VPN may make you unable to use Google Music. This is caused by the fact + that your foreign DNS through your VPN gives you a foreign IP for google.cn. + A simple hack is to add the Chinese google.cn IP into your hosts: + ``` + # Google.cn, from Chinese DNS + 203.208.39.99 www.google.cn google.cn + ``` + +Tell us something +----------------- + +The scripts generated by the project is tested in a network environment with a +router. If it doesn't work somewhere else, or if you have some other bugs, just +write an issue. + + +[APNIC Delegated List]:https://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest +[chinaip]:https://github.com/liudongmiao/chinaip +[PR48]:https://github.com/fivesheep/chnroutes/pull/48 +[autoddvpn]:https://github.com/lincank/autoddvpn \ No newline at end of file diff --git a/README.md b/README.md index 752c3b1..0cf3559 100644 --- a/README.md +++ b/README.md @@ -1,87 +1,140 @@ -## 介绍 +chnroutes +========= -这几个脚本主要利用来自 http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest 的数据生成路由命令脚本, 让vpn客户端在进行连接的时候自动执行. 通过这些路由脚本, 可以让用户在使用vpn作为默认网络网关的时候, 不使用vpn进行对中国国内ip的访问, 从而减轻vpn的负担, 和增加访问国内网站的速度. +这几个脚本主要利用来自 [APNIC Delegated List] 的数据生成路由命令脚本, 让 VPN 客户端 +在进行连接的时候自动执行。通过这些路由脚本, 可以让用户在使用 VPN 作为默认网络网关时 +不使用 VPN 进行对中国国内 IP 的访问, 从而减轻 VPN 的负担, 和增加访问国内网站的速度。 -## 基本约定 +For English service, press 2 and read README.en.md. -在使用这些脚本之前, 请确保你在自己的电脑上已经成功配置好一个vpn连接(pptp 或者 openvpn), 并且让之以默认网络网关的方式运行, 这通常也是默认配置, 即vpn接入之后所有网络流量都通过vpn进行. +基本约定 +-------- -## OpenVPN +在使用这些脚本之前, 请确保你在自己的电脑上已经成功配置好一个 VPN 连接(PPTP/OpenVPN), +并且让之以默认网络网关的方式运行, 这通常也是默认配置, 即 VPN 接入之后所有网络流量都通过 +VPN 进行。 -使用此法之前, 请确认openvpn版本是否为 v2.1 或者以上, 如果不是请参看下方不同系统关于openvpn部分的描述 +要验证设置是否生效,可以使用诸如 ip.cn 的国内网站。对于需要使用 Android 的地方,我们也 +提供预先生成的文件。 -### 客户端设置 +OpenVPN 配置 +------------ -本方法适用于使用openvpn v2.1或更高版本的用户. 因为openvpn v2.1比之前版本增加了一个名为max-routes的新参数, 通过设置该参数, 我们可以在配置文件里(服务端, 客户端)直接添加超过100条以上的路由信息. 具体设置步骤如下: +使用此法之前, 请确认 OpenVPN 版本是否为 v2.1 或者以上, 如果不是请参看下方不同 +系统关于 OpenVPN 部分的描述。如果你使用 Android,请往后读。 -1. 下载 chnroutes.py 文件 - 在命令行里执行 python chnroutes.py, 这将生成一个名为 routes.txt 的文本文件. 对于不想安装python的用户, 可以直接从项目下来列表里下载该文件. 它将会每月更新一次. -2. 使用你喜欢的文本编辑器打开上述文件, 并把内容复制粘贴到openvpn配置文件的末尾 -3. 同时在openvpn配置文件的头部添加一句 max-routes num, 其中num是一个不小于文件routes.txt的行数的数字, 实际上因为还有一些服务器端push过来的路由信息, 所以保险起见可以用 routes.txt的行数加上50, 比如目前得到的routes.txt的行数是940, 你可以把数字设置为1000: max-routes 1000 -4. 修改完之后, 重新进行openvpn连接, 你可以用之前描述过的方法进行测试是否成功 +OVPN v2.1 比之前版本增加了一个 `max-routes` 可以用来在配置文件里(服务端和客户端) +直接添加超过 100 条以上的路由信息。具体设置步骤如下(在 OS X, Linux 和 Windows +上测试通过): -以上方法在Mac OSX, Linux 和 Windows上测试通过. 但需要注意的是, 这里用到一个net_gateway的变量表示未连接openvpn前的网关地址, 但openvpn的文档里有说明这个不是所有系统都支持的, 如果发生这个情况, 可以修改一下生成脚本, 把net_gateway修改为你的局域网的网关地址. 对于windows 7 和 vista, OpenVPN的windows客户端可能需要设置Windows XP兼容模式才能使用, 安装文件要在属性选择中的兼容性选择Windows XP和以管理员的身份运行,安装好的运行文件也同样选择这两个选项。如果还是不能连接到VPN的网络,可以尝试在配置文件中加入: +1. 获取 `routes.txt` 路由列表 + - 下载 `chnroutes.py`,然后执行命令 `python chnroutes.py` 生成。 +2. 把 `routes.txt` 的内容复制粘贴到 OpenVPN 配置文件的末尾。 +3. 同时在 OpenVPN 配置文件的头部添加一句 `max-routes NUM`, 其中 NUM 是一个不小于 + `routes.txt` 行数的数字。考虑到还有一些服务器端 push 过来的路由信息, 保险起见可用 + `routes.txt` 行数加上 50, 比如目前得到的 `routes.txt` 行数是 940, 你可以把数字 + 设置为 1000: `max-routes 1000` +4. 修改完之后, 重新进行 OpenVPN 连接并测试。 -``` -route-method exe -route-delay 2 -``` +如果你的 OpenVPN 版本低于 2.1 并且没法升级,你可以尝试[合并 IP 条目][chinaip]或者 +参考后面的 Android 解法。 ### 注意事项 -* 因为这些ip数据不是固定不变的, 尽管变化不大, 但还是建议每隔两三个月更新一次 -* 使用此法之后, 可能会导致google music无法访问, 这个其实是因为连上vpn之后, 使用的dns也是国外的, 国外dns对google.cn 解析出来的是国外的ip, 所以一个简单的解决方法是修改本机的hosts文件, 把国内dns解析出来的google.cn的地址写上去: 203.208.39.99 www.google.cn google.cn +* 这里用到 `net_gateway` 变量表示连接 OpenVPN 前的网关地址, 但 OpenVPN 文档提到不是 + 所有系统都支持这个变量。如果发生这个情况, 可以修改一下生成脚本, 把 `net_gateway` 手动 + 修改为你的局域网的网关地址。 +* 对于 Windows Vista+, OpenVPN 的 Windows 客户端可能需要设置 Windows XP 兼容模式才能 + 使用。安装文件要在属性选择中的兼容性选择 Windows XP 和以管理员的身份运行,安装好的运行 + 文件也同样选择这两个选项。如果还是不能连接到VPN的网络,可以尝试在配置文件中加入: + ```Bash + route-method exe + route-delay 2 + ``` +* 有时网络质量不好, OpenVPN 非主动断开, 这时候 vpndown 脚本也会被自动调用。重新连上之后, + 又可能会找不到默认的路由而添加失败。这时候你可以停止 OpenVPN 重连, 并手动设置好原来的 + 默认路由再重新进行 OpenVPN 拨号。 + +### Android & OpenVPN < 2.1 + +由于没在 Android 上进行过测试, 无法确定上文描述的 OpenVPN 2.1 的使用方法是否也在 +Android 手机上适用, 所以保留以下内容。这个方式直接使用 OpenVPN 的脚本运行功能,原理上 +类似接下来的 PPTP 方法。 -## PPTP +1. 下载 `chnroutes.py`。 +2. 从终端进入下载目录, 执行 `python chnroutes.py -p android`, 这将生成 `vpnup.sh` 和 + `vpndown.sh` 两个文件. +3. 把生成的两个文件拷贝到 `/sdcard/openvpn/` 目录下, 然后修改 OpenVPN 配置文件, + 在文件中加上以上三句: + ``` + script-security 2 + up "/system/bin/sh /sdcard/openvpn/vpnup.sh" + down "/system/bin/sh /sdcard/openvpn/vpndown.sh" + ``` + 你可以自行修改 `sh` 和 `vpn{up,down}.sh` 的位置来契合你的实际情况。 -### Mac OSX +这里假定你的 Android 有命令 `netstat`, `grep` 和 `route`。你可以使用 busybox 达成 +这点。 -* 下载 chnroutes.py -* 从终端进入下载目录, 执行 `python chnroutes.py -p mac`, 执行完毕之后同一目录下将生成两个新文件'ip-up'和'ip-down' -* 把这两个文件copy到 `/etc/ppp` 目录, 并使用 `sudo chmod a+x ip-up ip-down` 命令把它们设置为可执行 -* 设置完毕, 重新连接vpn. 测试步骤同上. +由于 IP [数量众多][chinaip],要打开 `route` 命令很多次,这个脚本[用时不短][PR48], +如果不必要的话就不要用了。也许采用非 redirect-gateway 方式, 然后在 OVPN 配置文件里添加 +几条需要路由的 IP 段是比较快捷方便的做法. -### Linux +PPTP 用法 +--------- -* 下载 chnroutes.py -* 从终端进入下载目录, 执行 `python chnroutes.py -p linux`, 执行完毕之后同一目录下将生成两个新文件'ip-pre-up'和'ip-down'. -* 把 `ip-pre-up` 拷贝到 `/etc/ppp` 目录, `ip-down` 拷贝到 `/etc/ppp/ip-down.d` 目录. 测试步骤同上. +这些用法中生成的脚本都是通用的,也就是说你也可以用在 PPTP 之外的地方。 + +### OS X / Linux + +1. 下载 `chnroutes.py`。 +2. `python chnroutes.py -p "$(uname)"`; chmod a+x ip-*; sudo cp ip-* /etc/ppp`. + - 如果你已有其他文件,你可能更想要将生成的那些文件加入已有文件的末尾。 +3. 设置完毕。重新连接 VPN,测试步骤同上。 ### Windows -* 下载 chnroutes.py -* 从终端进入下载目录, 执行 `python chnroutes.py -p win`, 执行之后会生成vpnup.bat和vpndown.bat两个文件. +* 下载 `chnroutes.py`。 +* 从终端进入下载目录, 执行 `python chnroutes.py -p win`, 执行之后会生成 `vpnup.bat` +和 `vpndown.bat` 两个文件。 -由于windows上的pptp不支持拨号脚本, 所以也只能在进行拨号之前手动执行vpnup.bat文件以设置路由表. 而在断开vpn之后, 如果你觉得有必要, 可以运行vpndown.bat把这些路由信息给清理掉. +由于 Windows 不支持 PPTP 拨号脚本,只能在进行拨号之前手动执行 `vpnup.bat` 设置路由表。 +在断开 VPN 之后, 如果你觉得有必要, 可以运行 `vpndown.bat` 把这些路由信息给清理掉。 -如果机器上没有安装python, 可以直接从下载页面上下载已经预生成的bat文件. +如果机器上没有安装 Python, 可以直接从下载页面上下载已经预生成的 bat 文件。 -### Android +在路由器上使用 +-------------- -由于没在android上进行过测试, 无法确定上文描述的openvpn v2.1的使用方法是否也在android手机上适用, 所以保留以下内容 +一些基于 Linux 系统的第三方路由器系统,如 OpenWRT, DD-WRT, Tomato 都带有我们所需的客 +户端。我们只需要在路由器进行 VPN 拨号, 并利用本项目提供的路由表脚本就可以把 VPN 针对性 +翻墙扩展到整个局域网。对于那些不使用 P2P, 希望在路由器上设置针对性翻墙的用户, 这方法 +十分有用, 因为只需要一个 VPN 帐号, 局域网内的所有机器包括使用 Wifi 的手机都能自动翻墙。 -#### openvpn +[autoddvpn] 可以提供这样的处理方案。请注意这样会使得即局域网的任何机器都不适合使用 +emule, BT 等 P2P 下载软件(P2P 流量不应穿过 VPN)。 -* 下载 chnroutes.py -* 从终端进入下载目录, 执行 `python chnroutes.py -p linux`, 这将成 - 'vpnup.sh'和'vpndown.sh'两个文件. -* 把步骤2生成的两个文件拷贝到 android 的 /sdcard/openvpn/目录下, 然后修改openvpn配置文件, - 在文件中加上以上三句: - - ``` - script-security 2 - up "/system/bin/sh /sdcard/openvpn/vpnup.sh" - down "/system/bin/sh /sdcard/openvpn/vpndown.sh" +注意事项 +-------- + +* 这些 IP 数据不是固定不变的, 尽管变化不大, 但还是建议每隔两三个月更新一次。 +* 使用此法之后, 可能会导致 Google Music 无法访问, 这个其实是因为连上 VPN 之后, 使用的 + DNS 也是国外的, 国外 DNS 对 google.cn 解析出来的是国外的 IP, 所以一个简单的解决方法是 + 修改本机的 hosts 文件, 把国内 DNS 解析出来的 google.cn 的地址写上去: + ``` + # Google.cn, from Chinese DNS + 203.208.39.99 www.google.cn google.cn ``` - - 注意自行修改其中的路径以符合你的android rom的实际路径 -另外, 这里假定了你的android已经安装过busybox, 否则请先安装busybox再进行以上操作, 还需要知道的是, 这个脚本在手机上执行会花费比较长的时间, 如非必要, 就不要用了. 也许采用非redirect-gateway方式, 然后在ovpn配置文件里添加几条需要路由的ip段是比较快捷方便的做法. -基于Linux的第三方系统的路由器 -一些基于Linux系统的第三方路由器系统如: OpenWRT, DD-WRT, Tomato 都带有VPN(PPTP/Openvpn)客户端的, 也就是说, 我们只需要在路由器进行VPN拨号, 并利用本项目提供的路由表脚本就可以把VPN针对性翻墙扩展到整个局域网. 当然, 使用这个方式也是会带来副作用, 即局域网的任何机器都不适合使用Emule或者BT等P2P下载软件. 但对于那些不使用P2P, 希望在路由器上设置针对性翻墙的用户, 这方法十分有用, 因为只需要一个VPN帐号, 局域网内的所有机器, 包括使用wifi的手机都能自动翻墙. 相信配置方式请参考: Autoddvpn 项目. +信息反馈 +-------- -## 信息反馈 +本项目的脚本都是在使用路由器进行拨号的情况下测试通过的。如果在其它拨号方式下脚本不能运作, +请添加一个新的 Issue。 -本项目的脚本都是在使用路由器进行拨号的情况下测试通过的, 如果在其它拨号方式下, 脚本不能运作, 请添加一个新的issue. 另外, 在配合openvpn使用的时候, 可能会出现一种情况是因为网络质量不好, openvpn非主动断开, 这时候vpndown脚本也会被自动调用, 但重新连上之后, 可能会找不到默认的路由而添加失败, 这时候你可以通过停止openvpn重连, 并手动设置好原来的默认路由再重新进行openvpn拨号. \ No newline at end of file +[APNIC Delegated List]:https://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest +[chinaip]:https://github.com/liudongmiao/chinaip +[PR48]:https://github.com/fivesheep/chnroutes/pull/48 +[autoddvpn]:https://github.com/lincank/autoddvpn \ No newline at end of file