0%

计算机网络探究三之搭建并连接VPN服务器

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

20151030145358 在这里我们的版本是2.3.2

安装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
2
3
4
5
6
7
export KEY_COUNTRY="CN"
export KEY_PROVINCE="SD"
export KEY_CITY="JiNan"
export KEY_ORG="germy"
export KEY_EMAIL="cqc@cuiqingcai.com"
export KEY_OU="germy"
export KEY_NAME="germy"

如图所示 20151030150125 之后,我们需要利用这个文件来制作我们的证书,保存一下。 然后一个很重要的一步,赋予权限,否则在制作证书的时候,值还是初始化的值。

1
sudo chmod 777 /etc/openvpn/easy-rsa/vars

vars文件主要用于设置证书的相关组织信息,红色部分的内容可以根据自己的实际情况自行修改。 其中export KEY_NAME=”germy” 这个要记住下,我们下面在制作Server端证书时,会使用到。 注意:以上内容,我们也可以使用系统默认的,也就是说不进行修改也是可以使用的。 然后使用source vars命令使其生效,如下:

1
2
source vars
./clean-all

注意:执行clean-all命令会删除,当前目录下的keys文件夹。 现在开始正式制作CA证书,使用如下命令:

1
2
cd /etc/openvpn/easy-rsa/
./build-ca

一路回车即可。 制作完成后,我们可以查看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 目录 20151030150704 如果可以发现出现了 germy.crt,germy.csr,germy.key 文件,就说明成功了。 现在再为服务器生成加密交换时的Diffie-Hellman文件,如下:

1
./build-dh

你会发现目录下多了一个 dh2048.pem 文件。 以上操作完毕后,把germy.crt,germy.key,dh2048.pem 复制到 /etc/openvpn/ 目录下,如下:

1
2
cd /etc/openvpn/easy-rsa/
cp keys/germy.crt keys/germy.key keys/dh2048.pem /etc/openvpn/

如此,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
2
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
cd /etc/openvpn/

解压server.conf.gz 文件,使用如下命令:

1
gzip -d server.conf.gz

注意:上述命令的意思是解压server.conf.gz文件后,然后删除原文件。 现在我们来修改server.conf文件 20151030151728 一共要修改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 首先我们需要从服务器上取到刚才生成的证书文件,那么我们需要的有什么呢? 20151030152200 首先这三个,ca.crt,cqc.crt,cqc.key 另外是一个模板,它是 /usr/share/doc/openvpn/examples/sample-config-files/client.conf 把这四个文件下载下来,然后放到客户端里。 比如我们保存到客户机的 home/user 文件夹下 20151030152421 把 client.conf 文件重命名为 client.ovpn 然后修改下面4处

1
2
3
4
5
proto tcp
remote 121.42.14.158 1194
ca ca.crt
cert cqc.crt
key cqc.key

其中 remote 就是你的服务器地址 配置好了之后,我们运行

1
sudo openvpn --config client.ovpn

如果最后的结果是 Sequence Completed 那就证明连接成功啦。 输入

1
ifconfig

你会发现多了一个tun0适配器,这就是openvpn的适配器。 至此,openvpn的配置和连接就全部完成啦。

参考来源

参考文献 如有问题,欢迎留言交流。