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 的配置和连接就全部完成啦。
参考来源
参考文献 如有问题,欢迎留言交流。