OpenVPN服务器搭建完整指南:从证书生成到多平台客户端配置
本文旨在详细介绍如何在 CentOS 与 Ubuntu 操作系统上,利用 OpenVPN 软件搭建一个基础的虚拟专用网络(VPN)服务。我们将涵盖从生成安全证书到最终客户端连接的全过程。
生成所需密钥和证书
OpenVPN 依赖于公钥基础设施(PKI)来确保通信安全,而 Easy-RSA 工具则是管理所需密钥与证书的得力助手。值得注意的是,Easy-RSA 存在两个主要发行版本(2和3),其操作命令存在差异。以下将分别阐述这两个版本的具体使用方法,您可根据所安装的版本选择对应的操作流程。
Easy-RSA 2 版本操作流程
安装步骤
在 Ubuntu 16.04 系统中,通过 apt 包管理器安装的通常是 Easy-RSA 2 版本。
# apt-get install -y easy-rsa
安装完毕后,您可以在 /usr/share/easy-rsa/ 目录下找到用于生成密钥对和证书的脚本。出于安全考虑,建议将这些脚本复制到 /root 目录下进行操作,以免生成的敏感文件留存于公共目录。
# cp -r /usr/share/easy-rsa /root
生成CA根证书与密钥
后续所有操作都应在 /root/easy-rsa 目录下执行。首先,我们需要创建证书颁发机构(CA)的根密钥和证书,它将用于为后续的VPN服务器及客户端证书进行签名。
-
编辑
vars环境变量文件 此文件定义了生成密钥和证书所需的各种参数。请定位并修改KEY_COUNTRY、KEY_PROVINCE、KEY_CITY、KEY_ORG和KEY_EMAIL这几个变量的值,务必根据您的实际情况填写,且不可留空。示例如下:export KEY_COUNTRY="CN" export KEY_PROVINCE="ZJ" export KEY_CITY="HZ" export KEY_ORG="MyCompany" export KEY_EMAIL="support@mycompany.com"文件中其余变量的含义可参考注释,通常无需改动。保存文件后,执行以下命令使环境变量生效:
# source ./vars -
执行CA构建脚本 接下来,运行以下命令来生成CA的密钥和证书:
# ./build-ca脚本会交互式地请您确认证书的各项字段信息,其默认值即来自刚才设置的
vars文件。命令执行成功后,生成的CA密钥ca.key和证书ca.crt将保存在keys目录中。
生成VPN服务器证书与密钥
在拥有CA证书之后,即可为VPN服务器签发专属证书。执行如下命令:
# ./build-key-server myvpn
此命令需要一个参数来指定证书的通用名称(CN),本例中为 myvpn,请根据您的规划进行命名。脚本同样会提示输入相关信息。完成后,keys 目录下会出现以指定CN为前缀的服务器证书(myvpn.crt)和私钥(myvpn.key)。
生成客户端证书与密钥
每个需要连接的客户端也都需要一套由CA签名的证书和密钥。生成命令与服务器类似:
# ./build-key hongling
这里的参数 hongling 代表该客户端的CN。操作完成后,keys 目录中会新增 hongling.key 私钥和 hongling.crt 证书文件。请为每一个客户端重复此步骤以创建独立的凭证。
生成迪菲-赫尔曼(Diffie-Hellman)参数
该参数用于在VPN服务器与客户端之间安全地交换密钥。执行以下命令生成:
# ./build-dh
此脚本运行后,将在 keys 目录下生成 dh2048.pem 文件(文件名中的2048代表密钥长度,默认值可在 vars 文件中调整)。
Easy-RSA 3 版本操作流程
安装步骤
在 CentOS 7.5 系统上,首先需要确保已启用 EPEL 扩展软件源。
# yum repolist
若列表中没有显示 epel 源,则需先行安装:
# yum install -y epel-release
随后即可安装 Easy-RSA:
# yum install -y easy-rsa
# yum list installed easy-rsa
此时安装的应为 Easy-RSA 3 版本。其文件通常位于 /usr/share/easy-rsa 目录下,实际可能是一个指向具体版本子目录(如 3.0.3)的链接。同样出于安全考虑,将其复制到 root 目录:
# cp -r /usr/share/easy-rsa/3.0.3 /root/easyrsa
后续操作均在 /root/easyrsa 目录中进行。
生成CA根证书与密钥
首先需要初始化PKI(公钥基础设施)环境:
# ./easyrsa init-pki
此命令会在当前目录创建 pki 子目录,所有后续生成的文件都将存储于此。注意:如果 pki 目录已存在,该命令会清空其中所有文件,因此也可用于彻底重置所有密钥材料。
接下来,创建CA的密钥和证书:
# ./easyrsa build-ca
命令会要求设置CA私钥的密码并指定证书的CN。此密码在后续为其他证书签名时必须提供。成功执行后,pki 目录下会生成 ca.key 和 ca.crt 文件。
生成VPN服务器证书与密钥
此过程分为两步:生成私钥及签名请求,然后使用CA进行签名。
-
生成请求:
# ./easyrsa gen-req myvpn参数
myvpn是服务器实体的名称,将用于命名文件并作为证书的默认CN。命令会提示设置私钥密码(启动VPN服务器时需要)并确认CN。生成的签名请求文件(myvpn.req)和私钥文件(myvpn.key)将分别置于pki/reqs/和pki/private/目录。 -
签发证书:
# ./easyrsa sign-req server myvpn第一个参数指定证书类型为
server,第二个参数myvpn必须与上一步的实体名一致。命令会要求确认证书信息并输入CA私钥的密码。签发后的服务器证书myvpn.crt将保存在pki/issued/目录。
生成VPN客户端证书与密钥
流程与生成服务器证书完全一致,仅在签名时指定类型为 client。例如,为用户 hongling 创建证书:
# ./easyrsa gen-req hongling
# ./easyrsa sign-req client hongling
完成后,将在对应目录生成 hongling.key、hongling.req 和 hongling.crt 文件。
生成迪菲-赫尔曼参数文件
执行以下命令生成密钥交换所需的参数文件:
# ./easyrsa gen-dh
生成的2048位参数文件 dh.pem 将位于 pki 目录下。
安装与配置VPN服务器
安装OpenVPN软件包
- 在Ubuntu系统上:
# apt-get install -y openvpn - 在CentOS系统上(确保EPEL源已启用):
# yum install -y openvpn
配置文件准备与修改
OpenVPN安装后,其示例配置文件通常位于 /usr/share/doc/openvpn 或类似路径(具体版本号可能不同)。找到 server.conf 示例文件,将其复制到 /etc/openvpn/server/ 目录下,并以您的VPN服务器CN命名(例如 myvpn.conf)。如果目标目录不存在,请手动创建。
# cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/server/myvpn.conf
接着,将之前生成的CA证书、服务器证书与私钥、以及DH参数文件复制到服务器配置目录:
# cp /root/easyrsa/pki/ca.crt /etc/openvpn/server/
# cp /root/openvpn/easyrsa/pki/issued/myvpn.crt /etc/openvpn/server/
# cp /root/easyrsa/pki/private/myvpn.key /etc/openvpn/server/
# cp /root/easyrsa/pki/dh.pem /etc/openvpn/server/
现在,编辑服务器配置文件 /etc/openvpn/server/myvpn.conf,进行以下几项基本修改:
- 指定服务器证书与私钥:找到
cert和key指令,将其值修改为您的实际文件名。cert myvpn.crt key myvpn.key # 此文件需严格保密 - 指定DH参数文件:找到
dh指令,修改为对应的文件名。dh dh.pem - 禁用TLS-auth:找到
tls-auth指令(如果存在),将其注释或删除,因为我们在本例中未生成相关文件。
启用系统IP转发功能
由于我们使用TUN模式,VPN服务器需要充当网关,因此必须启用操作系统的IP转发功能。
- 临时启用(立即生效):
# sysctl -w net.ipv4.ip_forward=1 - 永久启用(重启后生效):编辑
/etc/sysctl.conf文件,确保包含如下行:net.ipv4.ip_forward=1
防火墙配置
如果服务器系统启用了防火墙,需要为其开放OpenVPN的通信端口。
CentOS (firewalld)
- 检查OpenVPN服务预定义的端口(默认为1194/udp):
# firewall-cmd --permanent --info-service=openvpn - 若需修改端口(例如改为2194/udp),可更新服务定义:
# firewall-cmd --permanent --service=openvpn --add-port=2194/udp # firewall-cmd --permanent --service=openvpn --remove-port=1194/udp - 查看当前已放行的服务,并将OpenVPN服务加入永久规则,然后重载配置使其生效:
# firewall-cmd --permanent --add-service=openvpn # firewall-cmd --reload
Ubuntu
(此处根据原文提示为“待补充”,在实际部署时,若使用ufw,可执行 sudo ufw allow 1194/udp 来开放端口。)
配置系统服务并启动
-
检查或创建服务单元文件:查看
/lib/systemd/system/目录下是否存在openvpn-server@.service文件。如果没有,可以复制openvpn@.service并重命名,同时需要将其中的工作目录和配置文件路径从/etc/openvpn更改为/etc/openvpn/server。例如修改WorkingDirectory和ExecStart中的相关路径。WorkingDirectory=/etc/openvpn/server ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn/server --script-security 2 --config /etc/openvpn/server/%i.conf --writepid /run/openvpn/%i.pid -
启用并启动服务:
# systemctl enable openvpn-server@myvpn # systemctl start openvpn-server@myvpn注意:服务名中
@符号后的部分(本例为myvpn)必须与/etc/openvpn/server/目录下配置文件的前缀(即myvpn.conf)一致。 -
处理私钥密码:启动服务时,系统可能会提示通过
systemd-tty-ask-password-agent工具输入VPN服务器私钥的密码。您可以在当前终端直接运行该代理并按提示输入密码。 -
验证服务状态:使用以下命令检查服务是否成功运行:
# systemctl status openvpn-server@myvpn成功启动后,系统会增加一个TUN虚拟网络设备(默认名称为
tun0),其IP地址通常是VPN子网的网关地址(默认配置下为10.8.0.1)。可以通过ip address命令查看。
使用密码文件自动提供私钥密码
为避免每次启动都手动输入密码,可以将密码保存到文件中。
-
在服务器配置目录创建密码文件,文件名建议与配置前缀一致:
# echo "mypassword" > /etc/openvpn/server/myvpn.pass(请将
mypassword替换为实际的私钥密码) -
修改系统服务单元文件 (
/lib/systemd/system/openvpn-server@.service),在ExecStart行的命令中添加--askpass %i.pass参数。ExecStart=/usr/sbin/openvpn --status %t/openvpn-server/status-%i.log --status-version 2 --suppress-timestamps --config %i.conf --askpass %i.pass此后启动服务,OpenVPN将自动从该文件读取密码。
准备客户端配置文件
不同操作系统的客户端软件虽不同,但所需的配置文件与证书资源是一致的。我们首先为特定客户端(例如用户 hongling)准备一个包含所有必要文件的配置包。
-
创建一个专用目录来存放该客户端的全部文件:
# mkdir -p /root/vpnclient/hongling -
从OpenVPN示例目录中找到
client.conf文件,复制到上述目录并重命名以作标识,同时复制CA证书及该客户端的证书和私钥:# cp /usr/share/doc/openvpn/sample/sample-config-files/client.conf /root/vpnclient/hongling/hongling.conf # cp /root/easyrsa/pki/ca.crt /root/vpnclient/hongling/ # cp /root/easyrsa/pki/private/hongling.key /root/vpnclient/hongling/ # cp /root/easyrsa/pki/issued/hongling.crt /root/vpnclient/hongling/ -
修改客户端配置文件
hongling.conf,使其与服务器配置匹配:- 指定服务器地址:修改
remote指令,将其指向您的VPN服务器域名或IP地址及正确端口(默认1194)。remote myvpn.com 1194 - 指定客户端证书与私钥:修改
cert和key指令,指向客户端的实际文件名。cert hongling.crt key hongling.key - 禁用TLS-auth:如同服务器配置,注释或删除
tls-auth指令。
- 指定服务器地址:修改
最后,将这个 /root/vpnclient/hongling 目录下的所有文件安全地传输到客户端计算机上,以备后续连接使用。
各平台客户端安装与连接指南
以下操作均假设您已将上一步准备好的客户端配置包下载至本地。
Linux 客户端
在CentOS或Ubuntu客户端上,同样可以通过包管理器安装 openvpn 软件包。将配置文件、证书和密钥放在一个安全目录(如 /root/hongling)后,有多种启动方式:
-
前台运行(调试推荐):
# cd /root/hongling # openvpn --config hongling.conf程序将在前台运行,并提示输入客户端私钥的密码,所有日志输出到当前终端。
-
后台运行:如需后台运行,需将密码存入文件,然后启动:
# echo "client_key_password" > /root/hongling/hongling.pass # openvpn --config /root/hongling/hongling.conf --cd /root/hongling --daemon --askpass /root/hongling/hongling.pass日志将写入系统日志。
-
配置为系统服务:
- 将客户端配置文件、证书、密钥及密码文件(如
hongling.pass)复制到/etc/openvpn/client/目录。 - 确保存在或创建适配的systemd服务单元文件
openvpn-client@.service(可基于openvpn@.service修改,调整工作目录和配置文件路径为/etc/openvpn/client,并在ExecStart中添加--askpass /etc/openvpn/client/%i.pass)。 - 启用并启动服务:
# systemctl enable openvpn-client@hongling # systemctl start openvpn-client@hongling
- 将客户端配置文件、证书、密钥及密码文件(如
连接验证:成功连接后,使用 ip address 命令应能看到一个新的TUN设备(如 tun0)并获得VPN内网IP(如 10.8.0.10)。此时应能ping通VPN服务器的网关IP(默认 10.8.0.1)。
macOS 客户端
在macOS上,通常使用图形化客户端 Tunnelblick。
- 安装Tunnelblick。
- 打开Tunnelblick,进入“配置”窗口。
- 打开Finder,进入存放客户端配置文件的目录。
- 将
.conf或.ovpn配置文件直接拖拽到Tunnelblick的配置列表中。
- 在配置列表中选择刚添加的配置,点击右下角的“连接”按钮。

- 连接成功后,可在终端中ping通VPN网关地址以验证网络连通性。如有问题,可通过Tunnelblick的日志功能进行排查。
Windows 客户端
Windows系统可使用官方OpenVPN GUI客户端。
- 从OpenVPN社区网站下载Windows安装程序并完成安装。
- 安装后,用户目录下会生成
OpenVPN文件夹(如C:\Users\<用户名>\OpenVPN\)。 - 将客户端配置文件(
.conf或.ovpn)、CA证书(.crt)、客户端证书(.crt)和私钥(.key)一同复制到OpenVPN\config\子目录下。 - 启动“OpenVPN GUI”程序(通常以系统托盘图标形式运行)。
- 右键点击系统托盘中的OpenVPN图标,选择“Settings”。

- 在设置窗口的“Advanced”选项卡中,将“Extension”字段的值改为您的配置文件后缀(例如
conf)。
- 保存设置后,再次右键点击托盘图标,在弹出菜单中选择“Connect”。

- 连接建立后,可以打开命令提示符(cmd),尝试ping VPN网关地址以测试连接。
