Ubuntu 22.04 安装 OpenVPN 指南

Ubuntu 22.04 上 apt 在线与 deb 离线两种方式安装 OpenVPN 2.5.11 与 easy-rsa 证书体系,配置 server.ovpn 服务端并 systemd 托管,含真实回显、验证、FAQ 与卸载,已在 Ubuntu 22.04 实测通过。

OpenVPNOpenVPN安装部署Ubuntu 22.04证书管理systemd 托管2026/10/09

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
OpenVPN2.5.11(apt 源 / deb 包均相同版本)
Easy-RSA3.0.8
OpenSSL3.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 转发:
    sysctl -w net.ipv4.ip_forward=1
    echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/99-ip_forward.conf
    
    并配合防火墙做 NAT(iptables -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 部署指南》。
Ubuntu 22.04 安装 OpenVPN 指南 - Quzuo