使用 OpenVPN 搭建虚拟专用网络

OpenVPN 是一个用于创建虚拟专用网络加密通道的软件包,本文主要介绍 OpenVPN 的配置及使用方法

1. OpenVPN 简介

OpenVPN 是一个用于创建虚拟专用网络加密通道的软件包,最早由 James Yonan 编写。OpenVPN 允许创建的 VPN 使用公开密钥、电子证书、或者用户名/密码来进行身份验证。它大量使用了 OpenSSL 加密库中的 SSLv3 / TLSv1 协议函数库。目前 OpenVPN 能在 Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X 与 Microsoft Windows 以及 Android 和 iOS 上运行,并包含了许多安全性的功能。它并不是一个基于 Web 的 VPN 软件,也不与 IPsec 及其他 VPN 软件包兼容。

1.1 OpenVPN 的配置原理

OpenVPN 的配置工作主要分为如下两步:

  • 第一步,创建加密证书和私钥,其中包括服务器端和客户端都要用到的核心 CA 证书和私钥,服务器端自身的加密证书(即公钥)和私钥,以及每个客户端对应的加密证书和私钥。
  • 第二步,为服务器和客户端编写对应的配置文件,然后将其与第一步中生成的相应证书、私钥放在 OpenVPN 安装目录的 config 文件夹下。

OpenVPN 支持基于加密证书的双向认证。在 OpenVPN 中,不管是服务器还是客户端,所有的证书和私钥都需要由服务器端生成,客户端要先获得服务器端分配给它的加密证书和密钥才能成功连接。这与使用网上银行有些类似,大多数银行网站都会要求你先下载并安装一个数字证书,才允许你进行网上付款或其他操作。

1.2 OpenVPN 的下载

在 OpenVPN 的官网上,打开如下网页:

https://openvpn.net/index.php/download/community-downloads.html

使用图片所示内容最后的下载链接,可下载到适用于 Windows Vista 及之后版本 Windows 系统的安装文件。本文以 OpenVPN 2.3.11 版本为例简要介绍 OpenVPN 的安装、配置、使用方法。

2. OpenVPN 服务器端的配置

2.1 OpenVPN 的安装

打开 OpenVPN 的安装程序进行安装。在安装的过程中,要求选择安装内容,默认未选中 easy-rsa 「加密证书生成程序」,因此,我们必须手动勾选未选中的两个选项,之后如若询问是否安装 TAP-Win32 驱动程序,确认安装即可。

2.2 创建加密证书和私钥

1、使用文本编辑器 以管理员权限 打开并修改 OpenVPN 服务器端的 vars.bat.sample 文件「客户端的无需做任何修改」。vars.bat.sample 文件位于:

OpenVPN\easy-rsa\vars.bat.sample

文本内容部分摘录如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
set HOME=%ProgramFiles%\OpenVPN\easy-rsa 
//变量HOME表示easy-rsa文件夹的路径

set KEY_CONFIG=openssl-1.0.0.cnf
//变量KEY_SIZE表示生成的私钥大小,一般填写为1024或2048,默认为1024位,可根据自己的需要进行修改。

//由于稍后给客户端生成对应加密证书和私钥时,程序会要求我们输入一些注册信息。建议修改相关变量的默认值,这样在稍后生成客户端证书的时候,如果该信息项不输入就会采用默认值。
set KEY_COUNTRY=CN //国家(注:必须为两位字符)
set KEY_PROVINCE=GuangXi //省份
set KEY_CITY=GuiLin //城市
set KEY_ORG=GUET //机构
set KEY_EMAIL=***@126.com //邮箱
set KEY_CN=changeme //证书的通用名称(Common Name),相当于帐户名 (eg, your name or your server's hostname)
set KEY_NAME=changeme //用户姓名
set KEY_OU=changeme //部门名 Organizational Unit Name (eg, section)
set PKCS11_MODULE_PATH=changeme
set PKCS11_PIN=1234

按照如上所述进行修改,修改完毕后,保存,接下来进行配置操作

2.3 使用控制台创建服务端和客户端证书

在作为服务器端的电脑上,以管理员权限 打开 cmd , 并进入到

OpenVPN\easy-rsa

然后依次执行如下命令:

1. init-config「初始化配置,将 vars.bat.sample 文件的内容复制到 vars.bat。实际上,你也可以直接双击执行 easy-rsa 目录下的 init-config.bat 文件来代替这一步。」

2. vars「设置相应的局部环境变量,就是我们在 vars.bat.sample 文件中设置的内容」

3. clean-all「相关设置和清理工作」

命令执行结果如下所示:

1
2
3
4
5
6
7
8
9
10
11
Microsoft Windows [版本 10.0.10586]
(c) 2015 Microsoft Corporation。保留所有权利。
C:\Windows\system32>cd C:\Program Files\OpenVPN\easy-rsa
C:\Program Files\OpenVPN\easy-rsa>init-config
C:\Program Files\OpenVPN\easy-rsa>copy vars.bat.sample vars.bat
已复制 1 个文件。
C:\Program Files\OpenVPN\easy-rsa>vars
C:\Program Files\OpenVPN\easy-rsa>clean-all
系统找不到指定的文件。 //有时候会出现此句提示,可以被忽略
已复制 1 个文件。
已复制 1 个文件。

接下来执行如下命令:

4. build-ca「创建 CA 根证书及 key」

此处可修改此前预先设置的注册信息。

5. build-key-server server「创建服务端证书及 key,其中『server』可以自由设定」

命令执行结果如下所示:

1
2
3
4
5
6
7
C:\Program Files\OpenVPN\easy-rsa>build-key-server server
Common Name (eg, your name or your server's hostname) [changeme]:此处输入账户名
A challenge password []:此处输入密码

Certificate is to be certified until Jul 2 12:07:01 2026 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y

命令中的参数 server 指的是生成的证书文件名称,你可以按照自己的需要进行修改,不过后面的 Common Name 也应保持一致。最后程序会询问你是否注册并提交证书,两次均输入 y 即可。

6. build-dh「创建迪菲·赫尔曼密钥,生成 1024 bit 的key」

迪菲·赫尔曼密钥交换「Diffie–Hellman key exchange , 简称『D–H』」是一种安全协议。它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容。

7. build-key client「创建客户端证书及 key , 其中 `client` 可以自由设定」

此处如同第 5 步服务器部分的设置。

8. openvpn --genkey --secret keys/ta.key「可选操作,生成 ta.key」

这一步是可选操作,生成的 ta.key 主要用于防御 DoS、UDP 淹没等恶意攻击。命令中的第 3 个参数 keys / ta.key 表示生成的文件路径「含文件名」。

创建完证书后,我们会发现 easy-rsa 目录下多了一个 keys 文件夹。但如果参数填写不恰当,可能生成一些 0 字节的 crt 文件,那么就得重新生成证书。生成结束后,可按照如下表格分别将文件拷贝到客户端和服务端的 config 目录中。

服务器端 config 目录需要的文件包括:

文件名 位置 用途 保密 备注
ca.crt server + all clients Root CA certificate NO 核心 CA 证书
ca.key key signing machine only Root CA key YES 核心 CA 私钥
dh1024.pem server only Diffie Hellman parameters NO 如果最初的变量 KEY_SIZE 设为 2048,这里就是 dh2048.pem
server.crt server only Server Certificate NO 名称 server 根据个人设置有所不同
server.key server only Server Key YES 名称 server 根据个人设置有所不同
ta.key server + all clients 防御 DoS、UDP 淹没等恶意攻击 YES 名称也可自行设置,如果不需要防御攻击,可以不创建或复制此文件

客户端 config 目录需要的文件包括:

文件名 位置 用途 保密 备注
ca.crt server + all clients Root CA certificate NO 核心 CA 证书
client.crt client only Client Certificate NO 名称 client 根据个人设置有所不同
client1.key client only Client Key YES 名称 client 根据个人设置有所不同
ta.key server + all clients 防御 DoS、UDP 淹没等恶意攻击 YES 名称也可自行设置,如果不需要防御攻击,可以不创建或复制此文件

重要提醒:以上命令都在同一 cmd 中执行,如果你以后需要打开新窗口来执行命令(比如创建新的客户端证书):你不需要再执行 init-config 命令,除非你再次改动了 vars.bat.sample 文件;每一次打开新窗口时都需要先执行 vars 命令,后面才能执行其他命令。


:若要撤销 client2 证书,则执行以下命令:

vars
revoke-full client2

此时得到 crl.pem 文件,之后在服务端执行如下命令:

crl-verify crl.pem

3. 配置文件的修改与部署

上面已创建 OpenVPN 配置所需要的各种证书和私钥,现在可以为服务器和客户端设置对应的配置文件。

在 OpenVPN 的安装目录的 sample-config 文件夹中存放有 3 个示例模板文件 : server.ovpn、client.ovpn、sample.ovpn 。其中:

  • server.ovpn 是服务器的配置模板
  • client.ovpn 是客户端的配置模板
  • sample.ovpn 也可用作客户端配置模板,不过配置比较简单,不够全面。

按照官方的说法 , client.ovpn 可用于连接具有多个客户端的服务器端。

复制 server.ovpn 到服务器的 config 目录 , client.ovpn 到客户端的 config 目录,并在此基础上进行修改。在 OpenVPN 的配置文件中,前面带「#」或「;」的表示注释内容。

3.1 配置文件的简单使用

  • 修改客户端的 client.ovpn 的 remote 项,让它指向服务端外部 IP 地址,格式例如 : remote x.x.x.x 1194 , 1194 是服务端定义的端口,这个可以通过服务端的配置文件修改,服务端和客户端端口必须匹配。
  • 证书:在第 92, 93 行的「大概」位置,修改指定的 crt 和 key 文件,与之生成的证书文件名匹配。

3.2 编辑服务器端配置文件

server.ovpn 中所有用到的命令如下 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
local 192.168.0.2     #指定监听的本机 IP「因为有些计算机具备多个IP地址」,该命令是可选的,默认监听所有 IP 地址。
port 1194 #指定监听的本机端口号
proto udp #指定采用的传输协议,可以选择 tcp 或 udp
dev tun #指定创建的通信隧道类型,可选 tun 或 tap
ca ca.crt #指定 CA 证书的文件路径
cert server.crt #指定服务器端的证书文件路径
key server.key #指定服务器端的私钥文件路径
dh dh1024.pem #指定迪菲赫尔曼参数的文件路径
server 10.0.0.0 255.255.255.0 #指定虚拟局域网占用的 IP 地址段和子网掩码,此处配置的服务器自身占用 10.0.0.1
ifconfig-pool-persist ipp.txt #服务器自动给客户端分配 IP 后,客户端下次连接时,仍然采用上次的 IP 地址(第一次分配的IP保存在 ipp.txt中,下一次分配其中保存的 IP)。
tls-auth ta.key 0 #开启 TLS,使用 ta.key 防御攻击。服务器端的第二个参数值为 0,客户端的为 1
keepalive 10 120 #每 10 秒 ping 一次,连接超时时间设为 120 秒。
comp-lzo #开启 VPN 连接压缩,如果服务器端开启,客户端也必须开启
client-to-client #允许客户端与客户端相连接,默认情况下客户端只能与服务器相连接
persist-key
persist-tun #持久化选项可以尽量避免访问在重启时由于用户权限降低而无法访问的某些资源。
status openvpn-status.log #指定记录 OpenVPN 状态的日志文件路径
verb 3 #指定日志文件的记录详细级别,可选 0 - 9,等级越高日志内容越详细

3.3 编辑客户端配置文件

client.ovpn 中所有用到的命令如下 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
client         #指定当前 VPN 是客户端
dev tun #必须与服务器端的保持一致
proto udp #必须与服务器端的保持一致
remote 192.168.0.2 1194 //指定连接的远程服务器的实际 IP 地址和端口号
resolv-retry infinite #断线自动重新连接,在网络不稳定的情况下「例如:笔记本电脑无线网络」非常有用。
nobind #不绑定特定的本地端口号
persist-key
persist-tun
ca ca.crt #指定 CA 证书的文件路径
cert client.crt //指定当前客户端的证书文件路径
key client.key //指定当前客户端的私钥文件路径
ns-cert-type server #指定采用服务器校验方式
tls-auth ta.key 1 //如果服务器设置了防御 DoS 等攻击的 ta.key,则必须每个客户端开启;如果未设置,则注释掉这一行;
comp-lzo #与服务器保持一致
verb 3 #指定日志文件的记录详细级别,可选 0 - 9,等级越高日志内容越详细

4. OpenVPN 的启用

生成、修改、保存完毕后,我们可以在服务器端及客户端分别配置如下内容:

在服务器端 OpenVPN 安装目录的 config 文件夹下应包含如下文件:

在客户端 OpenVPN 安装目录的 config 文件夹下应包含如下文件:

5. 参考链接

  1. OpenVPN 维基百科
  2. OpenVPN 官方网站
  3. FreeBSD 平台 OpenVPN 的安装、配置客户端和服务端
  4. OpenVPN 下载、安装、配置及使用详解
  5. OpenVPN 安装、配置客户端和服务端,以及 OpenVPN 的使用「Windows 平台」