openvpn原理
VPN直译就是虚拟专用通道,是提供给企业之间或者个人与公司之间安全数据传输的隧道,OpenVPN无疑是Linux下开源VPN的先锋,提供了良好的性能和友好的用户GUI。 它大量使用了OpenSSL加密库中的SSLv3/TLSv1协议函数库。 目前OpenVPN能在Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X与Microsoft Windows以及Android和iOS上运行,并包含了许多安全性的功能。它并不是一个基于Web的VPN软件,也不与IPsec及其他VPN软件包兼容。 openvpn通过使用公开密钥(非对称密钥,加密解密使用不同的key,一个称为Publice key,另外一个是Private key)对数据进行加密的。这种方式称为TLS加密。 openvpn使用TLS加密的工作过程是,首先VPN Sevrver端和VPN Client端要有相同的CA证书,双方通过交换证书验证双方的合法性,用于决定是否建立VPN连接。 然后使用对方的CA证书,把自己目前使用的数据加密方法加密后发送给对方,由于使用的是对方CA证书加密,所以只有对方CA证书对应的Private key才能解密该数据,这样就保证了此密钥的安全性,并且此密钥是定期改变的,对于窃听者来说,可能还没有破解出此密钥,VPN通信双方可能就已经更换密钥了。 扩展阅读: openvpn
安装openvpn
首先,你需要有一台长期运行的服务器,大家可以用自己的闲置的电脑或者买一台阿里云啦。 我的服务器是Ubuntu 14.04,下面就演示一下我的配置过程。 安装
1 |
sudo apt-get -y install openvpn libssl-dev openssl |
查看下版本并记录下来
1 |
openvpn --version |
安装easy-rsa
easy-rsa是用来制作openvpn相关证书的,使用如下命令安装
1 |
sudo apt-get -y install easy-rsa |
好,一切准备就绪后,我们就开始制作证书啦,我们需要制作的有三个证书 CA证书、Server端证书、Client端证书。行动起来。
制作CA证书
openvpn与easy-rsa安装完毕后,我们需要在/etc/openvpn/目录下创建easy-rsa文件夹,如下
1 |
sudo mkdir /etc/openvpn/easy-rsa/ |
然后把/usr/share/easy-rsa/目录下的所有文件全部复制到/etc/openvpn/easy-rsa/下
1 |
sudo cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/ |
当然,我们也可以直接在/usr/share/easy-rsa/制作相关的证书,但是为了后续的管理证书的方便,我们还是把easy-rsa放在了openvpn的启动目录下。 注意:由于我们现在使用的是ubuntu系统,所以我们必须切换到root用户下才能制作相关证书,否则easy-rsa会报错。如果是centos系统,则不存在此问题。 切换到root用户下,使用如下命令:
1 |
sudo su |
在开始制作CA证书之前,我们还需要编辑vars文件,修改如下相关选项内容即可
1 |
sudo vi /etc/openvpn/easy-rsa/vars |
1 |
export KEY_COUNTRY="CN" |
如图所示 之后,我们需要利用这个文件来制作我们的证书,保存一下。 然后一个很重要的一步,赋予权限,否则在制作证书的时候,值还是初始化的值。
1 |
sudo chmod 777 /etc/openvpn/easy-rsa/vars |
vars文件主要用于设置证书的相关组织信息,红色部分的内容可以根据自己的实际情况自行修改。 其中export KEY_NAME=”germy” 这个要记住下,我们下面在制作Server端证书时,会使用到。 注意:以上内容,我们也可以使用系统默认的,也就是说不进行修改也是可以使用的。 然后使用source vars命令使其生效,如下:
1 |
source vars |
注意:执行clean-all命令会删除,当前目录下的keys文件夹。 现在开始正式制作CA证书,使用如下命令:
1 |
cd /etc/openvpn/easy-rsa/ |
一路回车即可。 制作完成后,我们可以查看keys目录里有什么东西。 如果你的目录下出现了ca.crt和ca.key两个文件,其中ca.crt就是我们所说的CA证书。如此,CA证书制作完毕。 现在把该CA证书的ca.crt文件复制到openvpn的启动目录/etc/openvpn下,如下:
1 |
cp keys/ca.crt /etc/openvpn/ |
制作Server端证书
CA证书制作完成后,我们现在开始制作Server端证书。如下:
1 |
./build-key-server germy |
上述命令中germy,就是我们前面vars文件中设置的KEY_NAME 查看 keys 目录 如果可以发现出现了 germy.crt,germy.csr,germy.key 文件,就说明成功了。 现在再为服务器生成加密交换时的Diffie-Hellman文件,如下:
1 |
./build-dh |
你会发现目录下多了一个 dh2048.pem 文件。 以上操作完毕后,把germy.crt,germy.key,dh2048.pem 复制到 /etc/openvpn/ 目录下,如下:
1 |
cd /etc/openvpn/easy-rsa/ |
如此,Server端证书就制作完毕。
制作Client端证书
Server端证书制作完成后,我们现在开始制作Client端证书,如下:
1 |
./build-key cqc |
其中上述命令的cqc就是客户端证书名称,可以自定义 如果发现keys目录已经生成了cqc.csr、cqc.crt和cqc.key这个三个文件。其中cqc.crt和cqc.key两个文件是我们要使用的。 如此,Client端证书就制作完毕。
配置Server端
所有证书制作完毕后,我们现在开始配置Server端。Server端的配置文件,我们可以从openvpn自带的模版中进行复制。如下:
1 |
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ |
解压server.conf.gz 文件,使用如下命令:
1 |
gzip -d server.conf.gz |
注意:上述命令的意思是解压server.conf.gz文件后,然后删除原文件。 现在我们来修改server.conf文件 一共要修改3处文件 (1)修改了openvpn运行时使用的协议,由原来的UDP协议修改为TCP协议。生成环境建议使用TCP协议。 (2)修改了openvpn服务器的相关证书,由原来的server.csr、server.key修改为germy.crt、germy.key。 (3)修改了Diffie-Hellman文件,由原来的dh1024.pem修改为dh2048.pem。 配置文件修改完毕后,我们现在来启动openvpn,使用如下命令:
1 |
/etc/init.d/openvpn start |
至此,服务器端的VPN已经配置完毕了。
客户端的配置
服务器端配置好了,我们需要用另一台机器来连接,这里我们的客户端依然是Ubuntu 14.04 首先我们需要从服务器上取到刚才生成的证书文件,那么我们需要的有什么呢? 首先这三个,ca.crt,cqc.crt,cqc.key 另外是一个模板,它是 /usr/share/doc/openvpn/examples/sample-config-files/client.conf 把这四个文件下载下来,然后放到客户端里。 比如我们保存到客户机的 home/user 文件夹下
把 client.conf 文件重命名为 client.ovpn 然后修改下面4处
1 |
proto tcp |
其中 remote 就是你的服务器地址 配置好了之后,我们运行
1 |
sudo openvpn --config client.ovpn |
如果最后的结果是 Sequence Completed 那就证明连接成功啦。 输入
1 |
ifconfig |
你会发现多了一个tun0适配器,这就是openvpn的适配器。 至此,openvpn的配置和连接就全部完成啦。
参考来源
参考文献 如有问题,欢迎留言交流。