openvpn翻墙实践
openvpn配置实践总结。
原理
vpn的全称叫virtual private network,虚拟专用网络,即利用公网架设专用网络。vpn的作用就是当外地员工想要访问内网资源的时候,外地员工可以通过连接vpn server,然后访问内网资源vpn原理。
因此作为墙内的我们,可以将整个国外的网络环境当成某个公司的内网资源,如果能够在该国外网络中架设一个vpn server,然后我们在墙内连上该vpn server我们就可以访问整个国外的网络资源了。
openvpn是工作在OSI模型的数据链路层和网络层的,所以如果使用vpn翻墙,那几乎我们能用到的网络请求都能翻过去,而不像代理,只能解决http类似的请求。
搭建步骤
从原理我们可以知道
- 需要一个可以访问的国外的vps或者其他能够访问的机器。
- 搭建vpnserver
- 搭建vpnclient
- 通过调整ip转发来优化vpnsever
国外vps或者其他可以访问的机器
本文作者使用的是digitalocean,速度不能说很优秀,但是稳定够用。这个vps还有个最大的问题是,其官网需要翻墙访问(dead lock),所以首次使用的用户谨慎选择。
搭建vpnserver
该步骤是整个过程中最复杂的部分,下面我们就一步一步来搭建。vpn server选用的openvpn,开源免费。若本文有说的不清楚的地方,请参考HOWTO
下面仅以Ubuntu 15.04为例搭建vpn server,以Mac为例配置vpn client
- 安装openvpn server 首先执行命令:
sudo apt-get install openvpn
安装完之后关注两个目录 /etc/openvpn: 该目录用于存放真正的配置文件 /usr/share/doc/openvpn/examples: 该目录下提供了示例配置文件
- 以示例配置openvpn
# 将examples目录下得keys拷贝到/etc/openvpn/keys目录下
cd /etc/openvpn
mkdir keys
cp -r /usr/share/doc/openvpn/examples/sample-keys keys/
# 解压缩server.conf.gz
gunzip –c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > server.conf
# 修改server.conf
local 0.0.0.0
# 笔者用udp不能通过验证,具体原因未详,后续有结论继续更新
proto tcp
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key # This file should be kept secret
dh /etc/openvpn/keys/dh1024.pem
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
client-to-client
- 启动openvpn
openvpn /etc/openpvn/server.conf
# 启动后注意观察terminal的输出,没有error就说明启动成功了
- 配置mac客户端 mac客户端使用的是Tunnelblick[https://tunnelblick.net/] 安装完后会弹一个sample的配置文件,和server的几乎一模一样,
首先需要从vpn server下把 /usr/share/doc/openvpn/examples/sample-keys下的ca.crt、client.crt、client.key拷贝到/Users/fragno/Desktop/Tunnelblick VPN 配置样/目录下,然后修改配置文件
proto tcp
# 修改成自己的vpn server地址
remote xxx.xxx.xxx.xxx 1194
修改文件夹后缀为tblk,然后双击后点击右上角的tunnelblick的连接即可,在vpn server的terminal上可以看到有log,连接成功的话就会有很多成功log,注意观察。
测试成功并不代表可以使用了,如果使用测试的配置进行vpn翻墙,危险是非常大的,下面的工作才是真正创建属于我们自己的vpn的工作
创建能安全使用的vpn
因为如果使用vpn进行翻墙,那一旦我们连上vpn,我们所有的网络请求都会经过vpn server,我们传输给vpn server的数据必须是经过强加密的,否则就非常危险。 因此在vpn server的搭建中,安全方面的准备工作是非常麻烦的。不过幸亏有了easy-rsa。不了解原理做事没有安全感,所以下面简单的介绍下vpn的加密方式。
PKI
openvpn的安全机制主要是由PKI(public key instructure)来实现的。 PKI的原理有点类似我们身份证的发行机构,身份证发行机构有一套安全的发行和验证方法,保证了我们每个人的身份的唯一性和安全性。PKI也是这样,其主要有几个部分组成,包括证书机构(CA)、存放机构、中央目录、证书管理系统、证书策略等等。幸亏有了easy-rsa,我们可以很方便的创建我们自己的PKI。
easy-rsa
easy-rsa是CLI工具,用来创建和管理PKI CA的。github上的使用说明太过通用,以下使用主要参考了openvpn 服务端的安装(easy-rsa3)
# 以下以~/目录为例。目录在哪里是没有关系的
cd ~ && git clone https://github.com/OpenVPN/easy-rsa.git
mv easy-rsa easy-rsa-server
cp -rf easy-rsa-server easy-rsa-client
# 生成客户端的req
cd ~/easy-rsa-client/easyrsa3/
cp vars.example vars #一般情况下,默认的配置可以满足需求,也可以根据需要修改
./easyrsa init-pki
./easyrsa gen-req rookienerd #用自己的名字,需要创建一个密码 和 cn name,自己用的 需要记住,记住不能使用client,否则后面注册会有问题
# 生成服务端的ca
cd ~/easy-rsa-server/easyrsa3/
cp vars.example vars #一般情况下,默认的配置可以满足需求,也可以根据需要修改
./easyrsa init-pki #建立一个空的pki结构,生成一系列的文件和目录
./easyrsa build-ca #创建ca 密码 和 cn那么需要记住
./easyrsa gen-req server nopass #创建服务端证书 common name 最好不要跟前面的cn那么一样
./easyrsa sign server server #签约服务端证书
./easyrsa gen-dh #创建Diffie-Hellman
./easyrsa import-req ~/easy-rsa-client/easyrsa3/pki/reqs/rookienerd.req rookienerd #导入req
./easyrsa sign client rookienerd #用户签约,根据提示输入服务端的ca密码
# 这样我们就有了我们所需要的全部的文件,将他们分别拷贝到server和client端即可
# 拷贝到server端的文件
cp ~/easy-rsa-server/easyrsa3/ca.crt /etc/openpvn/keys/ca.crt
cp ~/easy-rsa-server/easyrsa3/dh.pem /etc/openvpn/keys/dh1024.pem
cp ~/easy-rsa-server/easyrsa3/issued/server.crt /etc/openpvn/keys/server.crt
cp ~/easy-rsa-server/easyrsa3/private/server.key /etc/openvpn/keys/server.key
# 拷贝到client端,这里client需要拷贝的文件包括ca.crt、rookienerd.crt、rookienerd.key(在~/easy-rsa-client/easyrsa3/pki/private/目录下)
# 注意如果不改配置的话,需要将名字换成client.crt和client.key,然后重启服务端,重启client就ok了。
service openvpn start
修改端口
不要使用默认的1194端口,改成任何比较大的端口都可以
路由配置
TODO