本文讲述使用 vps 搭建 openvpn,以及在 Gentoo 中使用 chnroutes 修改路由表,将国内 ip 的访问重新指定为非 vpn 线路。

条件

服务器为支持 Tun/Tap 的 vps: 我自己的 Directspace 的 vps,默认是没有开启的,需发 Tk 开启。免费的 AWS EC2 是默认开启了的。我这里的 vps 安装的操作系统为 Debian。

客户端为 Linux:我用的为 Gentoo,其他发行版的脚本和启动 openvpn 的方式可能会不一样

在 vps 中安装与配置 openvpn 服务器

安装 openvpn 软件,很简单:

aptitude install openvpn

生产服务器证书:

cd /etc/openvpn/
cp /usr/share/doc/openvpn/examples/easy-rsa/2.0/* .
source ./vars
./clean-all
./build-ca
./build-key-server server
./build-dh
./build-key client1

在 ./build-key-server server 和 ./build-key client1 两步时会询问是否签名,回答是,如下,其他使用默认即可:

...
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y

好了,此时,在 /etc/openvpn/keys 目录下面就有了服务器和客户端所需的证书
下面修改服务器配置文件:/etc/openvpn/server.conf,我只提取有用部分:

port 53
proto udp     # 我这里采用 udp 的 53 端口通信,和 dns 解析用的端口一样 ...
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem    # 以上4个指定服务器证书的路径
server 10.8.0.0 255.255.255.0      # 配置ip地址段
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"    # 默认路由走 vpn,后面在客户端设置时会将国内的 ip 再修改回非 vpn 的路由
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"    # 使用 Google 的 DNS
client-to-client    # vpn 客户端之间可以通信
duplicate-cn        # 多个客户端可以使用同一个证书
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
log /var/log/openvpn.log
verb 3

一些注释都在上面了。然后启动 openvpn 服务器了

/etc/init.d/openvpn start

服务器上面还有最后两件事情:打开路由转发选项和配置 SNAT 规则
打开路由转发:修改 /etc/sysctl.conf 文件,将 net.ipv4.ip_forward=1 前面的注释去掉

...
net.ipv4.ip_forward=1
...

然后执行命令:

sysctl -p

最后设置 MASQUERADE 规则,将 10.8.0.0 网段过来的数据包转发出去后都将源地址修改为本机的 IP 地址,以使回复包能够正确的回到 vps 上。命令:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

其中 eth0 要改为 vps 上面的网络接口名称,比如在 Directspace 上面就为 venet0;
当然这样只是当前生效,vps 重启之后还得重新配置 MASQUERADE 规则,可以使用如下语句将当前的 iptables 规则保存起来,然后在开机的时候加载

iptables-save > /etc/openvpn/iptables

在 /etc/rc.loacl 中加入如下语句:

iptables-restore < /etc/openvpn/iptables

好了,服务器配置就完成了

在 Gentoo 下配置 openvpn 客户端

首先同样为安装 openvpn 软件,我这里是 Gentoo,你需要使用你用的发行版的包管理安装

emerge openvpn openresolv iproute2

安装 openresolv 是为了需要 resolvconf 程序,用于修改 dns 配置的,其他发行版可能不太一样
安装 iproute2 是为了获得 ip 程序,在修改路由时会使用到。
客户端需要使用在配置服务器端时生成的 key,需要如下三个文件:

ca.crt  client1.crt  client1.key

同样,我这里也放到了 /etc/openvpn/keys 目录
然后配置 /etc/openvpn/client.conf

client
dev tun
proto udp
remote xxx.xxx.xxx.xxx 53      # 这里需要换成你自己的服务器,域名或 IP
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/client1.crt
key /etc/openvpn/keys/client1.key    # 你自己的证书路径
comp-lzo
verb 3
redirect-gateway
script-security 2

创建启动脚本

ln -vs openvpn /etc/init.d/openvpn.client

然后使用如下命令启动即可

/etc/init.d/openvpn.client start

但是,这样启动之后,所有的流量都回走 vpn,因此访问国内资源时很慢,且有可能会有限制,所以接下来就需要使用 chnroutes 的方法将访问国内 ip 的路由修改为非 vpn 的线路
下载 chnroutes.py 文件,然后执行

python chnroutes.py -p linux

之后,目录下面就会多出两个文件:

ip-pre-up ip-down

然后将这两个文件拷贝到 /etc/openvpn/ 目录并改名,同时加上可执行权限:

cp ip-pre-up /etc/openvpn/openvpn.client-up.sh
cp ip-down /etc/openvpn/openvpn.client-down.sh
chmod 755 /etc/openvpn/openvpn.client-up.sh
chmod 755 /etc/openvpn/openvpn.client-down.sh

Gentoo 下面会在 vpn 启动和停止的时候自动调用上面两个脚本。这时再运行

/etc/init.d/openvpn.client start

过不一会儿,使用 ip 命令查看路由表信息就可以看到国内的 ip 都走了非 vpn 的线路

$ ip r
0.0.0.0/1 via 10.8.0.9 dev tun0
default via 192.168.1.1 dev eth0  metric 2
1.0.1.0/24 via 192.168.1.1 dev eth0
1.0.2.0/23 via 192.168.1.1 dev eth0
1.0.8.0/21 via 192.168.1.1 dev eth0
1.0.32.0/19 via 192.168.1.1 dev eth0
1.1.0.0/24 via 192.168.1.1 dev eth0
1.1.2.0/23 via 192.168.1.1 dev eth0
1.1.4.0/22 via 192.168.1.1 dev eth0
1.1.8.0/21 via 192.168.1.1 dev eth0
...

好了,现在可以打开 Youtube 看下视频了,AWS EC2 的免费 vpn 速度可以到 400K,已经很不错了,不过流量每月只有 30G :)