OpenConnect 介绍与选型指南
OpenConnect 生态全景介绍、协议与架构解析、功能特性、最小可用示例、适用场景与同类 VPN 选型对比,帮你判断何时该选 OpenConnect。
OpenConnect 介绍与选型指南
目标:为需要自建 SSL VPN 远程接入的读者讲清 OpenConnect 生态(openconnect 客户端 + ocserv 服务端)的定位、架构、功能与选型方法。本篇为认知篇,全部信息溯源自官方渠道(官网、GitLab 仓库、官方 releases.feed、发行版软件源),查询日期统一为 2026-10-20;安装实测细节见《Ubuntu 22.04 安装 OpenConnect 指南》。
一、环境信息
本篇是认知篇,不依赖特定部署环境;为保证可复核性,先交代信息溯源渠道与版本基准。
- 信息溯源渠道(查询日期均为 2026-10-20):
- openconnect 客户端官网:https://www.infradead.org/openconnect/
- ocserv 服务端官方仓库:https://gitlab.com/openconnect/ocserv(README、LICENSE)
- 官方发布流:https://gitlab.com/openconnect/ocserv/-/releases.atom 与 https://gitlab.com/openconnect/openconnect/-/releases.atom
- 社区活跃度数据:shields.io GitLab starrers 徽章(数据源为 GitLab 仓库页面)
- 发行版版本:Ubuntu 22.04 (jammy) 官方软件源 apt 缓存
- 版本基准(双基准:上游最新稳定版 + Ubuntu 22.04 apt 可装版本):
| 组件 | 上游最新稳定版 | 发布日期 | Ubuntu 22.04 apt 版本 | 版本差距 |
|---|---|---|---|---|
| ocserv(服务端) | 1.6.0 | 2026-10-16 | 1.1.3-1 | 大(1.1.3 → 1.6.0 跨 5 个次版本) |
| openconnect(客户端) | v9.21 | 2026-06-16 | 8.20-1 | 大(8.x → 9.x 跨主版本) |
💡 说明:上游与 Ubuntu 22.04 自带版本差距明显。Ubuntu 22.04 属于 2022 年发布的 LTS,其软件源在生命周期内只做安全修补不做大版本更新,属正常现象。本系列文档的实测篇(安装/配置/命令)基于 Ubuntu 22.04 apt 可装版本(ocserv 1.1.3、openconnect 8.20)逐条实测,本文叙述与对比以官方最新版为基准,并标注来源。
二、软件概述
2.1 OpenConnect 是什么
OpenConnect 实际上是一个「一协议、两组件」的开源 SSL VPN 生态:
- openconnect 客户端:跨平台多协议 SSL VPN 客户端,最初为兼容思科 AnyConnect SSL VPN 而生,如今同时支持 7 种 VPN 协议(见 4.2 节),由 infradead.org 社区维护,官网 https://www.infradead.org/openconnect/。
- ocserv 服务端(OpenConnect VPN server):面向企业远程接入场景的开源 Linux SSL VPN 服务器,实现「openconnect 协议」(AnyConnect 协议的改进版),与 openconnect 客户端互为官方配套,同时兼容思科 AnyConnect 客户端;官方仓库 https://gitlab.com/openconnect/ocserv。
官方对二者关系的表述(摘自 ocserv README,2026-10-20 查询):「The OpenConnect VPN server (ocserv) is an open source Linux SSL VPN server designed for organizations that require a remote access VPN with enterprise user management and control. It follows the openconnect protocol and is the counterpart of the openconnect VPN client. It is also compatible with CISCO's AnyConnect SSL VPN.」
2.2 项目起源与动机
openconnect 客户端官网「Motivation」一节写明了项目起点:开发者在 Linux 上试用思科官方 AnyConnect 客户端时发现诸多缺陷——无法使用 TPM 或 PKCS#11 智能卡里的证书、不支持 i386 之外的 Linux 平台、与桌面 NetworkManager 缺乏集成、没有规范的 RPM/DEB 打包、用 dlopen() 隐式加载库导致依赖难审计、存在可被普通用户利用的临时文件竞态漏洞、无法以非特权用户运行、代码难以审计等。OpenConnect 针对上述问题逐一改进,因此它在 Linux 服务器/桌面上比思科官方客户端有更好的工程性(来源:https://www.infradead.org/openconnect/,查询日期 2026-10-20)。
2.3 许可与维护方
| 组件 | 许可证 | 代码托管 | 维护方式 |
|---|---|---|---|
| openconnect 客户端 | LGPL-2.1-only | GitLab openconnect/openconnect + infradead.org 官网 | 社区驱动,邮件列表 openconnect-devel@lists.infradead.org |
| ocserv 服务端 | GPL-2.0-or-later | GitLab openconnect/ocserv | 社区驱动,GitLab CI 覆盖多 Linux 发行版编译测试 |
💡 说明:两个许可证均属 GPL 家族,对企业自建网关无商用授权费问题;客户端 LGPL 也便于第三方 GUI(如 NetworkManager-openconnect、gnome-network-manager-openconnect)链接集成。官方明确声明 OpenConnect 与 Cisco/Juniper/Pulse/Palo Alto/F5/Fortinet 无官方支持或合作关系,仅是协议互通(来源:客户端官网首页声明)。
三、核心架构
3.1 整体拓扑
[openconnect 客户端] [ocserv 服务端]
user app → tun 网卡 主进程 ocserv-main(TCP/UDP 监听)
↑↓ vpnc-script(配置路由/DNS) ├─ sec-mod(证书与安全相关操作、认证)
TLS 控制通道 (CSTP/HTTPS) ←──────────→ ├─ worker(每连接一个,数据转发)
DTLS/ESP 数据通道 ←──────────→ └─ occtl(本地管理查询)/ ocpasswd(口令文件管理)
- 控制通道 CSTP:基于 HTTPS(TLS)承载认证、地址下发、路由推送等控制面信息;客户端与服务器互相可见的协商结果(IP、MTU、DPD、压缩算法等)都经此通道传递。
- 数据通道 DTLS/ESP:认证完成后流量走 DTLS(UDP)以获得低开销;UDP 不可达时自动回落 TLS/TCP。GnuTLS 是两端的默认密码学底座。
- 客户端 vpnc-script:openconnect 本身不直接改系统路由,认证成功后调用 vpnc-script(Ubuntu 上默认
/usr/share/vpnc-scripts/vpnc-script)完成 tun 网卡地址、路由、DNS 的配置;脚本路径可用--script覆盖(来源:openconnect--help输出)。
3.2 服务端进程模型
ocserv 官方仓库 README 描述的程序组成是三个可执行文件:ocserv 主服务程序、occtl 控制工具、ocpasswd 口令文件管理工具(来源:https://gitlab.com/openconnect/ocserv README,2026-10-20)。ocserv 官方技术页(technical.html)进一步描述了其多进程设计:主进程负责监听与调度,安全相关操作(证书、口令校验)由独立的 sec-mod 进程承担,每个已认证连接由单独的 worker 进程处理;worker 默认启用 seccomp 沙箱隔离(构建选项 -Dseccomp=disabled 可关,README 构建选项表),并以 run-as-user/run-as-group 指定的非特权身份运行。
💡 技术拓展:VPN 数据面的进程/线程模型常见三种取舍——①每连接一进程(隔离最强、崩溃影响面小,内存与调度开销偏高,ocserv 取此路线);②每连接一线程或事件循环(如 OpenVPN 单进程事件模型,资源省但故障域集中);③内核态实现(如 WireGuard 直接做成内核模块,性能最高但功能面窄)。ocserv 选择进程隔离,把「安全边界清晰、worker 崩溃不拖垮全局」放在第一位,这与它面向企业远程接入的定位一致。
3.3 组件清单
| 组件 | 角色 | 说明 |
|---|---|---|
| ocserv | 服务端主程序 | TLS/DTLS VPN 服务器,兼容 AnyConnect 协议 |
| occtl | 服务端控制工具 | 经 unix socket 查询在线用户/统计/封禁列表,可踢用户、解封、reload |
| ocpasswd | 口令文件管理 | 维护 plain 认证方式的用户口令文件(创建/改组/锁定/删除) |
| openconnect | 客户端主程序 | 多协议 SSL VPN 客户端 CLI |
| libopenconnect5 | 客户端库 | 供 GUI 前端(NetworkManager 插件等)链接的共享库 |
| vpnc-script | 客户端辅助脚本 | 建立/拆除 tun 网卡、路由、DNS |
四、功能特性
4.1 服务端(ocserv)特性
以下特性均来自官方 README(含构建选项表)与发行版默认配置文件 /etc/ocserv/ocserv.conf 内置说明(Ubuntu 22.04 ocserv 1.1.3-1 软件包自带,属于官方上游随包文档):
- 多种认证方式:plain(ocpasswd 口令文件,可叠加 TOTP 一次性口令)、PAM(复用系统账号)、RADIUS、GSSAPI/Kerberos、客户端证书;上游 1.6.0 构建还提供 OpenID Connect 认证选项(
-Doidc-auth构建开关)。 - 双栈:IPv4 与 IPv6 地址同时下发(README「Supported platforms」:designed and tested to work, with both IPv6 and IPv4, on Linux systems)。
- 多进程 + seccomp 隔离:worker 以非特权用户运行并启用 seccomp 过滤(构建选项
-Dseccomp)。 - 内置管理面:occtl 经 unix socket 提供状态/会话/统计查询与踢线、解封、配置 reload。
- 抗滥用计分:max-ban-score/ban-points-wrong-password 等参数按 IP 对认证失败计分。
- 会话韧性:cookie 断线重连、rekey、DPD 死链检测、移动设备专用超时(mobile-dpd/mobile-idle-timeout)。
- 路由控制:全隧道或按 route 列表分流,支持 iroute(用户宣告子网)、restrict-user-to-routes/ports(经
/usr/libexec/ocserv-fw调 nftables/iptables 强制,README「Runtime dependencies」)。 - 传输优化:DTLS 数据通道 + LZ4 压缩(compression 配置项)、try-mtu-discovery 路径 MTU 探测。
4.2 客户端(openconnect)特性
- 7 种 VPN 协议(来源:客户端官网协议列表与
--help,2026-10-20):
| 协议参数 | 兼容对象 |
|---|---|
--protocol=anyconnect(默认) | 思科 AnyConnect SSL VPN、ocserv |
--protocol=nc | Juniper Network Connect |
--protocol=gp | Palo Alto GlobalProtect |
--protocol=pulse | Pulse Connect Secure |
--protocol=f5 | F5 BIG-IP |
--protocol=fortinet | Fortinet FortiGate |
--protocol=array | Array Networks |
- 凭据形态丰富:用户名/口令、客户端证书(
--certificate/--sslkey)、PKCS#11 智能卡、TPM、RSA/HOTP/TOTP 软件令牌、Yubikey OATH、OIDC 令牌(--token-mode=oidc,v9.x 起支持)——以上能力清单与openconnect --version报告的「Features present」一致(Ubuntu 22.04 openconnect 8.20-1)。 - 运行形态灵活:
-b后台化、--pid-file、连接后降权(--setuid)、cookie 提取复用(--cookieonly/--authenticate)、HTTP 代理支持(--proxy)。 - 跨平台:官方 platforms 页列出 Linux、macOS、Windows、BSD、Android/iOS(经第三方应用)等。
4.3 协议与互操作兼容矩阵
| 服务端 | openconnect 客户端 | 思科 AnyConnect 官方客户端 |
|---|---|---|
| ocserv | 官方配套(改进版 openconnect 协议) | 兼容(ocserv 定位之一) |
| 思科 ASA/IOS AnyConnect 网关 | 兼容(anyconnect 协议) | 原生 |
| Pulse/F5/Fortinet/Array/GP/NC 网关 | 各对应 --protocol 支持 | 各厂商原生 |
💡 说明:兼容矩阵的含义是——存量 AnyConnect 网关可以用 openconnect 替代官方客户端(尤其 Linux 桌面无官方客户端的场景);自建网关则 ocserv + openconnect 两端全开源。ocserv 与思科设备混用时以思科官方客户端为主、openconnect 作补充,需按官方 protocols 页逐协议核对功能差异。
五、快速开始(最小可用示例)
本节给最小可跑通的「服务端 + 客户端」组合。命令形态取自官方 README 与发行版默认配置;在 Ubuntu 22.04 上的逐步实测与完整回显见《Ubuntu 22.04 安装 OpenConnect 指南》。
服务端最小流程(Ubuntu 22.04,root 执行):
apt-get install -y ocserv # 安装并自动启用 systemd 服务,默认监听 443/TCP+UDP
安装后 ocserv 默认以 PAM 认证、snakeoil 证书直接可启动;生产建议改用 ocpasswd 或证书认证。用 ocpasswd 建一个 plain 认证用户:
ocpasswd -c /etc/ocserv/ocpasswd admin # 交互输入两次口令,生成 username:*:sha512-crypt 条目
同时把 /etc/ocserv/ocserv.conf 中 auth = "pam[gid-min=1000]" 改为 auth = "plain[passwd=/etc/ocserv/ocpasswd]",systemctl restart ocserv 后即可用客户端连接:
openconnect --servercert=pin-sha256:<服务器证书指纹> --user=admin https://<服务器地址>:443
服务端查看在线用户(另开终端):
occtl show users
💡 说明:
--servercert接受pin-sha256:形式的服务器证书指纹;首连不加该参数时客户端会把应接受的指纹打印在提示里,照抄即可。若在受控内核上遇到客户端「SSL 连接失败:Error in the pull function.」且服务端日志出现 worker 启动报错,把配置中isolate-workers = true改为false后重启服务(排障全过程见《Ubuntu 22.04 安装 OpenConnect 指南》)。
六、适用场景与限制
6.1 典型适用场景
- 企业/团队远程接入 VPN:ocserv 的定位原话即「面向需要带企业级用户管理与控制的远程接入 VPN 的组织」;plain/PAM/RADIUS/LDAP 化的 PAM 等认证可对接现有账号体系。
- Linux 桌面接入存量 AnyConnect/GlobalProtect/F5 等企业网关:这些厂商多无官方 Linux 客户端或体验差,openconnect 补齐。
- 与思科 AnyConnect 并存的兼容网关:给只会用 AnyConnect 客户端的用户群提供不换客户端的自建网关。
- 低运维成本的自托管 VPN:单个二进制 + 单配置文件 + occtl,无数据库依赖。
6.2 限制与边界(官方明示)
- 服务端平台:为 Linux 设计并测试(IPv4/IPv6),FreeBSD/OpenBSD 等 BSD 系「known to work」,非官方支持平台(README)。
- 无 procfs 平台的限制:README 明确在不支持 procfs(5) 的平台上,配置变更必须在 ocserv 停止状态进行,否则新 worker 读新配置而主进程仍用旧配置。
- 计分封禁的精度:默认配置注释明示「由于涉及多个进程,计分不是实时精确的」;使用经本地 HTTP 服务器代理接入(listen-clear-file)时计分封禁不可靠。
- 防火墙强制的运行时依赖:启用 restrict-user-to-routes/restrict-user-to-ports 时需要 nft 或 iptables(README Runtime dependencies)。
- 非目标:ocserv 不是站点到站点 IPsec 网关(那是 strongSwan 的领域),也不是 wireguard 式内核态高性能隧道;客户端与各 VPN 厂商无官方合作关系。
七、同类选型对比
7.1 候选横向对比
同类「Linux 自托管 VPN 网关」候选与 OpenConnect 生态对比(上游版本为 2026-10-20 官方 releases 查询结果;各同类组件的详细选型见站内对应介绍篇):
| 维度 | OpenConnect (ocserv) | WireGuard | OpenVPN | strongSwan | SoftEther VPN | Nebula VPN | Firezone |
|---|---|---|---|---|---|---|---|
| 定位 | SSL VPN 远程接入(AnyConnect 兼容) | 内核态点对点/网状隧道 | 用户态 SSL VPN 多用途网关 | IPsec/IKEv2 网关 | 多协议软件交换机 | 网状 overlay VPN | 基于 WireGuard 的零信任接入 |
| 传输/数据面 | TLS(CSTP) + DTLS/ESP,用户态 | UDP 内核态 | TLS/UDP,用户态 | ESP/IKEv2(内核或用户态) | TLS/以太网 over SSL | Noise 协议 UDP | WireGuard 内核态 |
| 认证 | plain/PAM/RADIUS/GSSAPI/证书/OIDC | 密钥对(无内置用户认证) | 证书/用户名口令/插件 | 证书/EAP/PSK | 证书/AD/RADIUS 等 | 密钥+主机清单 | 邮箱 SSO/目录集成 |
| 典型形态 | 远程接入,客户端拨入 | 节点互联为主 | 远程接入+站点互联 | 站点互联为主 | 远程接入+站点互联 | 网状组网 | 远程接入(零信任) |
| 上游最新版(2026-10-20) | ocserv 1.6.0 / 客户端 v9.21 | 1.0.20210914(工具线) | 2.7.x | 6.1.0 | 4.44 | 1.11.2 | 1.6.3 |
| Ubuntu 22.04 apt 版本 | ocserv 1.1.3-1 / 8.20-1 | wireguard 1.0.20210914 | 2.5.x 系(jammy) | 5.9.5 | 无官方源(自行安装) | 无(官方二进制) | 无(官方脚本) |
| 许可 | 客户端 LGPL-2.1 / 服务端 GPL-2.0+ | GPL-2.0 | GPL-2.0 | GPL-2.0 | Apache-2.0 | MIT | FDL-1.1(1.x 前为 Apache-2.0) |
| GitLab/GitHub 活跃度 | ocserv 371 / openconnect 319 starrers(GitLab,2026-10-20 shields.io) | 内核主线维护,社区极大 | GitHub 万级 star | GitHub 万级 star | GitHub 万级 star | GitHub 数千 star | GitHub 数千 star |
💡 说明:表内各同类组件的上游版本、apt 版本、许可与其详细介绍篇保持一致;OpenConnect 两仓库 starrers 数据来自 shields.io GitLab 徽章(2026-10-20),其余组件量级为社区常识性描述,精确数值以各自仓库页面为准。关键差异在于数据面位置与认证模型——内核态(WireGuard)性能最高但不含用户认证体系;ocserv/OpenVPN 这类用户态 SSL VPN 功能面广、与账号体系集成深。
7.2 社区活跃度与版本节奏
OpenConnect 官方发布节奏(releases.atom 实查,2026-10-20):
| 时间 | 服务端 ocserv | 客户端 openconnect |
|---|---|---|
| 2024-05 | 1.3.0 | v9.12 系 |
| 2026-01 ~ 2026-04 | 1.4.0 / 1.4.1 / 1.4.2 | — |
| 2026-06 | 1.5.0 | v9.20 / v9.21 |
| 2026-10-16 | 1.6.0 | — |
结论:服务端近年保持季度级迭代(1.3 → 1.6 跨度内 5 个正式版),客户端 v9.x 活跃;GitLab CI 对多发行版做编译测试(README「Continuous Integration」)。版本节奏与 Issue/GitLab CI 证据表明项目处于活跃维护状态,但社区规模小于 WireGuard/OpenVPN 这类头部项目,属「小而精」的成熟社区。
7.3 选型建议(如果…则…)
- 如果用户要用 AnyConnect 客户端接入、或企业已有 AnyConnect 存量 → 选 OpenConnect(ocserv):兼容性即卖点。
- 如果只要两台机器/站点之间的高性能点对点隧道 → 选 WireGuard:内核态数据面,配置极简;远程接入要自行解决用户管理与 IP 分配。
- 如果需要远程接入 + 站点互联通吃、生态插件(RADIUS/LDAP/2FA)成熟 → 选 OpenVPN:生态最全,性能低于内核态方案。
- 如果主诉求是 IPsec/IKEv2 站点互联(含与硬件设备对接) → 选 strongSwan:IPsec 事实标准实现。
- 如果要一个 GUI 管理台 + 多协议(L2TP/IPsec、SSL、以太网桥) → 选 SoftEther VPN。
- 如果要无中心网关的全互联 mesh 组网 → 选 Nebula VPN。
- 如果要零信任远程接入(SSO、设备管理、策略下发)且接受 WireGuard 数据面 → 选 Firezone。
- 如果Linux 桌面用户要接别人的 AnyConnect/GP/F5 网关 → 只选 openconnect 客户端(无需服务端)。
八、参考链接
- openconnect 客户端官网(含 Motivation、协议列表、平台支持):https://www.infradead.org/openconnect/(查询日期 2026-10-20)
- ocserv 官方仓库与 README(定位、构建选项、运行时依赖、许可):https://gitlab.com/openconnect/ocserv(查询日期 2026-10-20)
- ocserv 发布流:https://gitlab.com/openconnect/ocserv/-/releases.atom(查询日期 2026-10-20)
- openconnect 客户端发布流:https://gitlab.com/openconnect/openconnect/-/releases.atom(查询日期 2026-10-20)
- ocserv 官方配置配方仓库:https://gitlab.com/openconnect/recipes
- OpenConnect 协议技术描述:https://gitlab.com/openconnect/protocol
- 社区活跃度取证:shields.io GitLab starrers 徽章(openconnect/ocserv、openconnect/openconnect,查询日期 2026-10-20)
- Ubuntu 22.04 软件源版本:
apt-cache policy ocserv openconnect(jammy/universe,查询日期 2026-10-20)