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 的配置和连接就全部完成啦。

参考来源

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