OpenConnect 是 SSL VPN 客户端,ocserv 是对应的服务端。二者不是同一个仓库。截至 2026-10-11,客户端标签为 v9.21(2026-06-16),服务端标签为 1.5.0(2026-06-07)。本文说明分工、许可证和协议草案的范围。
两个项目各是什么
一个可独立引用的定义句:OpenConnect 是跨平台的多协议 SSL VPN 客户端;ocserv 是实现 OpenConnect VPN 协议的 Linux 服务端,并声明与 Cisco AnyConnect SSL VPN 兼容。
客户端首页写明,它与 Cisco、Juniper、Pulse Secure、Palo Alto Networks、F5、Fortinet 没有官方支持关系或从属关系,只是能够与这些设备互通。商标属于各自的权利人。
服务端 README 把程序分成三份:ocserv 是服务器,occtl 用来查询服务器,ocpasswd 用来管理简单的口令文件。这是组成说明,不是操作步骤。
TLS 与隧道各加密哪一层,见 VPN 与 HTTPS 各加密哪一层。远程接入和站点到站点的差别见 站点到站点与远程接入。
沿革:客户端早于服务端
客户端 main.c 的作者栏是 David Woodhouse。同一文件的版权行包括 2008–2015 年的 Intel Corporation、2008 年的 Nick Andrew,以及 2013 年的 John Morrissey。更新日志把 v1.00(2009-03-18) 称为 first non-beta release。版权行从 2008 年写起,但本文没有找到一份把「项目开始」写成某一个 2008 年日期的公告,因此不补这个日期。
服务端的第一次公开版本是 ocserv 0.0.1。Nikos Mavrogiannopoulos 于 2013-02-20 在 openconnect-devel 邮件列表发了公告:当时的目标是小型 VPN 服务器,实现 AnyConnect SSL VPN 协议,并感谢 David 提供了最初的测试服务器和托管。src/main.c 的版权行是 2013–2018 年的 Nikos Mavrogiannopoulos,以及 2015–2016 年的 Red Hat, Inc.。2026 年谁在合并补丁,本文没有对照完整的维护者名单。
GitLab 上 openconnect/openconnect 的项目创建时间是 2017-01-18,openconnect/ocserv 是 2015-09-19。那是仓库托管页面的日期,不是 2009 年或 2013 年的首次发布。
客户端首页把开发动机写成:当时试用的 Cisco AnyConnect Linux 客户端在证书、平台、打包和审计方面不能满足需要。本文不转述该页列出的具体缺陷。
许可证怎么写
两边的许可证不一样,引用时要带上文件。
客户端首页和仓库 README 都写:以 GNU Lesser General Public License 2.1 发布。main.c 的文件头写的是 LGPL version 2.1,没有写「或任何更新版本」。其他源文件是否都是这一句,本文没有逐文件核对。
服务端 README 写 “GPLv2+”,并指向 COPYING。src/main.c 写明可以在 GPL 第 2 版或(可选)任何更新版本下再分发。README 同时写明,部分代码使用与 GPLv2 兼容的其他许可证:CCAN 组件见 src/ccan/licenses/,inih 为简化 BSD。本文没有把这些例外和 COPYING 逐段对完。
协议文本:仍是过期草案
协议仓库 openconnect/protocol 的 README 把「IETF 网站上的当前文本」写成 draft-mavrogiannopoulos-openconnect-03。2026-10-11 打开数据跟踪站的文档主页,最新修订是 -04(发布标注为 2023 年 7 月,最近更新 2024-01-25),类型是个人草案,状态为已过期,预期 RFC 状态为空。它不是 RFC。
-04 的 HTML 里有两处到期日:文首元数据写 2024-01-24,状态节写 2024-01-02。本文没有分辨哪一处是排版差异。数据跟踪站已把它标成过期。协议仓库的 README 仍指向 -03。引用「当前文本」时要说明自己打开的是哪一版。
-04 仍把协议称为版本 1.2,并写明相信与 Cisco AnyConnect 兼容。引言说它把安全交给已有标准:HTTP、TLS(RFC 8446)和 DTLS(RFC 6347,即 DTLS 1.2)。草案同时写「DTLS 1.2 或更新版本」。-04 的参考文献仍把 HTTP/1.1 指向 RFC 2616,而不是后来的 RFC 9110 与 RFC 9112。
草案里的会话可以收成四步,这里只记角色,不抄报文字段:
| 阶段 | -04 中的角色 |
|---|---|
| TLS | 服务器始终用证书认证。草案写客户端 SHOULD 协商 TLS 1.2 或更新版本 |
| 客户端认证 | 口令、PKIX 证书、HTTP SPNEGO(RFC 4559),或它们的组合 |
| CSTP | 主通道。HTTP CONNECT 之后,这条 TCP 连接改为传送 IP 包 |
| DTLS | 可选的 UDP 通道,用来避开「TCP 套在 TCP 里」。密钥来自 TLS 导出器(RFC 5705),不在 UDP 上另传一份预共享密钥 |
没有 X-CSTP-Split-Include 时,草案期望客户端把默认路由放进隧道;有这项头部时,它表示经这台服务器到达的网络。分流的一般概念见 VPN 分流是什么。预共享密钥和证书的差别见 预共享密钥与证书认证。
草案把通道写成互联网层,承载 IP 包。三层和二层虚拟网卡的差别见 TUN 与 TAP。本文没有在 ocserv 源码里确认它打开的是哪一种设备节点。
保活和死对端探测在草案里是独立报文类型,并提到与 RFC 3706 的相似。概念见 VPN 保活与掉线重连。草案还写明压缩不得默认开启,因为加密前压缩有已知风险。本文不展开那些攻击,也不讨论草案安全考虑里关于识别和外观的句子。
TCP 与 UDP 哪一条承载隧道,见 VPN 用 TCP 还是 UDP。客户端功能页另写:数据可以走 TCP(HTTPS)或 UDP(DTLS 或 ESP)。ESP 没有出现在 -04 对 OpenConnect 1.2 通道的定义里。哪些厂商协议在 v9.21 中使用 ESP,本文没有逐协议复测。
客户端首页列出的协议
2026-10-11 的客户端首页把支持的协议写成:
| 首页上的名称 | 首页给出的协议选项名 |
|---|---|
| Cisco AnyConnect | anyconnect |
| Array Networks SSL VPN | array |
| Juniper SSL VPN | nc |
| Pulse Connect Secure | pulse |
| Palo Alto Networks GlobalProtect | gp |
| F5 Big-IP | f5 |
| Fortinet FortiGate | fortinet |
这是客户端的互操作名单。ocserv 的 README 只声明 OpenConnect 协议,以及与 Cisco AnyConnect SSL VPN 的兼容。本文没有在 ocserv 源码里搜索其余厂商的服务端实现,因此不把那份客户端名单写成 ocserv 的服务端能力。
sing-box 的 v1.14.3 文档把 openconnect 列为一种端点。那是另一个项目里的客户端实现,协议规范不属于 sing-box。见 sing-box 是什么项目。
文档中的平台与用途
ocserv README 写明:设计并在 Linux 上用 IPv4 和 IPv6 测试;已知也能在 FreeBSD、OpenBSD 及其他 BSD 衍生系统上运行。没有 procfs 的平台有一条限制:配置变更应在服务器停止时进行,否则新的工作进程会读到新配置,主进程仍用旧配置。这是 README 里的行为说明,不是操作手册。
README 把用途写成:为需要远程接入、并且要有企业用户管理的组织提供 SSL VPN。可选的构建开关在 README 里点了名,包括 PAM、RADIUS、GSSAPI/Kerberos 和 OpenID Connect。它们是编译期能力,不是本文验证过的部署。
客户端更新日志里的 v9.21 是缺陷修复。服务端 NEWS 在 1.5.0 条目标了两条 SECURITY。master 上还有未发布的 1.5.1 章节。本文没有对照漏洞数据库复核这些条目,也没有把某一份镜像站上的 changelog 当成更新的来源:2026-10-11 的检索里,gitlab.io 的 changelog 页面仍出现 1.2.x 标题,与 Git 标签不一致。版本以 GitLab 标签和仓库 NEWS 为准。
和相关项目差在哪
| 项目 | 重心 | 边界 |
|---|---|---|
| OpenConnect 客户端 | 多种 SSL VPN 的客户端 | 不因为能连某家网关,就变成那家的官方客户端 |
| ocserv | OpenConnect 协议的服务端 | 同时声明兼容 AnyConnect SSL VPN。不实现客户端名单里的每一种服务端 |
| Cisco AnyConnect | 厂商自己的客户端与网关 | 草案写「相信兼容」。兼容范围以具体版本的互通测试为准,本文没有做 |
| strongSwan / IPsec | IKE 与 ESP | 使用的是另一组 RFC。见 strongSwan 是什么 |
| OpenVPN | 另一套基于 TLS 的隧道 | 会话模型和报文不属于 OpenConnect。对照见 WireGuard 与 OpenVPN |
| 代理平台 | 多协议转发核心 | 可以调用一个 OpenConnect 客户端端点,但那不是 ocserv |
引用时先分开的四件事
- 客户端 v9.21 与服务端 1.5.0 是两份发布。master 上的 1.5.1 章节当时还未作为标签发布。
- 协议文本有 -03 与 -04。仓库 README 和数据跟踪站的「最新」不是同一份。两份都已过期,都不是 RFC。
- 许可证:客户端文件头是 LGPL 2.1;服务端
main.c是 GPL 第 2 版或更新版本。 - ESP、其他厂商协议,以及 2026 年的维护者名单,都超出了本文逐项核对的范围。
本文只整理公开资料。部署远程接入还受当地电信管理和网络所有权约束;这里不提供规避管理的做法。
主要资料
- 客户端首页与更新日志:infradead.org/openconnect、changelog
- 客户端仓库:gitlab.com/openconnect/openconnect,标签 v9.21
- 服务端仓库与 NEWS:gitlab.com/openconnect/ocserv,标签 1.5.0
- 0.0.1 公告:openconnect-devel,2013-02-20
- 协议草案:数据跟踪站上的 draft-mavrogiannopoulos-openconnect(-04);协议仓库 README 仍指向 -03
- TLS 1.3:RFC 8446;DTLS 1.2:RFC 6347;密钥材料导出:RFC 5705