openvpn配置实践总结。

原理

vpn的全称叫virtual private network,虚拟专用网络,即利用公网架设专用网络。vpn的作用就是当外地员工想要访问内网资源的时候,外地员工可以通过连接vpn server,然后访问内网资源vpn原理

因此作为墙内的我们,可以将整个国外的网络环境当成某个公司的内网资源,如果能够在该国外网络中架设一个vpn server,然后我们在墙内连上该vpn server我们就可以访问整个国外的网络资源了。

openvpn是工作在OSI模型的数据链路层和网络层的,所以如果使用vpn翻墙,那几乎我们能用到的网络请求都能翻过去,而不像代理,只能解决http类似的请求。

搭建步骤

从原理我们可以知道

  1. 需要一个可以访问的国外的vps或者其他能够访问的机器。
  2. 搭建vpnserver
  3. 搭建vpnclient
  4. 通过调整ip转发来优化vpnsever

国外vps或者其他可以访问的机器

本文作者使用的是digitalocean,速度不能说很优秀,但是稳定够用。这个vps还有个最大的问题是,其官网需要翻墙访问(dead lock),所以首次使用的用户谨慎选择。

搭建vpnserver

该步骤是整个过程中最复杂的部分,下面我们就一步一步来搭建。vpn server选用的openvpn,开源免费。若本文有说的不清楚的地方,请参考HOWTO

下面仅以Ubuntu 15.04为例搭建vpn server,以Mac为例配置vpn client

  1. 安装openvpn server 首先执行命令:
sudo apt-get install openvpn

安装完之后关注两个目录 /etc/openvpn: 该目录用于存放真正的配置文件 /usr/share/doc/openvpn/examples: 该目录下提供了示例配置文件

  1. 以示例配置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
  1. 启动openvpn
openvpn /etc/openpvn/server.conf
# 启动后注意观察terminal的输出,没有error就说明启动成功了
  1. 配置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