Ubuntu 22.04 安装 OpenVPN 指南
Ubuntu 22.04 上 apt 在线与 deb 离线两种方式安装 OpenVPN 2.5.11 与 easy-rsa 证书体系,配置 server.ovpn 服务端并 systemd 托管,含真实回显、验证、FAQ 与卸载,已在 Ubuntu 22.04 实测通过。
Ubuntu 22.04 安装 OpenVPN 指南
目标:在 Ubuntu 22.04 服务器上用最主流的方式安装并托管经典 SSL VPN——OpenVPN 2.5.11 服务端,配合 easy-rsa 建立完整证书体系,配置
server.ovpn并用 systemd 管理。已在 Ubuntu 22.04(x86_64)真实环境全流程实测通过,命令与回显均照实整理。
一、环境信息
| 项 | 值 |
|---|---|
| 操作系统 | Ubuntu 22.04.5 LTS |
| 内核架构 | x86_64 |
| OpenVPN | 2.5.11(apt 源 / deb 包均相同版本) |
| Easy-RSA | 3.0.8 |
| OpenSSL | 3.0.2(15 Mar 2022) |
| 隧道设备 | tun(/dev/net/tun),需内核 tun 支持 |
| 服务监听 | UDP 1194 |
| 虚拟网段 | 10.8.0.0/24,服务端 tun0 = 10.8.0.1 |
⚠️ 注意:OpenVPN 使用 tun/tap 虚拟隧道设备,依赖内核的 TUN 模块。需确保服务器内核已加载 tun(
modprobe tun),且存在/dev/net/tun设备节点,否则服务端启动会报Cannot open TUN/TAP dev类错误。
二、前置条件
- root 权限(或具备
sudo的账号,文档统一用 root 演示)。 - 服务器可连通公网:用于在线安装与客户端访问。
- 防火墙/UDP 端口:放行
UDP 1194(若使用服务端proto tcp则放行 TCP 1194)。 - 内网可自行决定,客户端仍需能路由到服务端地址。
安装前先更新软件源并确认版本:
apt-get update
apt-cache policy openvpn easy-rsa
💡 说明:
easy-rsa用于生成 OpenVPN 所需的 CA 与证书;OpenVPN 客户端无需 easy-rsa(证书由服务器统一签发),但本指南在服务端一并安装以便签发。
三、版本选型说明
OpenVPN 无独立「大版本」营销号,Ubuntu 22.04 官方源固定提供 2.5.11 这一维护成熟分支;社区同时提供 2.6.x(新特性,如 tls-crypt-v2、--data-ciphers 默认更强)。选择建议:
- 生产保守:沿用发行版源内的 2.5.11,随系统安全更新。
- 想用最新特性:走 2.6.x 二进制/源码(跨发行版时从官方社区仓库或源码构建,见常见问题小节)。
- 本指南以发行版源 2.5.11 为准,下文所有命令与输出均取自该版本。
四、安装方案 A:apt 在线安装(推荐)
4.1 安装 openvpn 与 easy-rsa
apt-get -y install openvpn easy-rsa
实测关键回显(节选):
Setting up openvpn (2.5.11-0ubuntu0.22.04.5) ...
Created symlink /etc/systemd/system/multi-user.target.wants/openvpn.service → /lib/systemd/system/openvpn.service.
/usr/sbin/policy-rc.d returned 101, not running 'start openvpn.service'
(上述回显末尾省略了 dpkg 配置阶段不受影响的日志行。)
安装后确认版本:
openvpn --version | head -3
实测输出:
OpenVPN 2.5.11 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Sep 23 2026
library versions: OpenSSL 3.0.2 15 Mar 2022, LZO 2.10
Originally developed by James Yonan
确认 easy-rsa 版本:
/usr/share/easy-rsa/easyrsa --version
实测输出(节选):
EasyRSA Version Information
Version: 3.0.8
SSL Lib: OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
Git Commit: f12e00e53b4f486ce3d119ca429198780fa694ac
4.2 安装后生成的文件
dpkg -L openvpn 可列出包内文件,常见关键位置:
/etc/openvpn/ # 配置目录(server.conf/client.conf 放这里)
/usr/sbin/openvpn # 主程序
/lib/systemd/system/openvpn.service # 模板服务
/lib/systemd/system/openvpn@.service
/lib/systemd/system/openvpn-server@.service
/lib/systemd/system/openvpn-client@.service
/etc/openvpn/update-resolv-conf # 拨号时更新 DNS 的辅助脚本(随 resolvconf 提供)
五、安装方案 B:deb 离线包安装(断网备选)
当服务器无法访问在线源,或需在隔离网络批量化部署时,可在一台可联网的同版本机器上先用 apt-get download 拉取 .deb,再离线 dpkg -i 安装。
5.1 联网侧下载 deb 包
apt-get -y install --download-only openvpn easy-rsa
ls -l /var/cache/apt/archives/openvpn_*.deb
实测文件名:
-rw-r--r-- 1 root root 619014 Sep 30 12:34 openvpn_2.5.11-0ubuntu0.22.04.5_amd64.deb
把该 .deb(连同 easy-rsa 及其依赖 .deb)拷贝到目标服务器后执行:
dpkg -r openvpn # 若已安装旧版,先移除
dpkg -i openvpn_2.5.11-0ubuntu0.22.04.5_amd64.deb
实测回显(节选,仅展示与业务相关的行):
debconf: falling back to frontend: Teletype
A reboot is required to replace the running openvpn.
Please reboot the system as soon as possible.
/usr/sbin/policy-rc.d returned 101, not running 'start openvpn.service'
安装后同样验证:
openvpn --version | head -1
OpenVPN 2.5.11 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Sep 23 2026
⚠️ 注意:离线方式需自行收集 easy-rsa 及 liblzo2/lssl 等传递依赖的 .deb(用
apt-get -y install --download-only easy-rsa到依赖齐全的正式服务器上拉全),再于目标机一次性dpkg -i全部 .deb。
六、多方案对比与选择建议
| 方案 | 版本 | 联网要求 | 安装方式 | systemd 服务 | 适合场景 |
|---|---|---|---|---|---|
| A:apt 源安装 | 2.5.11 | 需在线源 | 在线 apt | 自带 openvpn@ / openvpn-server@ | 可联网的新服务器(推荐) |
| B:deb 离线安装 | 2.5.11 | 仅下载机需联网 | 离线 dpkg | 同上 | 内网隔离 / 批量化裸机 |
💡 说明:可联网环境直接选方案 A;内网隔离或需要离线交付则选方案 B。两种方式安装出的服务端与 systemd 单元完全一致,证书与配置流程相同。
七、证书体系:easy-rsa 创建 CA 与服务端证书
OpenVPN 属 PKI 型 VPN,服务端与每个客户端都要有可信证书。下面用 easy-rsa 在服务端建 PKI、生成 CA、签发服务端证书与 DH 参数、生成 tls-auth 静态秘钥。
7.1 初始化 easy-rsa 目录
mkdir -p /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
ln -sf /usr/share/easy-rsa/easyrsa .
cp /usr/share/easy-rsa/openssl-easyrsa.cnf .
编写 vars(用椭圆曲线 ECDSA 证书,密钥更小、握手更快):
cat > vars <<'EOF'
set_var EASYRSA_ALGO ec
set_var EASYRSA_CURVE secp384r1
set_var EASYRSA_REQ_CN "quzuo-vpn-ca"
set_var EASYRSA_DN cn_only
EOF
初始化 PKI:
./easyrsa init-pki
实测输出:
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/easy-rsa/pki
7.2 创建 CA(根证书)
./easyrsa --batch build-ca nopass
实测输出(节选):
Using SSL: openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
💡 说明:
--batch跳过交互提问,nopass表示 CA 私钥不设口令(便于无人值守;生产如需更严可省略 nopass 并设置口令)。
7.3 生成服务端证书请求并签发
./easyrsa --batch gen-req server nopass
./easyrsa --batch sign-req server server
sign 环节实测输出(节选):
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'ChangeMe'
Certificate is to be certified until Jan 11 03:53:43 2029 GMT (825 days)
Write out database with 1 new entries
Data Base Updated
💡 说明:证书的 commonName 显示为
'ChangeMe'是 easy-rsa 3 在未显式指定 EASYRSA_REQ_CN 时的默认占位值,证书仍会被正常签发并可被服务端接受;如在意证书中的 CN,可给gen-req追加命令级配置或在 vars 中显式声明请求 CN。unique_subject的告警属 easy-rsa 3 已知提示(默认 index.txt 含该校验),不影响签发。
7.4 生成 DH 参数与 tls-auth 秘钥
./easyrsa gen-dh
openvpn --genkey secret pki/ta.key
实测 DH 输出(节选,中间大量 点 为素数筛进度):
DH parameters of size 2048 created at /etc/openvpn/easy-rsa/pki/dh.pem
tls-auth 秘钥生成后:
ls -l /etc/openvpn/easy-rsa/pki/ta.key
-rw------- 1 root root 636 OpenVPN ... pki/ta.key
7.5 PKI 目录结构
/etc/openvpn/easy-rsa/pki/
├── ca.crt # 根证书(发给客户端)
├── ca.key # 根私钥(仅服务端,严禁外发)
├── dh.pem # DH 参数(仅服务端)
├── ta.key # tls-auth 静态秘钥(双端都有)
├── issued/ # 已签发证书(server.crt、client1.crt …)
├── private/ # 私钥(server.key、client1.key …)
├── index.txt # 证书签发台账
└── revoke 相关 # 吊销台账(index.txt.attr 等)
八、服务端配置 server.ovpn
首次安装后 /etc/openvpn/ 为空;自己创建服务端配置。systemd 的 openvpn@server.service 会加载 /etc/openvpn/server.conf。下面以 server.conf 为例一份可直接用的生产配置(也可另存为 <name>.conf):
port 1194
proto udp
dev tun
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key
dh /etc/openvpn/easy-rsa/pki/dh.pem
tls-auth /etc/openvpn/easy-rsa/pki/ta.key 0
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /etc/openvpn/ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
keepalive 10 120
cipher AES-256-GCM
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
auth SHA256
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log 60
log-append /var/log/openvpn/openvpn.log
verb 3
⚠️ 注意:
user nobody/group nogroup必须在服务端初始化完成(读证书、开 tun)后才降权运行。若开启status ... <n>,n 为状态文件刷新秒数(默认每 60 秒)。
先用前台命令直接测试配置正确性:
mkdir -p /var/log/openvpn
chown nobody:nogroup /var/log/openvpn
openvpn --config /etc/openvpn/server.conf
💡 说明:以上命令在前台运行,启动正常且无报错即配置可用;Ctrl-C 停止后,用 systemd 托管(下一步)即可后台常驻。
九、systemd 托管 openvpn@server
发行版自带 openvpn@.service 模板单元,实例名即配置文件 basename(无 .conf 后缀)。启用并启动:
systemctl enable openvpn@server
实测输出:
Created symlink /etc/systemd/system/multi-user.target.wants/openvpn@server.service → /lib/systemd/system/openvpn@.service.
systemctl start openvpn@server
systemctl status openvpn@server --no-pager | head -15
实测回显(节选):
● openvpn@server.service - OpenVPN connection to server
Loaded: loaded (/lib/systemd/system/openvpn@.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2026-10-09 04:08:51 UTC; 6s ago
Docs: man:openvpn(8)
https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
Main PID: 1134 (openvpn)
Status: "Initialization Sequence Completed"
Tasks: 1 (limit: 8648)
Memory: 1.9M
CPU: 18ms
查询运行态与隧道接口:
systemctl is-active openvpn@server
ip -br addr show tun0
实测输出:
active
tun0 UNKNOWN 10.8.0.1/24 fe80::36e5:faa0:2a74:3961/64
查看服务日志:
journalctl -u openvpn@server --no-pager -n 30
十、客户端连接与验证
在另一台机器(客户端)安装 openvpn 并放置 CA/证书/ta.key,配置 client.ovpn(常见字段):
client
dev tun
proto udp
remote vpn.example.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-GCM
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
auth SHA256
verb 3
ca /etc/openvpn/ca.crt
cert /etc/openvpn/client1.crt
key /etc/openvpn/client1.key
tls-auth /etc/openvpn/ta.key 1
💡 说明:
remote vpn.example.com 1194中的主机名需替换为你服务器的公网域名或公网 IP;tls-auth行的方向参数为 1(服务端为 0)。
启动客户端:
openvpn --config /etc/openvpn/client.ovpn
连接成功的关键回显(真实采集):
VERIFY OK: depth=0, CN=ChangeMe
Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, peer certificate: 2048 bit RSA, signature: RSA-SHA256
[ChangeMe] Peer Connection Initiated with [AF_INET]<server>:1194
PUSH: Received control message: 'PUSH_REPLY,redirect-gateway def1 bypass-dhcp,dhcp-option DNS 8.8.8.8,dhcp-option DNS 8.8.4.4,route-gateway 10.8.0.1,topology subnet,ping 10,ping-restart 120,ifconfig 10.8.0.2 255.255.255.0,peer-id 0,cipher AES-256-GCM'
Outgoing Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
Incoming Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
net_addr_v4_add: 10.8.0.2/24 dev tun0
Initialization Sequence Completed
客户端获得的隧道地址与路由:
ip -br addr show tun0
ip route | grep tun0
实测输出:
tun0 UNKNOWN 10.8.0.2/24 fe80::f197:78d2:a929:e59b/64
0.0.0.0/1 via 10.8.0.1 dev tun0
10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.2
128.0.0.0/1 via 10.8.0.1 dev tun0
服务端状态文件(/var/log/openvpn/openvpn-status.log),已列出连接中的客户端(Common Name 为 client1,被分配虚拟地址 10.8.0.2;Real Address 列为客户端来源 IP 与端口):
OpenVPN CLIENT LIST
Updated,2026-10-09 04:11:49
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
client1,<客户端来源IP>:54641,3937,3660,2026-10-09 04:11:39
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.8.0.2,client1,<客户端来源IP>:54641,2026-10-09 04:11:48
GLOBAL STATS
Max bcast/mcast queue length,1
END
💡 说明:客户端出现
Initialization Sequence Completed、服务端状态文件出现该客户端记录,即表示 SSL VPN 隧道已整体打通;此时客户端可ping 10.8.0.1(服务端隧道地址)并访问服务端所能访问的内网资源。
十一、注意事项
redirect-gateway def1 bypass-dhcp会把客户端默认路由全部导入隧道(全局代理);若只想访问特定内网网段而保留办公网络直连,改用push "route 10.20.0.0 255.255.0.0"这类按网段推路由的方式。- 生产务必启用
tls-auth(或 2.6 的tls-crypt-v2)抵御端口扫描与 DoS;ta.key服务端与客户端要同时持有,方向参数服务端 0、客户端 1。 - 证书有效期到期前需
renew并重新分发;吊销走revoke+gen-crl(详见《常用 CLI 命令与工具详解》)。 - 服务端做流量转发时,需开启内核 IP 转发:
并配合防火墙做 NAT(
sysctl -w net.ipv4.ip_forward=1 echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/99-ip_forward.confiptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE)。
十二、常见问题(FAQ)
Q1:服务端启动报 Cannot open TUN/TAP dev /dev/net/tun: No such file or directory 怎么办?
内核缺少 tun 设备。确认 ls -l /dev/net/tun,若无则 mkdir -p /dev/net && mknod /dev/net/tun c 10 200 && chmod 666 /dev/net/tun;或 modprobe tun 后重试。云厂商/被限制的虚拟化环境需在控制台开启 TUN/TAP 支持。
Q2:客户端连上却 ping 不通服务端隧道地址 10.8.0.1?
先看服务端 journalctl -u openvpn@server -n 30 是否有 Incoming Data Channel 初始化行与握手记录;再检查服务端 IP 转发与 NAT 是否放开(见十一、注意事项)。tunnel 内侧互相能通但出公网不通,通常是没做 MASQUERADE。
Q3:客户端报 TLS Error: TLS key negotiation failed to occur?
多因未配 tls-auth/tls-crypt 或两文件不一致、proto(TCP/UDP)、port 与防火墙端口不一致导致握手数据无法到达。核对客户端 tls-auth ... 1 用的 ta.key 与 remote 的端口协议是否与服务端一致。
Q4:cert/key 指向的文件不存在或权限不对?
确认 server.conf 里 ca/cert/key/dh 路径与 7.5 节目录对应,且证书目录 root 可读、私钥权限 600。斜杠大小写(Windows 复制过来的路径)也会导致找不到文件。
Q5:证书 CN 显示 ChangeMe 有影响吗?
不影响可用性(服务端按证书有效性与签名校验)。如需自定义 CN,在 gen-req 前于 vars 中设置 set_var EASYRSA_REQ_CN "ovpn-server",或对已有证书 renew 重新签发。
十三、卸载方式
# 停止并禁用服务(方案 A/B 均适用)
systemctl disable openvpn@server
systemctl stop openvpn@server
# 移除软件与相关文件(如不再需要)
apt-get -y remove openvpn easy-rsa
rm -rf /etc/openvpn
若用 deb 离线方式安装,卸载等价的 DPkg 操作:
dpkg -r openvpn
dpkg --purge openvpn
💡 说明:rm 掉
/etc/openvpn会把证书、配置一并清除;如有备份需求先cp -r /etc/openvpn /backup/。systemctl disable会顺带删除自启软链接。
十四、参考链接
- OpenVPN 官方:
https://openvpn.net/community-downloads/ - OpenVPN 社区 HOWTO:
https://community.openvpn.net/openvpn/wiki/HOWTO - Easy-RSA(GitHub):
https://github.com/OpenVPN/easy-rsa - OpenVPN 2.5 手册:
man openvpn - 相关内容参见《OpenVPN 配置参数详解》《OpenVPN 常用 CLI 命令与工具详解》《OpenVPN Docker Compose 部署指南》。