企业内网里要远程办公、要让外网访问内部系统,传统方案是"公网 IP + 端口映射 + 防火墙白名单",但任意端口都暴露风险大。VPN(Virtual Private Network)是更安全的方案——所有流量走加密隧道,访问内网像在内网一样。OpenVPN 是开源 VPN 里的"老牌选手",协议成熟、客户端齐全、跨平台。这篇文章讲清楚容器化部署、CA 证书签发、客户端 .ovpn 配置、多用户管理。
阅读对象:要给团队搭企业 VPN、给客户搭远程访问通道的运维同学
覆盖范围:kylemanna/openvpn 容器化部署、CA 签发、客户端 .ovpn 生成、duplicate-cn 多人共用、多用户管理脚本
〇、本文与"VPN 与代理自托管"一文的关系
本篇侧重 OpenVPN 单协议的深度——性能调优、跨平台客户端、协议变体、与企业网络设备对接。如果想看 OpenVPN + V2Ray 两条路线的选型对比,请参考姐妹篇 VPN 与代理自托管:OpenVPN 与 V2Ray 部署实战。
合规提示(必读):本文仅讨论 OpenVPN 用于企业远程办公、跨地域内网访问、出差员工接入公司内网等合法场景。部署、使用 VPN 服务务必遵守所在国家/地区法律法规。未经电信主管部门批准擅自建立、使用其他信道进行国际联网在中国大陆境内属违法行为。请勿用于违反所在国法律法规的用途。
一、为什么是 OpenVPN
VPN 协议不止一种,主流对比:
| 协议 | 特点 | 适用 |
|---|---|---|
| OpenVPN | SSL/TLS 加密,UDP/TCP 都行,跨平台 | 企业内网 VPN,老牌稳定 |
| WireGuard | 新一代,Linux 内核态,配置极简 | 追求性能与简洁 |
| IPSec / IKEv2 | 移动端友好,原生支持 iOS/macOS | 移动办公 |
| Shadowsocks / V2Ray | 代理协议,不是真 VPN | 翻墙 / 流量伪装 |
When to use:要给企业员工/客户提供"访问内网"能力,OpenVPN 是最稳的方案——企业级防火墙一般不会拦 OpenVPN 流量(看是 TCP 443 还是 UDP 1194),客户端覆盖 Windows / macOS / Linux / iOS / Android。
二、容器化部署
2.1 拉镜像
| |
2.2 初始化配置
| |
协议选择:
- UDP 1194:性能好,主流选择
- TCP 443:能穿透企业代理/防火墙,但性能略差
2.3 签发 CA 证书
| |
CA 密码保管:这个密码是 CA 私钥的"二次锁",必须记录下来备份——后面签发/吊销客户端证书时都要用到。
2.4 启动服务端
| |
–cap-add=NET_ADMIN:让容器获得 NET_ADMIN 能力,能创建 tun 设备、改路由表。
2.5 验证
服务端启动后,查看日志:
| |
看到 Initialization Sequence Completed 说明成功。
三、签发客户端证书
3.1 单个客户端
| |
nopass:客户端证书不设密码。nopass适合自动化/移动端,有密码更安全(每次连接输密码),按业务取舍。
3.2 .ovpn 文件内容
导出的 .ovpn 文件包含:
- CA 证书
- 客户端证书
- 客户端私钥
- 服务端配置(IP、端口、协议、压缩方式)
直接发给用户用 OpenVPN 客户端导入即可:
- Windows / macOS:OpenVPN Connect 客户端
- Linux:
openvpn --config xxx.ovpn - iOS / Android:OpenVPN Connect APP
不要通过微信/邮件明文传 .ovpn——里面是私钥。建议企业内 IM(如企业微信)传或加密压缩。
3.3 客户端连接
| |
连接成功后,客户端会拿到
10.8.x.x的 VPN IP,访问内网(如192.168.0.0/16)就自动走 VPN 隧道。
四、关键配置
/var/lib/docker/volumes/ovpn-data/_data/openvpn.conf(核心):
| |
五、多用户管理
5.1 duplicate-cn(多人共用证书)
默认 OpenVPN 一个证书只允许一个连接。多人用同一个 .ovpn:
| |
不推荐生产用:所有用户用同一个证书,审计不到具体人,吊销就是"全部吊销"。建议每个用户独立签发证书。
5.2 批量添加用户脚本
| |
5.3 删除用户脚本
| |
六、踩坑清单
- UDP 1194 被防火墙拦——换 TCP 443,重启
ovpn_genconfig -u tcp://{{IP}} - 客户端连上但访问不了内网——服务端没
push "route 192.168.x.x 255.255.x.x",或者内网机器防火墙拦截了 VPN 客户端 IP(10.8.0.0/24) - DNS 解析失败——客户端拿到了 VPN IP 但解析不到内网域名,添加
push "dhcp-option DNS 10.0.0.2" - 证书过期——Easy-RSA 默认 825 天,吊销旧证书、签发新证书
- .ovpn 文件被截断——
>重定向可能被 shell 解释,证书里的---等特殊字符要用<<EOF或tee输出 - 多人共用证书审计不到——生产用 duplicate-cn 是"省事但危险",强烈建议一证一人
七、OpenVPN 性能优化(独有)
性能调优是与 VPN 与代理自托管 姐妹篇不重叠的部分。
7.1 协议层
| 协议 | 性能 | 兼容 | 适用 |
|---|---|---|---|
| UDP | 最高 | 大多数客户端 | 默认推荐 |
| TCP | 略低 | 所有环境 | 穿透强约束网络 |
| TCP 443 | 低 | 全部 | 跨公网 NAT / 严格防火墙 |
proto udp 默认选;只有 UDP 被防火墙挡才换 TCP。
7.2 加密层
| |
2024+ 推荐:CPU 支持 AES-NI 硬件加速(所有现代 Intel/AMD CPU 都支持),AESGCM 比 CBC 快 2-3 倍。改用
cipher AES-256-GCM。
7.3 压缩(注意历史教训)
| |
7.4 keepalive 与 MTU
| |
7.5 大规模并发(千人级)
| |
7.6 性能基准(参考)
| 配置 | 单客户端带宽 | CPU 占用(单核) |
|---|---|---|
| AES-256-CBC + UDP | ~800 Mbps | 60% |
| AES-256-GCM + UDP | ~2 Gbps | 30% |
| AES-128-GCM + UDP | ~3 Gbps | 20% |
| TCP 443 | ~500 Mbps | 70% |
实际值取决于 CPU、MTU、网络环境。1 Gbps 客户端+ AES-NI 可跑到 1.5+ Gbps 隧道吞吐。
八、跨平台客户端实战(独有)
8.1 Windows
- OpenVPN Connect 官方客户端
- OpenVPN GUI(2018 起停更,但仍是事实标准)
- Tunnelblick(仅 macOS)→ Windows 对应 OpenVPN Connect
8.2 macOS
- Tunnelblick 开源 GUI(事实标准)
- OpenVPN Connect 官方
- Viscosity 商业(订阅制,UI 友好)
8.3 Linux
| |
8.4 iOS / Android
- OpenVPN Connect(官方)
- 导入 .ovpn 后会自动保存,连接时输入证书密码(如果签发时设了)
8.5 路由器(OpenWrt / iKuaiOS)
| |
进阶:把 OpenVPN 装到企业网关(pfSense / OPNsense),整个网段接入 VPN。
九、协议变体与互操作(独有)
9.1 OpenVPN Access Server(商业版)
- 官方商业版,免证书签发
- 提供 Web 管理后台、用户自助注册
- 适合中小企业(< 200 用户)不想自己维护 CA
- 授权 10 用户起售
9.2 OpenVPN Cloud
- 2020+ 推出的 SaaS 版
- 全球 Anycast 节点
- 适合跨国企业、远程办公团队
- 按用户订阅
9.3 WireGuard 替代?
| 维度 | OpenVPN | WireGuard |
|---|---|---|
| 内核态 | 否(用户态) | 是(Linux 5.6+) |
| 性能 | 中 | 极高(UDP 单线程 ~1 Gbps) |
| 配置 | 中(CA + 证书) | 极简(公私钥对) |
| 抗检测 | 中 | 低(流量特征明显) |
| 跨平台 | 全平台 | 全平台(2019+) |
| 适用 | 企业内网、远程办公 | 高性能场景、移动端 |
2024 选型:传统企业 → OpenVPN(稳定、审计、客户端全);新项目 / 高性能 → WireGuard(配置极简、性能强)。
十、参考资料
- kylemanna/openvpn:https://github.com/kylemanna/docker-openvpn
- OpenVPN 官方文档:https://openvpn.net/community-resources/
- OpenVPN Connect 客户端下载:https://openvpn.net/client/
下一步
- 想做代理?→ V2Ray 代理服务搭建 一文
- 想做 WebRTC 内网穿透?→ 流媒体与 WebRTC 实时视频 一文
- 想做 Web 网关?→ Nginx 反向代理实战 一文
