在当今注重网络安全的时代,构建一个个人或企业专属的虚拟专用网络(VPN)至关重要,OpenVPN 作为一款开源、强大且灵活的 VPN 解决方案,深受广大用户信赖,本文将详细介绍如何在 CentOS 7 系统上,一步步搭建一个功能完整、安全可靠的 OpenVPN 服务器,涵盖从环境准备到客户端配置的全过程。

环境准备
在开始之前,请确保您拥有一台公网可达的 CentOS 7 服务器,并且拥有 root 权限或 sudo 权限,整个搭建过程将围绕这台服务器展开。
更新系统软件包到最新版本,这是一个良好的运维习惯,可以修复已知的安全漏洞和软件缺陷。
yum update -y
安装 OpenVPN 所需的软件包,CentOS 7 的默认源中不包含 OpenVPN,因此我们需要先安装 EPEL (Extra Packages for Enterprise Linux) 扩展源。
yum install epel-release -y yum install openvpn easy-rsa -y
这里,openvpn 是核心服务程序,而 easy-rsa 则是一个用于管理证书颁发机构(CA)和生成各类密钥、证书的实用工具集,是保障 VPN 通信安全的基石。
配置证书颁发机构 (CA)
OpenVPN 的安全性依赖于 SSL/TLS 协议,其核心是公钥基础设施(PKI),我们需要创建一个私有的 CA 来签发服务器和客户端的证书。
-
复制并准备 Easy-RSA 脚本 将
easy-rsa脚本目录复制到 OpenVPN 的配置目录下,便于统一管理。mkdir -p /etc/openvpn/easy-rsa cp -r /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa/ cd /etc/openvpn/easy-rsa
-
初始化 PKI 并生成 CA 根证书 Easy-RSA 3.x 版本使用了更简洁的命令。
./easyrsa init-pki ./easyrsa build-ca nopass
init-pki会创建一个名为pki的目录用于存放所有证书和密钥。build-ca nopass会生成 CA 根证书(ca.crt)和私钥(ca.key),nopass参数表示不为私钥设置密码,方便自动化管理,但在生产环境中建议设置强密码。
生成服务器证书与密钥
有了 CA 之后,我们就可以为 OpenVPN 服务器生成其专属的证书和密钥了。
./easyrsa gen-req server nopass ./easyrsa sign-req server server
第一条命令 gen-req server nopass 生成了服务器的证书请求文件(server.req)和私钥(server.key),第二条命令 sign-req server server 使用我们之前创建的 CA 来签署这个请求,生成最终的服务器证书(server.crt),在签署过程中,系统会要求你确认,输入 yes 即可。

为了增强安全性,还需要生成 Diffie-Hellman (DH) 参数,用于在密钥交换过程中提供前向保密性。
./easyrsa gen-dh
这个过程可能会根据服务器性能花费几分钟时间,完成后,会在 pki 目录下生成 dh.pem 文件。
生成一个 HMAC 签名(ta.key),用于抵御 DoS 攻击和 UDP 端口泛洪攻击。
openvpn --genkey --secret /etc/openvpn/ta.key
至此,服务器所需的所有证书和密钥文件都已准备就绪,下表列出了关键文件及其用途:
| 文件名 | 路径 | 用途 |
|---|---|---|
ca.crt |
/etc/openvpn/easy-rsa/pki/ |
CA 根证书,用于验证所有证书的合法性 |
server.crt |
/etc/openvpn/easy-rsa/pki/issued/ |
OpenVPN 服务器公钥证书 |
server.key |
/etc/openvpn/easy-rsa/pki/private/ |
OpenVPN 服务器私钥,需严格保密 |
dh.pem |
/etc/openvpn/easy-rsa/pki/ |
Diffie-Hellman 参数文件 |
ta.key |
/etc/openvpn/ |
HMAC 签名文件,增强安全性 |
配置 OpenVPN 服务器
OpenVPN 提供了一个示例配置文件,我们可以基于它进行修改。
cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/
使用文本编辑器(如 vi 或 nano)打开 /etc/openvpn/server.conf,进行以下关键配置:
port 1194 proto udp dev tun ca ca.crt cert server.crt key server.key dh dh.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 8.8.4.4" tls-auth ta.key 0 cipher AES-256-CBC auth SHA256 user nobody group nobody persist-key persist-tun status openvpn-status.log verb 3
配置项解释:
port和proto:指定 OpenVPN 监听的端口和协议,UDP 性能更佳。dev tun:使用 TUN 虚拟网络设备,创建一个路由模式的 VPN。ca,cert,key,dh:指定我们刚刚生成的证书和密钥文件的路径。server 10.8.0.0 255.255.255.0:为 VPN 客户端分配一个虚拟网段。push "redirect-gateway...":将客户端的所有流量都通过 VPN 服务器转发。push "dhcp-option DNS...":为客户端指定 DNS 服务器。tls-auth ta.key 0:启用 HMAC 签名验证。user nobody,group nobody:以低权限用户运行 OpenVPN 服务,提高安全性。
配置网络与防火墙
为了让客户端的流量能够通过 VPN 服务器访问互联网,需要开启内核的 IP 转发功能。
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p
CentOS 7 默认使用 firewalld 作为防火墙管理工具,我们需要配置防火墙,允许 VPN 流量并设置 NAT。
# 添加 OpenVPN 服务到防火墙 firewall-cmd --add-service=openvpn --permanent # 添加 tun0 接口到信任区域 firewall-cmd --add-interface=tun0 --permanent # 设置地址伪装(MASQUERADE),实现 NAT firewall-cmd --add-masquerade --permanent # 重新加载防火墙配置 firewall-cmd --reload
启动服务并生成客户端证书
可以启动 OpenVPN 服务并设置其开机自启。

systemctl start openvpn@server systemctl enable openvpn@server
检查服务状态和 tun0 接口是否已成功创建:
systemctl status openvpn@server ip addr show tun0
为客户端生成证书,为名为 client1 的客户端生成证书:
cd /etc/openvpn/easy-rsa ./easyrsa gen-req client1 nopass ./easyrsa sign-req client client1
生成后,需要将以下文件安全地传输到客户端设备上:
/etc/openvpn/easy-rsa/pki/ca.crt/etc/openvpn/easy-rsa/pki/issued/client1.crt/etc/openvpn/easy-rsa/pki/private/client1.key/etc/openvpn/ta.key
在客户端,创建一个 .ovpn 配置文件,内容如下:
client dev tun proto udp remote YOUR_SERVER_IP 1194 resolv-retry infinite nobind user nobody group nogroup persist-key persist-tun ca ca.crt cert client1.crt key client1.key remote-cert-tls server tls-auth ta.key 1 cipher AES-256-CBC auth SHA256 verb 3
将 YOUR_SERVER_IP 替换为你的服务器公网 IP 地址,将此文件与下载的四个证书/密钥文件放在同一目录,即可使用 OpenVPN 客户端连接。
相关问答FAQs
Q1:客户端可以成功连接到 VPN 服务器,但无法访问互联网,是什么原因? A: 这是一个非常常见的网络配置问题,通常由以下两个原因导致:
- IP 转发未开启:请检查
/etc/sysctl.conf文件中是否包含net.ipv4.ip_forward = 1,并使用sysctl -p使其生效。 - 防火墙 NAT 规则错误:请确认
firewalld已经正确配置了地址伪装,可以使用firewall-cmd --query-masquerade命令检查,如果返回no,请重新执行firewall-cmd --add-masquerade --permanent并firewall-cmd --reload。
Q2:如何撤销一个已发放的客户端证书,例如禁用丢失设备的访问权限? A: Easy-RSA 提供了便捷的证书撤销功能,操作步骤如下:
- 进入 Easy-RSA 目录:
cd /etc/openvpn/easy-rsa。 - 执行撤销命令,例如撤销
client1的证书:./easyrsa revoke client1,过程中需要输入yes确认。 - 生成新的证书吊销列表(CRL):
./easyrsa gen-crl。 - 将生成的 CRL 文件复制到 OpenVPN 配置目录:
cp pki/crl.pem /etc/openvpn/。 - 编辑
/etc/openvpn/server.conf文件,添加一行crl-verify crl.pem。 - 重启 OpenVPN 服务使配置生效:
systemctl restart openvpn@server。 完成以上步骤后,client1的证书将被列入黑名单,无法再连接到 VPN 服务器。