重要提示:系统选择
虽然本教程以 CentOS 为例,但请注意:

- CentOS 7 已于 2025 年 6 月 30 日停止维护,强烈建议使用 CentOS Stream 8/9 或 Rocky Linux / AlmaLinux,本教程在 CentOS Stream 8/9 和 Rocky Linux 9 上测试通过。
- SELinux:CentOS 默认启用 SELinux,这会影响 OpenVPN 的正常运行,教程中会包含必要的 SELinux 配置。
第一部分:服务器端配置
步骤 1: 更新系统并安装依赖
登录到你的 CentOS 服务器,更新系统并安装 OpenVPN 和 easy-rsa。
# 更新系统所有包 sudo dnf update -y # 安装 OpenVPN 和 easy-rsa sudo dnf install -y openvpn easy-rsa
步骤 2: 准备证书颁发机构 和密钥
我们需要创建一个私有的 CA 来签发服务器和客户端的证书。
-
创建一个工作目录:
# 创建一个 easy-rsa 的工作目录 make-cadir ~/openvpn-ca cd ~/openvpn-ca
-
编辑
vars文件: 这个文件用于设置 CA 的默认参数,比如国家、省份、城市、组织名等,为了方便,我们让这些参数在创建证书时自动填充。
(图片来源网络,侵删)nano vars
找到以下几行,去掉开头的 并修改为你自己的信息(或者直接使用默认值):
set_var EASYRSA_REQ_COUNTRY "CN" set_var EASYRSA_REQ_PROVINCE "Beijing" set_var EASYRSA_REQ_CITY "Beijing" set_var EASYRSA_REQ_ORG "My Company" set_var EASYRSA_REQ_EMAIL "admin@mycompany.com" set_var EASYRSA_REQ_OU "MyOrganizationalUnit"
保存并退出 (
Ctrl+X,Y,Enter)。 -
初始化 PKI: 这会创建一个
pki目录,里面存放所有的证书和密钥。./easyrsa init-pki
输出:
(图片来源网络,侵删)... init-pki complete; you may now create a CA or requests. Your newly created PKI dir is: /root/openvpn-ca/pki -
构建 CA 证书: 这会创建一个根证书,用于签发所有其他证书。
./easyrsa build-ca nopass
nopass表示 CA 私钥不设置密码,方便服务器自动启动,如果安全性要求极高,可以去掉此参数,但需要手动输入密码才能启动 OpenVPN。- 系统会提示你输入 Common Name (CN),直接按回车使用
vars文件中设置的值。
~/openvpn-ca/pki/ca.crt和~/openvpn-ca/pki/private/ca.key已经生成。ca.key是最核心的私钥,务必妥善保管!
步骤 3: 创建服务器证书和密钥
-
生成服务器证书请求:
./easyrsa gen-req server nopass
server是我们给服务器证书起的名字。- 同样,CN 直接回车使用默认值。
-
用 CA 签发服务器证书:
./easyrsa sign-req server server
系统会问你
Confirm request details: (y/n),输入y并回车,然后需要输入 CA 的密码(如果你在build-ca时设置了密码的话)。 -
创建强 Diffie-Hellman 密钥: 这用于增强前向保密性,过程可能需要几分钟时间。
./easyrsa gen-dh
-
生成 HMAC 密钥: 用于增加 TLS 认证层的安全性,防止 DDoS 攻击。
openvpn --genkey --secret ta.key
至此,服务器端需要的所有证书和密钥都已生成在 ~/openvpn-ca/pki/ 目录下,我们需要将以下文件复制到 OpenVPN 的配置目录:
# 创建配置目录 sudo mkdir -p /etc/openvpn/server # 复制服务器证书、密钥和DH文件 sudo cp pki/issued/server.crt /etc/openvpn/server/ sudo cp pki/private/server.key /etc/openvpn/server/ sudo cp pki/dh.pem /etc/openvpn/server/ # 文件名可能是 dh2048.pem 或类似 # 复制CA证书和HMAC密钥 sudo cp pki/ca.crt /etc/openvpn/server/ sudo cp ta.key /etc/openvpn/server/ # 设置正确的权限 sudo chmod 600 /etc/openvpn/server/*
步骤 4: 创建服务器配置文件
我们将创建一个主配置文件 server.conf。
sudo nano /etc/openvpn/server/server.conf
粘贴进去,并根据需要修改注释部分:
# 监听地址和端口 (0.0.0.0 表示监听所有网卡) port 1194 # 协议,推荐使用 UDP,速度更快,如需使用 TCP,请将下面两行注释掉 proto udp # 如果使用 TCP,取消下面两行的注释 # proto tcp # port 443 # 使用 TUN 虚拟网卡设备 dev tun # CA 文件路径 ca ca.crt # 服务器证书和密钥路径 cert server.crt key server.key # Diffie-Hellman 文件路径 dh dh.pem # 网络配置:服务器将为客户端分配此网段的 IP 地址 # 10.8.0.0 是服务器内网,255.255.255.0 是子网掩码 server 10.8.0.0 255.255.255.0 # 推导客户端配置,使其能访问服务器后面的局域网 # 这会将客户端的网关指向 OpenVPN 服务器 push "redirect-gateway def1 bypass-dhcp" # 推导 DNS 服务器地址,让客户端通过 VPN 解析域名 # 这里使用 Google DNS 和 Cloudflare DNS 作为示例 push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 1.1.1.1" # 保持客户端连接,120 秒内没有数据传输,则认为客户端断开 keepalive 10 120 # 使用 LZO 压缩数据 comp-lzo # 用户和 OpenVPN 运行时使用的用户/组 # 为了安全,OpenVPN 不应以 root 身份运行 user nobody group nobody # 持久化密钥,避免重启时重新读取 persist-key persist-tun # 提高日志级别,方便排查问题 verb 3 # 启用 TLS 认证 tls-auth ta.key 0 # 指定使用的 OpenSSL 加密算法,推荐使用强加密套件 cipher AES-256-CBC # 控制文件,用于防止服务重复启动 crl-verify crl.pem
步骤 5: 配置网络和防火墙
-
启用 IP 转发: 编辑
/etc/sysctl.conf文件:sudo nano /etc/sysctl.conf
找到
#net.ipv4.ip_forward=1这一行,去掉 并确保其值为1。net.ipv4.ip_forward=1
保存后,立即生效:
sudo sysctl -p
-
配置防火墙: 使用
firewall-cmd来开放端口并允许 NAT 转发。# 添加永久规则,开放 1194/udp 端口 sudo firewall-cmd --permanent --add-port=1194/udp # 添加 MASQUERADE 规则,这是让服务器能将客户端流量转发到互联网的关键 sudo firewall-cmd --permanent --add-masquerade # 重新加载防火墙使规则生效 sudo firewall-cmd --reload
-
配置 SELinux: OpenVPN 需要访问网络和 TUN 设备,需要为其设置正确的 SELinux 上下文。
# 允许 OpenVPN 绑定到非默认端口 (如 443) sudo semanage port -a -t openvpn_port_t -p tcp 443 sudo semanage port
