OpenVPN 服务端部署指南
文档定位:本文档为服务端部署与运维篇,覆盖从环境准备到服务上线的完整流程。客户端认证方案(用户名/密码 vs 证书)请参阅认证与固定 IP 方案;工业网关设备端配置请参阅工业网关私有化方案。
本文档基于 Alibaba Cloud Linux 3 环境验证,兼容 CentOS 7/8、RHEL 8/9、Rocky Linux 9。采用用户名/密码认证模式作为基准部署路径。
⚠️ 关于配置文件格式:OpenVPN 使用其原生的指令式配置格式(
.conf/.ovpn),此格式由 OpenVPN man page(openvpn.8)明确规定,2.7.x 及更早版本均无变更计划。请勿将其与 frp(.toml)等其他工具的配置格式混淆。
⚠️ 加密算法说明:新部署已默认使用
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305。仅当需兼容不支持 AEAD 的旧嵌入式设备时,才通过data-ciphers-fallback BF-CBC保留回退(见 §3.3 安全加固)。
一、环境准备
1.1 资源要求
| 资源 | 最低配置 | 推荐配置(50 设备) |
| CPU | 1 核 | 2 核 |
| 内存 | 1 GB | 2 GB |
| 带宽 | 1 Mbps | 5 Mbps |
| 磁盘 | 20 GB | 40 GB(日志保留) |
1.2 端口放行
登录云控制台 → 安全组 → 添加入方向规则:TCP 1194,来源 0.0.0.0/0。若后续改为 TCP 443 或其他端口,替换对应数字。
1.3 国内网络环境优化
OpenVPN 与 EasyRSA 的软件包和源码托管在境外,国内服务器需预先配置镜像加速以提高安装速度与成功率。
1.3.1 替换 Yum/DNF 源为阿里云镜像
1.3.2 替换 EPEL 源为阿里云镜像
1.3.3 OpenVPN 源码与 Release 加速下载
| 方式 | URL / 命令 |
| 阿里云镜像站 Release 下载 | https://mirrors.aliyun.com/openvpn/latest/ |
| GitHub 加速克隆(kkgithub) | git clone https://kkgithub.com/OpenVPN/openvpn.git |
| GitHub 加速克隆(bgithub) | git clone https://bgithub.xyz/OpenVPN/openvpn.git |
| 单文件/Release 下载加速 | wget https://gh-proxy.com/https://github.com/.../openvpn-2.6.12.tar.gz |
| Git 全局代理(替代 GitHub 域名) | git config --global url."https://kkgithub.com/".insteadOf "https://github.com/" |
注意:国内镜像站点可能随时变更,如上述地址不可用,可在 清华 TUNA 镜像站 或中科大 USTC 镜像站 搜索 OpenVPN 相关资源。
二、安装与 PKI 初始化
2.1 安装软件
2.2 初始化 PKI
2.3 检查文件路径与权限
⚠️ 私钥文件(
.key)必须设为600,证书文件(.crt)设为644。不要对私钥使用644——这会导致安全审计不通过。
三、服务端配置
3.1 server.conf
创建 /etc/openvpn/server/server.conf:
3.2 配置项速查
| 指令 | 作用 | 注意事项 |
server 10.8.0.0 255.255.255.0 | VPN 子网,服务端占 .1 | 避免与本地局域网冲突 |
data-ciphers | NCP 协商加密算法列表(按优先级排列) | OpenVPN 2.5+ 替代 ncp-ciphers;2.6+ 默认含 CHACHA20 |
data-ciphers-fallback | 旧客户端(无 NCP)的回退算法 | OpenVPN 2.5+ 替代 cipher;仅对 2.3 及更早的旧客户端生效 |
compress lzo | LZO 压缩(替代旧指令 comp-lzo) | 公网环境建议完全禁用(VORACLE 攻击);专网可保留 |
push "redirect-gateway def1 bypass-dhcp" | 强制所有客户端流量经 VPN | 增加带宽消耗,按需启用 |
keepalive 10 120 | 心跳检测,120s 无响应判死 | 防火墙 NAT 超时应大于此值 |
user nobody / group nobody | 降权运行 | Ubuntu/Debian 需改为 nogroup |
duplicate-cn | 多客户端共用一个 CN 标识 | 多设备场景必须启用 |
client-config-dir | 按客户端分配固定 IP | 目录须存在且文件名严格匹配 CN |
verb 3 | 日志级别 | 生产推荐 3,调试阶段可用 6 |
3.3 安全加固
3.3.1 切换到证书认证
从 server.conf 中移除或行首加 #(不要使用行内注释——OpenVPN 不完全支持 # 在行中):
3.3.2 升级加密强度
新部署标准配置(兼容现代客户端与旧嵌入式设备):
3.3.3 压缩安全警告(VORACLE)
VPN 压缩存在 VORACLE 攻击风险(CVE-2018-7544):攻击者通过观察密文大小变化推断明文内容(类似 HTTPS 的 CRIME/BREACH 攻击)。
| 场景 | 推荐配置 | 理由 |
| 生产环境 / Internet 暴露 | 禁用压缩(删除 compress lzo) | 消除 VORACLE 风险 |
| 工业 IoT 专网 / 带宽受限 | compress lzo(评估风险后保留) | 受控网络,但需同步禁用 HTTP 压缩 |
四、认证脚本
4.1 单用户硬编码(via-env 模式)
⚠️
heredoc的EOF结束标记必须独占一行且行首无空格。缺少EOF将导致脚本语法错误。
4.2 多用户凭据文件(via-file 模式)
via-file 模式更安全——凭据写入临时文件而非通过 /proc 暴露。
步骤 1:创建凭据文件
步骤 2:修改 server.conf 中的认证指令
步骤 3:创建 via-file 认证脚本
五、网络与防火墙
验证:
六、启停与日志
实时日志:
常见启动失败速查
| 日志关键词 | 原因 | 解决 |
Cannot open CA file | 证书路径错误 | 核对 ca 指令的绝对路径 |
Permission denied | 证书文件权限 | chmod 644 *.crt; chmod 600 *.key |
Address already in use | 端口占用 | ss -tlnp | grep 1194 |
script-security | 认证脚本无法执行 | chmod +x check-password.sh |
Options error: unauthorized option | 缺少 script-security 3 | 检查 server.conf 中该指令是否存在 |
七、导出客户端所需文件
将完整输出(含 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE-----)保存为 ca.crt。若启用了 tls-crypt,还需导出 tls-crypt.key:
八、部署验证清单
systemctl status openvpn-server@server→active (running)(持续 > 5min 无异常退出)firewall-cmd --list-ports含1194/tcpfirewall-cmd --query-masquerade→yessysctl net.ipv4.ip_forward→1- 云控制台安全组已放行对应端口
- CA 证书已导出供客户端使用
- (生产环境)已启用
tls-crypt及tls-version-min 1.2
下一步:服务端就绪后,转至客户端认证与固定 IP 方案配置认证方式与静态 IP,或工业网关私有化方案完成设备端联调。
参考文献
- OpenVPN Community. OpenVPN 2.7 Reference Manual. https://openvpn.net/community-resources/reference-manual/, 2026.
- OpenVPN Community. OpenVPN Man Page (openvpn.8). https://github.com/OpenVPN/openvpn/blob/master/doc/openvpn.8.rst, 2026.
- OpenVPN Technologies. Hardening OpenVPN Security. https://community.openvpn.net/openvpn/wiki/Hardening, 2025.
- EasyRSA 3 Project. EasyRSA 3 Documentation. https://github.com/OpenVPN/easy-rsa/tree/master/doc, 2024.
- 阿里云镜像站. OpenVPN 开源镜像. https://mirrors.aliyun.com/openvpn/latest/, 2026.
