Ubuntu 22.04 安装 ocserv 1.1.3 指南
Ubuntu 22.04 从 0 到 1 安装 ocserv 1.1.3:仓库在线与离线 deb 双方案、自建证书链、认证账号、NAT 转发、systemd 托管与 openconnect 客户端全流程连通实测(2026-10-26)。
Ubuntu 22.04 安装 ocserv 1.1.3 指南
目标:在 Ubuntu 22.04 服务器上从 0 到 1 安装并跑通 OpenConnect VPN server(ocserv):仓库在线安装与离线 deb 两种方案、自建证书链、认证账号、监听端口与 VPN 网段配置、NAT 转发、systemd 托管、服务端 occtl 验证与 openconnect 客户端全流程连通实测。全部命令与回显取自 ocserv 1.1.3-1(Ubuntu 22.04 jammy/universe 仓库版)在 Ubuntu 22.04 x86_64 服务器上的实测(2026-10-26)。
一、环境信息
- 操作系统:Ubuntu 22.04(jammy),x86_64,内核自带 tun 设备支持(
/dev/net/tun)。 - ocserv 版本:1.1.3-1(Ubuntu 22.04 官方 universe 仓库),上游同名项目为 OpenConnect VPN server。
- GnuTLS:3.7.3(
ocserv -v实查回显见三章)。 - 客户端:OpenConnect v8.20-1(Ubuntu 22.04 仓库版,另一台客户机上安装)。
- 服务端口:8132/TCP + 8132/UDP(本实测环境为避免与既有 HTTPS 服务争用 443 而选用;真实服务器若 443 空闲,保留默认 443 即可,步骤完全一致)。
- VPN 地址池:172.31.100.0/24;推送路由:10.89.66.0/24(模拟「只能经 VPN 访问的内网段」);服务器内网地址:10.89.66.10(内网 Web 服务器 10.89.66.20 由 Nginx 提供,用于连通性验证)。
- 演示账号:
admin/q1w2e3r4。 - 关键路径:配置
/etc/ocserv/ocserv.conf,证书/etc/ocserv/certs/,密码文件/etc/ocserv/ocpasswd,服务单元/lib/systemd/system/ocserv.service。
二、前置条件
安装开始前需要确认三项服务器侧条件:
- 根权限与软件源:以 root(或 sudo)操作,universe 仓库可用(ocserv 位于 jammy/universe)。
- TUN 设备可用:内核需加载 tun 模块,
ls /dev/net/tun应存在;云主机一般默认具备。 - 端口规划:默认 443/TCP+UDP;若与既有 HTTPS 服务冲突,改用其他端口(本文实测用 8132,改法见七章)。
ls -l /dev/net/tun # 确认 TUN 设备存在
crw-rw-rw- 1 root root 10, 200 Oct 26 09:20 /dev/net/tun
三、版本选型说明
ocserv 没有官方 deb 仓库,Ubuntu 22.04 用户的第一选择是发行版仓库版本。实查结果(2026-10-26):
apt-cache policy ocserv
ocserv:
Installed: 1.1.3-1
Candidate: 1.1.3-1
Version table:
*** 1.1.3-1 500
500 http://archive.ubuntu.com/ubuntu jammy/universe amd64 Packages
| 选项 | 版本 | 来源 | 说明 |
|---|---|---|---|
| 发行版仓库(本文实测) | 1.1.3-1 | jammy/universe | apt 直装、systemd 单元与默认配置齐备,随发行版安全更新 |
| 上游最新稳定版 | 1.6.0 | gitlab.com/openconnect/ocserv/releases | 2026-10-16 发布;1.1.3 为 2021-06-02 发布(官方 NEWS 实查) |
| 源码编译 | 任意 | 上游源码包 | 可取新版特性,需自备编译依赖与 systemd 单元,本专栏未展开实测 |
安装前可先核对二进制基本信息:1.1.3-1 编译特性齐全(含 PAM、Radius、GSSAPI、PKCS#11、AnyConnect 兼容):
ocserv -v
ocserv 1.1.3
Compiled with: seccomp, tcp-wrappers, oath, radius, gssapi, PAM, PKCS#11, AnyConnect
GnuTLS version: 3.7.3 (compiled with 3.7.1)
⚠️ 注意:
ocserv -v需在安装后执行;选型时请以apt-cache policy的实查结果为准,上游版本号随时间推移会继续更新,获取命令见「参考链接」。
四、方案 A:Ubuntu 官方仓库在线安装
本方案适合能访问 Ubuntu 镜像源的服务器,四步完成:安装 → 生成证书链 → 建账号 → 改配置并启动。
4.1 安装软件包
sudo apt update && sudo apt install -y ocserv
The following NEW packages will be installed:
ocserv
0 upgraded, 1 newly installed, 0 to remove and 2 not upgraded.
Need to get 248 kB of archives.
After this operation, 760 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 ocserv amd64 1.1.3-1 [248 kB]
Fetched 248 kB in 2s (133 kB/s)
Selecting previously unselected package ocserv.
(Reading database ... 8244 files and directories currently installed.)
Preparing to unpack .../ocserv_1.1.3-1_amd64.deb ...
Unpacking ocserv (1.1.3-1) ...
Setting up ocserv (1.1.3-1) ...
Created symlink /etc/systemd/system/multi-user.target.wants/ocserv.service → /lib/systemd/system/ocserv.service.
安装即自动注册开机自启(上面回显的 Created symlink ... ocserv.service 即 enable 动作)。发行版自带的 systemd 单元如下(实查 /lib/systemd/system/ocserv.service):
[Unit]
Description=OpenConnect SSL VPN server
Documentation=man:ocserv(8)
After=network-online.target
After=dbus.service
[Service]
PrivateTmp=true
PIDFile=/run/ocserv.pid
ExecStart=/usr/sbin/ocserv --foreground --pid-file /run/ocserv.pid --config /etc/ocserv/ocserv.conf
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
单元以 --foreground 方式运行(由 systemd 直接托管进程),ExecReload 走 SIGHUP 热加载。若需要临时开调试日志,可在 /etc/systemd/system/ocserv.service.d/debug.conf 覆盖启动命令:
[Service]
ExecStart=
ExecStart=/usr/sbin/ocserv --config=/etc/ocserv/ocserv.conf -d 4
修改后执行 systemctl daemon-reload && systemctl restart ocserv 生效(排障时用,长期运行请关闭,原因见《ocserv 1.1.3 安全加固指南》对调试级别泄漏口令的说明)。
4.2 生成证书链(CA / 服务器 / 客户端)
默认配置引用的是发行版 snakeoil 自签证书;生产建议自建一套 CA 并签发服务器证书。安装证书工具并建立目录:
sudo apt install -y gnutls-bin && mkdir -p /etc/ocserv/certs && cd /etc/ocserv/certs
写三个签名模板。CA 模板 ca.tmpl:
cat > /etc/ocserv/certs/ca.tmpl <<'EOF'
cn = "Example Corp VPN Root CA"
organization = "Example Corp"
expiration_days = 3650
ca
cert_signing_key
EOF
服务器模板 server.tmpl(cn 写客户端访问用的主机名或 IP 归属名):
cat > /etc/ocserv/certs/server.tmpl <<'EOF'
cn = "vpn.corp.internal"
organization = "Example Corp"
expiration_days = 1825
signing_key
encryption_key
tls_www_server
EOF
客户端模板 client.tmpl(cn/uid 与认证用户名对应,证书认证时 ocserv 按 cert-user-oid 从这里取用户名):
cat > /etc/ocserv/certs/client.tmpl <<'EOF'
cn = "admin"
uid = "admin"
organization = "Example Corp"
expiration_days = 730
tls_www_client
signing_key
encryption_key
EOF
依次生成 CA 密钥与证书、服务器密钥与证书、客户端密钥与证书(实测回显逐行照抄):
certtool --generate-privkey --outfile ca-key.pem
certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem
Generating a 3072 bit RSA private key...
Generating a self signed certificate...
certtool --generate-privkey --outfile server-key.pem
certtool --generate-certificate --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem --template server.tmpl --outfile server-cert.pem
Generating a 3072 bit RSA private key...
Signing certificate...
certtool --generate-privkey --outfile client-key.pem
certtool --generate-certificate --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem --template client.tmpl --outfile client-cert.pem
Generating a 3072 bit RSA private key...
Signing certificate...
产物核对(实测 ls -l 节选):
-rw-r--r-- 1 root root 1541 Oct 26 01:30 ca-cert.pem
-rw------- 1 root root 8170 Oct 26 01:30 ca-key.pem
-rw-r--r-- 1 root root 105 Oct 26 01:30 ca.tmpl
-rw-r--r-- 1 root root 1614 Oct 26 01:30 client-cert.pem
-rw------- 1 root root 8177 Oct 26 01:30 client-key.pem
-rw-r--r-- 1 root root 121 Oct 26 01:30 client.tmpl
-rw-r--r-- 1 root root 1598 Oct 26 01:30 server-cert.pem
-rw------- 1 root root 8177 Oct 26 01:30 server-key.pem
-rw-r--r-- 1 root root 120 Oct 26 01:30 server.tmpl
验证证书主体与信任链(实测回显节选):
certtool --certificate-info --infile server-cert.pem | head -6
Issuer: CN=Example Corp VPN Root CA,O=Example Corp
Not Before: Mon Oct 26 01:30:51 UTC 2026
Not After: Sat Oct 25 01:30:51 UTC 2031
Subject: CN=vpn.corp.internal,O=Example Corp
Subject Public Key Algorithm: RSA
Subject Key Identifier (not critical):
certtool --verify --infile server-cert.pem --load-ca-certificate ca-cert.pem
Output: Verified. The certificate is trusted.
Chain verification output: Verified. The certificate is trusted.
同时记下服务器证书的 SHA256 指纹,客户端首连校验要用(见 4.5 与九章 FAQ):
certtool --certificate-info --infile server-cert.pem | grep -A1 'SHA-256'
sha256:383ec2dcbde8a0b388b5d817b83f767bcee7895868c17b8dc511944fc6fa3258
4.3 创建认证账号
创建 /etc/ocserv/ocpasswd 并添加演示账号 admin(口令 q1w2e3r4,交互输入两次):
sudo ocpasswd -c /etc/ocserv/ocpasswd admin
完成后核对文件内容(哈希为实测值,口令哈希由 ocpasswd 生成,此处口令即演示约定 q1w2e3r4):
sudo cat /etc/ocserv/ocpasswd
admin:*:$5$n6zo9hgYmCEbwPC4$peVBbkh7acoRC53pxAgLNr6A6nQNAiexqUbAfGVw9tB
ocpasswd 支持锁定/解锁/删除用户(ocpasswd --help 实查参数):-l 锁定、-u 解锁、-d 删除、-g 指定组;锁定与解锁对登录的实际影响已在《ocserv 1.1.3 安全加固指南》实测。
4.4 修改核心配置
默认配置 /etc/ocserv/ocserv.conf 自带全套注释。相对默认值需要改动的关键项如下(左列为发行版默认值,右列为本文实测生效值):
| 配置项 | 发行版默认 | 实测生效值 | 作用 |
|---|---|---|---|
auth | pam[gid-min=1000] | plain[passwd=/etc/ocserv/ocpasswd] | 改用本地密码文件认证 |
tcp-port / udp-port | 443 / 443 | 8132 / 8132 | 服务端口(本环境 443 另有他用) |
server-cert / server-key | snakeoil 路径 | /etc/ocserv/certs/server-cert.pem / server-key.pem | 自建服务器证书 |
ca-cert | snakeoil 路径 | /etc/ocserv/certs/ca-cert.pem | 校验客户端证书用的 CA |
default-domain | example.com | vpn.corp.internal | 推给客户端的 VPN 域名 |
ipv4-network / ipv4-netmask | 192.168.1.0 / 255.255.255.0 | 172.31.100.0 / 255.255.255.0 | VPN 地址池 |
dns | — | 8.8.8.8、1.1.1.1(两行) | 推给客户端的 DNS |
route | 三条 RFC1918 | 10.89.66.0/24 | 推送的内网路由(split-include) |
max-same-clients | 2(默认注释) | 1 | 同一账号最大并发连接(加固用) |
逐项修改(sed 逐条执行,均可回查):
sudo sed -i 's|^auth = "pam\[gid-min=1000\]"|auth = "plain[passwd=/etc/ocserv/ocpasswd]"|' /etc/ocserv/ocserv.conf
sudo sed -i 's|^tcp-port = 443|tcp-port = 8132|; s|^udp-port = 443|udp-port = 8132|' /etc/ocserv/ocserv.conf
sudo sed -i 's|^server-cert = .*|server-cert = /etc/ocserv/certs/server-cert.pem|; s|^server-key = .*|server-key = /etc/ocserv/certs/server-key.pem|' /etc/ocserv/ocserv.conf
sudo sed -i 's|^ca-cert = .*|ca-cert = /etc/ocserv/certs/ca-cert.pem|' /etc/ocserv/ocserv.conf
sudo sed -i 's|^default-domain = example.com|default-domain = vpn.corp.internal|' /etc/ocserv/ocserv.conf
sudo sed -i 's|^ipv4-network = 192.168.1.0|ipv4-network = 172.31.100.0|' /etc/ocserv/ocserv.conf
sudo sed -i 's|^#route = 10.0.0.0/8|route = 10.89.66.0/24|' /etc/ocserv/ocserv.conf
配置校验命令 ocserv -t(配置正常时无输出、返回码 0,实测回显):
ocserv -t -c /etc/ocserv/ocserv.conf; echo "rc=$?"
note: vhost:default: setting 'plain' as primary authentication method
note: setting 'file' as supplemental config option
test rc=0
4.5 开启转发与 NAT,启动服务
VPN 网段要访问服务器背后内网,需开 ip_forward 并加 MASQUERADE(实测环境内网口为 eth0):
echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-ocserv.conf && sudo sysctl -p /etc/sysctl.d/99-ocserv.conf
net.ipv4.ip_forward = 1
sudo iptables -t nat -A POSTROUTING -s 172.31.100.0/24 -o eth0 -j MASQUERADE
启动并核对(实测回显):
sudo systemctl enable ocserv && sudo systemctl restart ocserv && sudo systemctl is-active ocserv
Synchronizing state of ocserv.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable ocserv
active
sudo ss -ltnup | grep ocserv-main
udp UNCONN 0 0 0.0.0.0:8132 0.0.0.0:* users:(("ocserv-main",pid=3272,fd=7))
tcp LISTEN 0 1024 0.0.0.0:8132 0.0.0.0:* users:(("ocserv-main",pid=3272,fd=3))
启动日志(journalctl -u ocserv 实测节选)确认监听与 sec-mod 初始化:
Oct 26 01:31:28 vpn-server ocserv[3272]: note: setting 'file' as supplemental config option
Oct 26 01:31:28 vpn-server ocserv[3272]: listening (TCP) on 0.0.0.0:8132...
Oct 26 01:31:28 vpn-server ocserv[3272]: listening (UDP) on 0.0.0.0:8132...
Oct 26 01:31:28 vpn-server ocserv[3274]: sec-mod: reading supplemental config from files
Oct 26 01:31:28 vpn-server ocserv[3274]: sec-mod: sec-mod initialized (socket: /run/ocserv.socket.b2386950.0)
NAT 规则核对(iptables -t nat -S POSTROUTING 实测节选,DOCKER_* 为实测环境既有链,可忽略):
-P POSTROUTING ACCEPT
-A POSTROUTING -s 172.31.100.0/24 -o eth0 -j MASQUERADE
五、方案 B:离线 deb 包安装
断网内网服务器无法 apt install 时,用「联网机下载 deb → 目标机 dpkg 安装」两步完成。该方案安装的是同一个 1.1.3-1 包,依赖在标准 Ubuntu 22.04 上均已随基础系统满足。
第一步,在可联网的机器上下载(实测回显):
mkdir -p /root/offline && cd /root/offline && apt-get download ocserv
Get:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 ocserv amd64 1.1.3-1 [248 kB]
Fetched 248 kB in 1s (210 kB/s)
ls -l
-rw-r--r-- 1 root root 248174 Oct 19 2021 ocserv_1.1.3-1_amd64.deb
⚠️ 注意:下载过程若出现
Download is performed unsandboxed as root ... Permission denied警告,仅表示以 root 直接写文件、不影响 deb 完整性。
第二步,把 deb 拷贝到目标机后安装(实测回显,目标机存在同版本包时的重装形态;全新安装仅多出依赖包的解包行):
dpkg -i ocserv_1.1.3-1_amd64.deb
(Reading database ... 8261 files and directories currently installed.)
Preparing to unpack ocserv_1.1.3-1_amd64.deb ...
Unpacking ocserv (1.1.3-1) over (1.1.3-1) ...
Setting up ocserv (1.1.3-1) ...
echo "rc=$?"
rc=0
systemctl is-active ocserv
active
安装后 diff 核对配置文件未被覆盖(conffile 机制:已修改的配置文件在重装时保留,实测确认 ocserv.conf 中认证行仍在)。若目标机提示依赖缺失(如 dpkg: dependency problems),对缺失包逐个重复 apt-get download <包名> 并与 ocserv 的 deb 一并 dpkg -i 即可。
六、方案对比与选择建议
| 维度 | 方案 A:仓库在线安装 | 方案 B:离线 deb 安装 |
|---|---|---|
| 网络要求 | 服务器可达 Ubuntu 镜像源 | 仅下载机联网,目标机可离线 |
| 版本 | 1.1.3-1(随源同步) | 手动拷入的固定 deb(1.1.3-1) |
| 依赖处理 | apt 自动解析 | 需自行补齐缺件(少见) |
| systemd 单元/默认配置 | 自动齐备 | 同左(同一 deb) |
| 适用 | 标准环境首选 | 隔离内网、审计要求固定包来源 |
选择建议:能联网直接选方案 A;内网隔离环境用方案 B,包来源固定且与仓库版完全一致。若必须使用上游 1.6.0 的新特性,再评估源码编译路线(上游 INSTALL 与 meson 构建说明,见参考链接),并自备 systemd 单元。
七、基础配置说明
安装方案的共用配置语义集中在 /etc/ocserv/ocserv.conf,三层结构需要理解:
- 不可热加载段(文件头到
### All configuration options below this line are reloaded on a SIGHUP.之前):auth、tcp-port、udp-port、server-cert、server-key、ca-cert等只在启动(restart)时读取;其中证书四项例外——文件内容变化时 reload 会自动重载,支持不停机换证书。 - 可热加载段:超时、限制、路由、DNS 等,
systemctl reload ocserv(即 SIGHUP)即生效,且对已在线客户端在重连后下发(实测:改dpd/dns后客户端重连立即看到新值)。 - 每用户/组覆盖:
config-per-user/config-per-group目录下的同名文件可覆盖全局项,实测确认对指定用户生效(详见《ocserv 1.1.3 配置参数详解》)。
本文安装场景改动的最小集合即 4.4 节表格八项;逐参数语义、默认值与修改-验证闭环全部在《ocserv 1.1.3 配置参数详解》展开。安装完成后的核心生效项快照(/etc/ocserv/ocserv.conf 实查节选):
auth = "plain[passwd=/etc/ocserv/ocpasswd]"
tcp-port = 8132
udp-port = 8132
server-cert = /etc/ocserv/certs/server-cert.pem
server-key = /etc/ocserv/certs/server-key.pem
ca-cert = /etc/ocserv/certs/ca-cert.pem
default-domain = vpn.corp.internal
ipv4-network = 172.31.100.0
ipv4-netmask = 255.255.255.0
dns = 8.8.8.8
dns = 1.1.1.1
route = 10.89.66.0/24
八、验证与客户端连通实测
服务端先自检(ocserv 1.1.3 的 occtl 已内建,use-occtl = true):
occtl show status
Note: the printed statistics are not real-time; session time
as well as RX and TX data are updated on user disconnect
General info:
Status: online
Server PID: 3318
Sec-mod PID: 3320
Sec-mod instance count: 1
Up since: 2026-10-26 01:34 ( 2m:47s)
Active sessions: 1
Total sessions: 1
Total authentication failures: 0
IPs in ban list: 0
Median latency: <1ms
STDEV latency: <1ms
客户端机安装 OpenConnect(实测回显):
sudo apt install -y openconnect && openconnect --version | head -2
OpenConnect version v8.20-1
Using GnuTLS 3.7.3. Features present: TPMv2, PKCS#11, RSA software token, HOTP software token, TOTP software token, Yubikey OATH, System keys, DTLS, ESP
自签证书场景用 --servercert 固定指纹连接(指纹即 4.2 节记录的 sha256,-u 指定账号,口令 q1w2e3r4 交互输入;实测回显节选):
sudo openconnect --servercert "pin-sha256:MWbNlxA33/F2BwGPcRqmoVugLFpq0ANDVzd2QCjDTSY=" -u admin 10.89.65.10:8132
POST https://10.89.65.10:8132/
Attempting to connect to server 10.89.65.10:8132
Connected to 10.89.65.10:8132
SSL negotiation with 10.89.65.10
Server certificate verify failed: signer not found
Connected to HTTPS on 10.89.65.10 with ciphersuite (TLS1.3)-(ECDHE-SECP256R1)-(RSA-PSS-RSAE-SHA256)-(AES-256-GCM)
Got HTTP response: HTTP/1.1 200 OK
Set-Cookie: webvpncontext=; expires=Thu, 01 Jan 1970 22:00:00 GMT; path=/; Secure; HttpOnly
Content-Type: text/xml
X-Transcend-Version: 1
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: deny
X-Content-Type-Options: nosniff
Content-Security-Policy: default-src 'none'
...
Please enter your username.
Please enter your password.
Got CONNECT response: HTTP/1.1 200 CONNECTED
X-CSTP-Version: 1
X-CSTP-Server-Name: ocserv 1.1.3
X-CSTP-Default-Domain: vpn.corp.internal
X-CSTP-Address: 172.31.100.165
X-CSTP-Netmask: 255.255.255.0
X-CSTP-DNS: 8.8.8.8
X-CSTP-DNS: 1.1.1.1
X-CSTP-Split-Include: 10.89.66.0/255.255.255.0
X-CSTP-Keepalive: 300
X-CSTP-Idle-Timeout: 1200
X-CSTP-MTU: 1472
CSTP connected. DPD 60, Keepalive 300
Configured as 172.31.100.165, with SSL + LZ4 connected and DTLS disabled
Continuing in background; pid 3448
⚠️ 注意:回显中的
Server certificate verify failed: signer not found是自签 CA 的预期现象——--servercert指纹校验通过后连接继续;首次连接若不加该参数,可用openconnect --authenticate交互获取指纹再复核。
隧道建立后客户端侧验证(实测回显):虚拟网卡与路由:
ip -br addr show tun0
tun0 UNKNOWN 172.31.100.165/32 fe80::8fa6:edce:8e36:f390/64
ip route | grep tun0
1.1.1.1 dev tun0 scope link
8.8.8.8 dev tun0 scope link
10.89.66.0/24 dev tun0 scope link
172.31.100.0/24 dev tun0 scope link
经 VPN 访问仅内网可达的 Web 服务器(10.89.66.20):
curl -s http://10.89.66.20/
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Intranet Portal</title></head>
<body><h1>Intranet Portal</h1><p>Only reachable via VPN.</p></body></html>
回到服务端,用户与会话终验(实测回显):
occtl show users
id user vhost ip vpn-ip device since dtls-cipher status
3325 admin default 10.89.65.20 172.31.100.165 vpns0 22s (no-dtls) connected
九、常见问题(FAQ)
Q1:客户端首连报 SSL connection failure: Error in the pull function. 怎么排查?
实测复现:服务端口未就绪或被路径上的防火墙拦截时,openconnect 停在 TLS 握手第一段:
Attempting to connect to server 10.89.65.10:8132
Connected to 10.89.65.10:8132
SSL negotiation with 10.89.65.10
SSL connection failure: Error in the pull function.
Failed to open HTTPS connection to 10.89.65.10
Failed to complete authentication
定位顺序:服务端 systemctl is-active ocserv 应为 active;ss -ltnup | grep ocserv-main 确认 TCP/UDP 都在监听目标端口;中间链路放行 TCP+UDP 同号(ocserv 双通道共用一个端口号)。三步齐后重连即恢复(本文 4.5→八章即修复后实测)。
Q2:Server certificate verify failed: signer not found 是错误吗?
不是失败——自建 CA 未被客户端系统信任时的预期提示。两种处理:其一,客户端用 --servercert "pin-sha256:<指纹>" 固定证书指纹(本文实测采用,指纹来源见 4.2 节);其二,把 ca-cert.pem 导入客户端系统信任库后改用 --cafile 或系统信任校验。正式环境建议用受信 CA(如 Let's Encrypt)签发服务器证书。
Q3:频繁重启后服务起不来,日志报 error connecting to sec-mod socket '/run/ocserv.socket.xxxx': No such file or directory?
实测复现的竞态残留:daemon 化启动时旧的 sec-mod 套接字尚未清理导致 worker 连接失败、单元随即退出(journal 同现 ocserv.service: Deactivated successfully.)。处置(实测有效):
pkill -9 ocserv; rm -f /run/ocserv.socket*; systemctl start ocserv
并可用前台模式快速验证配置与监听(Ctrl+C 退出):
/usr/sbin/ocserv -f -c /etc/ocserv/ocserv.conf -d 4
listening (TCP) on 0.0.0.0:8132...
listening (UDP) on 0.0.0.0:8132...
ocserv[4337]: main: created sec-mod socket file (/run/ocserv.socket.9faa4080.0)
ocserv[4337]: main: initializing control unix socket: /var/run/occtl.socket
ocserv[4337]: main: initialized ocserv 1.1.3
Q4:修改了端口/认证方式,systemctl reload 不生效?
预期行为:tcp-port/udp-port/auth 位于配置文件不可热加载段,必须 systemctl restart ocserv;实测对照(reload 后监听端口不变、restart 后生效)与逐参数热加载边界见《ocserv 1.1.3 配置参数详解》三章。
十、卸载与清理
实测完整卸载路径(保留证书等手放文件时先备份):
sudo apt purge -y ocserv
The following packages will be REMOVED:
ocserv
0 upgraded, 0 newly installed, 1 to remove and 2 not upgraded.
After this operation, 760 kB disk space will be freed.
(Reading database ... 8248 files and directories currently installed.)
Removing ocserv (1.1.3-1) ...
(Reading database ... 8248 files and directories currently installed.)
Purging configuration files for ocserv (1.1.3-1) ...
dpkg: warning: while removing ocserv, directory '/etc/ocserv' not empty so not removed
purge 会删除包属主文件但保留用户自放内容,实测残留清单:
ls /etc/ocserv/
certs
config-per-user
ocpasswd
ocserv.conf.orig
连同 NAT 规则一并清理(避免残留转发策略):
sudo iptables -t nat -D POSTROUTING -s 172.31.100.0/24 -o eth0 -j MASQUERADE
sudo rm -f /etc/sysctl.d/99-ocserv.conf
sudo rm -rf /etc/ocserv
十一、参考链接
- 官方主页:https://ocserv.gitlab.io/www/
- 上游仓库与 Releases(升级 1.6.0 时取证):https://gitlab.com/openconnect/ocserv
- 上游源码构建说明(编译路线):https://gitlab.com/openconnect/ocserv/-/blob/master/INSTALL.asciidoc
- OpenConnect 客户端文档:https://www.infradead.org/openconnect/
- ocserv 手册页(安装后本地可用):
man ocserv、man ocpasswd、man occtl - 本专栏系列: