摘要
我们将使用 easy-rsa 工具来管理 PKI (Public Key Infrastructure, 公钥基础设施),这是一种推荐的最佳实践,可以简化证书的创建和管理,整个过程将在一个全新的 Ubuntu 服务器上完成。

第一步:准备工作
-
一台 Ubuntu 服务器:
- 推荐使用 Ubuntu 20.04 或 22.04 LTS 版本。
- 一个干净的、非生产环境的实例。
- 拥有
sudo权限的非 root 用户。 - 服务器拥有一个公网 IP 地址。
-
客户端设备:
您将用于连接 VPN 的电脑、手机或平板。
第二步:更新系统并安装依赖
登录到您的 Ubuntu 服务器,更新软件包列表并安装 OpenVPN 和 easy-rsa。

# 更新软件包列表 sudo apt update && sudo apt upgrade -y # 安装 OpenVPN 和 easy-rsa sudo apt install openvpn easy-rsa -y
第三步:设置 PKI (Public Key Infrastructure)
PKI 是用于创建和管理 SSL/TLS 证书的框架,我们将使用 easy-rsa 来构建它。
-
创建 PKI 目录结构
我们将在
/etc/openvpn/server/目录下创建一个名为easy-rsa的子目录来存放我们的密钥和证书。# 创建目录 sudo mkdir -p /etc/openvpn/server/easy-rsa # 将 easy-rsa 的示例配置文件复制到新目录 sudo cp -r /usr/share/easy-rsa/* /etc/openvpn/server/easy-rsa/
-
配置
vars文件vars文件用于存储证书生成时需要使用的默认变量,如国家、组织、邮箱等,编辑它以符合您的需求。sudo nano /etc/openvpn/server/easy-rsa/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@example.com" set_var EASYRSA_REQ_OU "My VPN OU" # 其他可选设置 set_var EASYRSA_KEY_SIZE 2048 # 密钥大小,2048或4096 set_var EASYRSA_ALGO rsa set_var EASYRSA_CA_EXPIRE 3650 # CA证书有效期 set_var EASYRSA_CERT_EXPIRE 365 # 服务器/客户端证书有效期
保存并退出 (
Ctrl+X, 然后按Y, 最后按Enter)。 -
初始化 PKI
切换到
easy-rsa目录并运行初始化脚本。cd /etc/openvpn/server/easy-rsa sudo ./easyrsa init-pki
-
构建 CA (Certificate Authority)
CA 是信任的根机构,所有其他证书都由它签名。
# 交互式创建 CA sudo ./easyrsa build-ca nopass
当提示时,它会使用
vars文件中的信息,您可以直接按 Enter 确认。nopass参数表示 CA 私钥不带密码,方便服务器自动启动。 -
生成服务器证书和密钥
我们为 OpenVPN 服务器本身生成证书和私钥。
# 创建服务器证书请求并签名 # 服务器名称可以自定义,这里用 "server" sudo ./easyrsa gen-req server nopass
再次确认信息,使用 CA 来签署这个请求:
sudo ./easyrsa sign-req server server
系统会问您是否要签署请求,并验证请求是否来自 CA,输入
yes并按 Enter。 -
生成 Diffie-Hellman 参数
DH 参数用于增强前向安全性,防止窃听。
sudo ./easyrsa gen-dh
这个过程可能需要几分钟时间。
-
生成 HMAC 密钥
HMAC 用于验证消息的完整性,可以防止某些攻击。
sudo openvpn --genkey --secret ta.key
-
生成客户端证书(可选但推荐)
为每个客户端生成唯一的证书是最安全的做法,这里我们为第一个客户端生成一个证书。
# 创建客户端证书请求 # 将 "client1" 替换为您的客户端名称 sudo ./easyrsa gen-req client1 nopass
注意:在实际使用中,您需要为每个连接的设备都执行此步骤,并为它们命名不同的名称(如
client2,phone,laptop等)。使用 CA 签署客户端证书:
sudo ./easyrsa sign-req client client1
输入
yes确认。
第四步:配置 OpenVPN 服务器
我们将所有生成的文件和配置文件放到正确的位置。
-
移动生成的文件
# 移动 CA 和服务器证书/密钥 sudo cp pki/ca.crt /etc/openvpn/server/ 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/ # (dh.pem 是 gen-dh 的输出文件) sudo cp ta.key /etc/openvpn/server/ # 设置正确的权限 sudo chmod 600 /etc/openvpn/server/*
-
创建服务器配置文件
我们将创建一个主配置文件
server.conf。sudo nano /etc/openvpn/server/server.conf
粘贴到文件中,请务必根据您的网络环境修改
server指令和push指令中的网段。# 协议和端口 port 1194 proto udp # 创建一个 TUN 虚拟网卡 dev tun # 服务器提供的 VPN 网段和子网掩码 # 这个网段不能与您服务器或客户端所在局域网的网段冲突! server 10.8.0.0 255.255.255.0 # 推送路由和 DNS 设置给客户端 push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 1.1.1.1" # 允许客户端之间相互通信 client-to-client # 为客户端分配固定 IP(可选) # client-config-dir /etc/openvpn/ccd # 在 ccd 目录下创建一个与客户端名同名的文件,内容为: ifconfig-push 10.8.0.2 255.255.255.0 # 使用密钥文件提高安全性 tls-crypt ta.key # 证书和密钥路径 ca ca.crt cert server.crt key server.key dh dh.pem # 使用加密算法 cipher AES-256-CBC auth SHA256 # 用户和组 user nobody group nogroup # 保持状态,避免频繁重启 persist-key persist-tun # 日志设置 status /var/log/openvpn/openvpn-status.log verb 3 explicit-exit-notify 1
保存并退出。
第五步:配置系统防火墙和网络转发
-
启用 IP 转发
VPN 客户端需要通过服务器访问互联网,因此必须开启服务器的 IP 转发功能。
# 编辑 sysctl.conf 文件 sudo nano /etc/sysctl.conf
找到或添加下面这行,确保它没有被注释掉():
net.ipv4.ip_forward=1
保存后,使更改立即生效:
sudo sysctl -p
-
配置 UFW (Uncomplicated Firewall)
如果您使用 UFW(Ubuntu 默认防火墙),需要允许 OpenVPN 端口和 NAT 转发。
# 允许
