/chnroutes

[A Python3 version of chnroutes] scripts help chinese netizen, who uses vpn to combat censorship, by modifying the route table so as routing only the censored ip to the vpn

Primary LanguagePython

chnroutes

⚠️根据原repo更改为python 3版本

⚠️仅在MacOS上进行了测试

这几个脚本主要利用来自 APNIC Delegated List 的数据生成路由命令脚本, 让 VPN 客户端 在进行连接的时候自动执行。通过这些路由脚本, 可以让用户在使用 VPN 作为默认网络网关时 不使用 VPN 进行对**国内 IP 的访问, 从而减轻 VPN 的负担, 和增加访问国内网站的速度。

For English service, press 2 and read README.en.md.

基本约定

在使用这些脚本之前, 请确保你在自己的电脑上已经成功配置好一个 VPN 连接(PPTP/OpenVPN), 并且让之以默认网络网关的方式运行, 这通常也是默认配置, 即 VPN 接入之后所有网络流量都通过 VPN 进行。

要验证设置是否生效,可以使用诸如 ip.cn 的国内网站。对于需要使用 Android 的地方,我们也 提供预先生成的文件。

OpenVPN 配置

使用此法之前, 请确认 OpenVPN 版本是否为 v2.1 或者以上, 如果不是请参看下方不同 系统关于 OpenVPN 部分的描述。如果你使用 Android,请往后读。

OVPN v2.1 比之前版本增加了一个 max-routes 可以用来在配置文件里(服务端和客户端) 直接添加超过 100 条以上的路由信息。具体设置步骤如下(在 OS X, Linux 和 Windows 上测试通过):

  1. 获取 routes.txt 路由列表
  • 下载 chnroutes.py,然后执行命令 python chnroutes.py 生成。
  1. routes.txt 的内容复制粘贴到 OpenVPN 配置文件的末尾。
  2. 同时在 OpenVPN 配置文件的头部添加一句 max-routes NUM, 其中 NUM 是一个不小于 routes.txt 行数的数字。考虑到还有一些服务器端 push 过来的路由信息, 保险起见可用 routes.txt 行数加上 50, 比如目前得到的 routes.txt 行数是 940, 你可以把数字 设置为 1000: max-routes 1000
  3. 修改完之后, 重新进行 OpenVPN 连接并测试。

如果你的 OpenVPN 版本低于 2.1 并且没法升级,你可以尝试合并 IP 条目或者 参考后面的 Android 解法。

注意事项

  • 这里用到 net_gateway 变量表示连接 OpenVPN 前的网关地址, 但 OpenVPN 文档提到不是 所有系统都支持这个变量。如果发生这个情况, 可以修改一下生成脚本, 把 net_gateway 手动 修改为你的局域网的网关地址。
  • 对于 Windows Vista+, OpenVPN 的 Windows 客户端可能需要设置 Windows XP 兼容模式才能 使用。安装文件要在属性选择中的兼容性选择 Windows XP 和以管理员的身份运行,安装好的运行 文件也同样选择这两个选项。如果还是不能连接到VPN的网络,可以尝试在配置文件中加入:
    route-method exe
    route-delay 2
  • 有时网络质量不好, OpenVPN 非主动断开, 这时候 vpndown 脚本也会被自动调用。重新连上之后, 又可能会找不到默认的路由而添加失败。这时候你可以停止 OpenVPN 重连, 并手动设置好原来的 默认路由再重新进行 OpenVPN 拨号。

Android & OpenVPN < 2.1

由于没在 Android 上进行过测试, 无法确定上文描述的 OpenVPN 2.1 的使用方法是否也在 Android 手机上适用, 所以保留以下内容。这个方式直接使用 OpenVPN 的脚本运行功能,原理上 类似接下来的 PPTP 方法。

  1. 下载 chnroutes.py
  2. 从终端进入下载目录, 执行 python chnroutes.py -p android, 这将生成 vpnup.shvpndown.sh 两个文件.
  3. 把生成的两个文件拷贝到 /sdcard/openvpn/ 目录下, 然后修改 OpenVPN 配置文件, 在文件中加上以上三句:
script-security 2
up "/system/bin/sh /sdcard/openvpn/vpnup.sh"
down "/system/bin/sh /sdcard/openvpn/vpndown.sh"

你可以自行修改 shvpn{up,down}.sh 的位置来契合你的实际情况。

这里假定你的 Android 有命令 netstat, greproute。你可以使用 busybox 达成 这点。

由于 IP 数量众多,要打开 route 命令很多次,这个脚本用时不短, 如果不必要的话就不要用了。也许采用非 redirect-gateway 方式, 然后在 OVPN 配置文件里添加 几条需要路由的 IP 段是比较快捷方便的做法.

PPTP 用法

这些用法中生成的脚本都是通用的,也就是说你也可以用在 PPTP 之外的地方。

OS X / Linux

  1. 下载 chnroutes.py
  2. python chnroutes.py -p "$(uname)"; chmod a+x ip-*; sudo cp ip-* /etc/ppp.
  • 如果你已有其他文件,你可能更想要将生成的那些文件加入已有文件的末尾。
  1. 设置完毕。重新连接 VPN,测试步骤同上。

Windows

  • 下载 chnroutes.py
  • 从终端进入下载目录, 执行 python chnroutes.py -p win, 执行之后会生成 vpnup.batvpndown.bat 两个文件。

由于 Windows 不支持 PPTP 拨号脚本,只能在进行拨号之前手动执行 vpnup.bat 设置路由表。 在断开 VPN 之后, 如果你觉得有必要, 可以运行 vpndown.bat 把这些路由信息给清理掉。

如果机器上没有安装 Python, 可以直接从下载页面上下载已经预生成的 bat 文件。

在路由器上使用

一些基于 Linux 系统的第三方路由器系统,如 OpenWRT, DD-WRT, Tomato 都带有我们所需的客 户端。我们只需要在路由器进行 VPN 拨号, 并利用本项目提供的路由表脚本就可以把 VPN 针对性 翻墙扩展到整个局域网。对于那些不使用 P2P, 希望在路由器上设置针对性翻墙的用户, 这方法 十分有用, 因为只需要一个 VPN 帐号, 局域网内的所有机器包括使用 Wifi 的手机都能自动翻墙。

autoddvpn 可以提供这样的处理方案。请注意这样会使得即局域网的任何机器都不适合使用 emule, BT 等 P2P 下载软件(P2P 流量不应穿过 VPN)。

注意事项

  • 这些 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
    

信息反馈

本项目的脚本都是在使用路由器进行拨号的情况下测试通过的。如果在其它拨号方式下脚本不能运作, 请添加一个新的 Issue。