OpenConnect 配置参数详解
ocserv.conf 逐参数实测详解:默认配置 47 行生效参数全量核对,认证/计分封禁/监听进程/并发超时/地址路由五大类逐项验证改动效果(端口、max-same-clients、dpd 热重载、封禁计分、地址池),ocserv -t 校验与 reload 实测,含 50 人生产模板与 FAQ,实测日期 2026-10-20。
OpenConnect 配置参数详解
目标:逐项讲清 ocserv 服务端核心配置文件
/etc/ocserv/ocserv.conf的参数含义、默认值与改动效果。所有参数默认值取自 Ubuntu 22.04 软件源自带的 ocserv 1.1.3-1 默认配置文件(随包官方文档),关键参数的改动效果均在同一台 Ubuntu 22.04 服务器上重启/重载服务后实测验证(客户端连接、occtl 观测、端口监听核对),实测环境见第一章。
一、环境信息
- 操作系统:Ubuntu 22.04.4 LTS (jammy),x86_64,内核 6.8.0-138-generic
- 服务端:ocserv 1.1.3-1(apt 安装,编译特性:seccomp, tcp-wrappers, oath, radius, gssapi, PAM, PKCS#11, AnyConnect)
- 客户端:openconnect 8.20-1(apt 安装,GnuTLS 3.7.3,支持 DTLS/ESP/LZ4)
- 配置文件:
/etc/ocserv/ocserv.conf(默认 667 行,其中生效参数 47 行) - systemd 单元:
/lib/systemd/system/ocserv.service - 实测方式:修改参数 →
systemctl restart ocserv(或occtl reload)→ss核对端口、openconnect 客户端连接、occtl观测;认证使用plain[passwd=/etc/ocserv/ocpasswd](ocpasswd创建账号 admin),服务器证书为 certtool 自签证书 - 上游最新稳定版(2026-10-20 官方 releases 实查):ocserv 1.6.0;本篇实测基于 jammy 的 1.1.3,参数命名两版一致,差异处已标注
二、前置条件
- 已按《Ubuntu 22.04 安装 OpenConnect 指南》完成 ocserv 安装并确认服务可启动(本篇不重复安装步骤,但每个参数验证命令均可独立执行)。
- 已生成服务器证书与私钥(本文示例沿用安装篇的
/etc/ocserv/server-cert.pem、/etc/ocserv/server-key.pem、/etc/ocserv/ca.pem)。 - 已用
ocpasswd创建至少一个 plain 认证用户(本文用admin,口令q1w2e3r4),配置中认证方式为auth = "plain[passwd=/etc/ocserv/ocpasswd]"。 - 熟悉
systemctl与ss基本用法;修改配置文件前建议备份:cp /etc/ocserv/ocserv.conf /etc/ocserv/ocserv.conf.bak。
三、参数查看与修改方式
3.1 查看当前生效参数
默认配置文件以 # 注释为主,真正的生效行可用 grep 提取(以下为本机实测输出):
grep -vE '^\s*#|^\s*$' /etc/ocserv/ocserv.conf
实测输出(Ubuntu 22.04 ocserv 1.1.3-1 默认配置,共 47 行):
auth = "pam[gid-min=1000]"
tcp-port = 443
udp-port = 443
run-as-user = nobody
run-as-group = daemon
socket-file = /run/ocserv.socket
server-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem
server-key = /etc/ssl/private/ssl-cert-snakeoil.key
ca-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem
isolate-workers = true
max-clients = 128
max-same-clients = 2
server-stats-reset-time = 604800
keepalive = 300
dpd = 60
mobile-dpd = 300
switch-to-tcp-timeout = 25
try-mtu-discovery = false
cert-user-oid = 0.9.2342.19200300.100.1.1
compression = true
no-compress-limit = 256
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128"
auth-timeout = 240
idle-timeout = 1200
mobile-idle-timeout = 1800
min-reauth-time = 300
max-ban-score = 80
ban-reset-time = 300
cookie-timeout = 300
deny-roaming = false
rekey-time = 172800
rekey-method = ssl
use-occtl = true
pid-file = /run/ocserv.pid
device = vpns
predictable-ips = true
default-domain = example.com
ipv4-network = 192.168.1.0
ipv4-netmask = 255.255.255.0
dns = 8.8.8.8
dns = 1.1.1.1
ping-leases = false
route = 10.0.0.0/8
route = 172.16.0.0/12
route = 192.168.0.0/16
cisco-client-compat = true
dtls-legacy = true
⚠️ 注意:第 1 行默认是
auth = "pam[gid-min=1000]"(PAM 认证、账号 GID ≥ 1000),第 7~9 行默认引用 Ubuntu 的 snakeoil 自签证书(ssl-cert包提供)。这两处是安装后最先要改的两个点。
3.2 修改与校验:ocserv -t
ocserv 提供 -t/--test-config 只校验不启动。合法配置校验通过仅输出两条 note、退出码 0:
ocserv -t -c /etc/ocserv/ocserv.conf
实测输出:
note: vhost:default: setting 'plain' as primary authentication method
note: setting 'file' as supplemental config option
把端口值改坏(tcp-port = abc)并追加一个不存在的选项再校验:
cp /etc/ocserv/ocserv.conf /etc/ocserv/broken.conf
sed -i 's/^tcp-port = 15001/tcp-port = abc/' /etc/ocserv/broken.conf
echo 'bogus-option = 1' >> /etc/ocserv/broken.conf
ocserv -t -c /etc/ocserv/broken.conf
实测输出(未知选项只是警告并被跳过,非法值导致必选项缺失报错,退出码 1):
warning: skipping unknown option 'bogus-option'
note: vhost:default: setting 'plain' as primary authentication method
error: the tcp-port option is mandatory!
配置文件不存在时:
error: cannot access config file: /nonexistent.conf
Usage: ocserv -c [config]
Use ocserv --help for more information.
3.3 修改生效的两条路径
- 重启(认证方式 auth、端口等不支持的项必须重启):
systemctl restart ocserv - 热重载(大部分运行参数支持):
occtl reload,实测返回Server scheduled to reload,日志出现重新读取配置的记录。
热重载是否真实生效可用「改 dpd 后重连看客户端收到的值」验证。把 dpd = 60 改为 dpd = 90 后 occtl reload,再连一次客户端,实测收到:
X-CSTP-DPD: 90
X-DTLS-DPD: 90
💡 说明:哪些参数能热重载没有逐项官方清单,稳妥做法是——涉及证书、认证方式、监听端口的改动用
systemctl restart;超时/并发/路由类改动可先occtl reload再实测验证。
四、参数总览
按功能把 47 个默认生效参数与常用可选项分四类,默认值为 jammy 1.1.3 配置文件中的值:
| 分类 | 参数(默认值) | 作用一句话 |
|---|---|---|
| 认证与会话 | auth、enable-auth、auth-timeout(240)、cookie-timeout(300)、min-reauth-time(300)、deny-roaming(false) | 用什么方式验身份、认证限时、cookie 重连窗口 |
| 防滥用计分 | max-ban-score(80)、ban-reset-time(300)、ban-points-wrong-password(10)、ban-points-connection(1)、ban-points-kkdcp(1) | 按 IP 对失败行为计分与封禁 |
| 监听与进程 | tcp-port(443)、udp-port(443)、listen-host(全地址)、socket-file、pid-file、run-as-user(nobody)、run-as-group(daemon)、isolate-workers(true)、use-occtl(true)、server-cert/server-key/ca-cert、tls-priorities | 端口、证书、进程身份与沙箱 |
| 并发与超时 | max-clients(128)、max-same-clients(2)、keepalive(300)、dpd(60)、mobile-dpd(300)、switch-to-tcp-timeout(25)、idle-timeout(1200)、mobile-idle-timeout(1800)、rekey-time(172800)、rekey-method(ssl)、server-stats-reset-time(604800) | 连接数与各类保活/超时 |
| 地址与路由 | device(vpns)、ipv4-network(192.168.1.0)、ipv4-netmask(/24)、predictable-ips(true)、default-domain、dns、route、ping-leases(false)、try-mtu-discovery(false)、compression(true)、no-compress-limit(256)、cisco-client-compat(true)、dtls-legacy(true)、cert-user-oid | 客户端地址、推送路由/DNS、压缩与兼容 |
五、核心参数分类详解
5.1 认证与会话类
5.1.1 auth —— 主认证方式
auth = "plain[passwd=/etc/ocserv/ocpasswd]"
可选值:certificate、plain[passwd=...,otp=...]、pam[gid-min=N]、radius[config=...,groupconfig=true]、gssapi[keytab=...,require-local-user-map=true,tgt-freshness-time=900]。可写多行 auth 表示「全部都要通过」,多类型认证的「或」语义由 enable-auth 表达。
实测排障(高频错误):同时写 auth = "plain[...]" 与 enable-auth = "plain[...]" 会启动失败:
note: vhost:default: setting 'plain' as primary authentication method
note: vhost:default: enabling 'plain' as authentication method
error: vhost:default: you cannot mix multiple password authentication methods
systemd[1]: ocserv.service: Failed with result 'exit-code'.
定位:auth 与 enable-auth 各写一行同类口令认证(plain/pam)时被判定为「混用多种口令认证方式」;解决:删除多余的 enable-auth 行,只保留一行 auth。该错误实测出现在服务启动阶段,systemctl status ocserv 即可看到完整报错。
plain 认证的账号文件由 ocpasswd 维护(创建/改组/锁定/删除实测见《OpenConnect 常用 CLI 命令详解》);otp= 子选项启用 TOTP 一次性口令,文件格式为 mod-authn-otp 的 UsersFile。
5.1.2 auth-timeout / cookie-timeout / min-reauth-time
| 参数 | 默认 | 含义 |
|---|---|---|
| auth-timeout | 240 | 客户端完成整个认证流程的最长秒数,超时断开未认证连接 |
| cookie-timeout | 300 | 认证成功后下发的 cookie 在未使用时的有效期;连接期间与断线后该时间内可用 cookie 重连 |
| min-reauth-time | 300 | 客户端两次重新认证之间的最小间隔秒数 |
实测关联:封禁列表的「封禁时长」按 min-reauth-time 计(见 5.2 实测),三者都是抗暴力破解的节流参数。
5.1.3 deny-roaming
deny-roaming = false
默认 false 允许同一用户从不同 IP 同时登录(漫游);设 true 后同一用户更换 IP 登录会被拒绝。本文保持默认 false,实测中同一 admin 账号在 127.0.0.1 与网卡 IP 双入口登录均成功。
5.2 防滥用计分类(ban)
max-ban-score = 80
ban-reset-time = 300
#ban-points-wrong-password = 10
#ban-points-connection = 1
#ban-points-kkdcp = 1
默认配置注释明示语义:IP 计分超过 max-ban-score 即被封禁 min-reauth-time 秒;错误口令 +10 分、KKDCP POST +1 分、每次连接 +1 分;因涉及多个进程,计分不是实时精确的;设 0 关闭。
实测(客户端连续用错误口令连接,服务端观测计分):
printf 'WrongPass999\n' | openconnect --servercert=pin-sha256:... --user=admin 127.0.0.1:15001
occtl show ip ban points
实测输出(错误口令第 1、2、3 次,每次 +10):
IP score
127.0.0.1 10
IP score
127.0.0.1 20
IP score
127.0.0.1 30
快速连续 8 次错误口令后,计分达到阈值 80 并进入封禁列表(带过期时间,实测剩余 4m30s,即 min-reauth-time=300s 起算):
IP score expires
127.0.0.1 80 2026-10-20 21:03 ( 4m:30s)
解封命令即时生效并清零:
IP '127.0.0.1' was unbanned
IP score
127.0.0.1 0
⚠️ 注意(多轮复测的诚实结论):在本机 1.1.3 版本上,即使计分达到 90(超过阈值 80),使用正确口令的新连接仍能完成认证(127.0.0.1 与网卡 IP 两种入口、多轮一致);同时 ban-reset-time(300s) 周期会把累计分数整体归零(实测观测到 60 → 10 的跳变)。计分数据与列表展示真实生效,但对该版本不能把它当成唯一的暴力破解拦截手段,生产建议叠加 fail2ban 或前置防火墙限速兜底。
5.3 监听与进程类
5.3.1 tcp-port / udp-port / listen-host
tcp-port = 443
udp-port = 443
#listen-host = [IP|HOSTNAME]
- tcp-port:TLS 控制通道(CSTP)监听端口;udp-port:DTLS 数据通道端口,两者可不同。
- listen-host 默认注释 = 监听全部 IPv4+IPv6 地址;需要只监听内网网卡时设为具体 IP。
实测:把两端口都改为 15001 并重启,ss 确认 TCP/UDP 同时就位:
LISTEN 0 1024 0.0.0.0:15001 0.0.0.0:* users:(("ocserv-main",pid=1613260,fd=3))
LISTEN 0 1024 [::]:15001 [::]:* users:(("ocserv-main",pid=1613260,fd=7))
UNCONN 0 0 0.0.0.0:15001 0.0.0.0:* users:(("ocserv-main",pid=1613260,fd=8))
UNCONN 0 0 [::]:15001 [::]:* users:(("ocserv-main",pid=1613260,fd=9))
客户端日志同步显示 DTLS 走同端口:X-DTLS-Port: 15001。
5.3.2 server-cert / server-key / ca-cert
server-cert = /etc/ocserv/server-cert.pem
server-key = /etc/ocserv/server-key.pem
ca-cert = /etc/ocserv/ca.pem
- server-cert/key:TLS 证书与私钥(自签或商业证书均可;证书需带 encryption/signing 能力,生成方法见安装篇)。
- ca-cert:校验客户端证书的 CA(仅 certificate 认证必需;plain/PAM 认证时设为服务器证书即可)。
- Ubuntu 默认引用 snakeoil 证书(
/etc/ssl/certs/ssl-cert-snakeoil.pem),自建时替换。
5.3.3 run-as-user / run-as-group / isolate-workers
run-as-user = nobody
run-as-group = daemon
isolate-workers = true
worker 进程以此为非特权身份运行;isolate-workers=true 时 worker 另加 seccomp 沙箱隔离。
⚠️ 注意(实测排障):在受限内核/加固环境(部分云主机模板、嵌套虚拟化宿主)上,isolate-workers=true 会导致 worker 起不来——客户端表现为 TLS 握手即断(
SSL 连接失败:Error in the pull function.),服务端日志出现:
ocserv[1710118]: The futex facility returned an unexpected error code.
定位方法:连接失败时 journalctl -u ocserv -n 20 看到上述行即可确认。解决:把 isolate-workers 改为 false 并 systemctl restart ocserv,实测改后同机自连立即成功(TLS1.3 + DTLS1.2 建立正常)。该开关以牺牲一层沙箱换取兼容性,内核正常的独立服务器保持 true。
5.3.4 use-occtl / socket-file / pid-file
use-occtl = true
socket-file = /run/ocserv.socket
pid-file = /run/ocserv.pid
use-occtl=true 启用管理 socket,occtl 才能查询/踢线/解封;socket-file 是该 socket 路径。服务未运行时用 occtl 会实测报错:
error connecting to ocserv socket '/var/run/occtl.socket': No such file or directory
(occtl 默认连编译期内置路径,服务端实际 socket 以配置为准;排障时先用 ss -lx | grep ocserv 确认 socket 存在。)
5.3.5 tls-priorities
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128"
GnuTLS 优先级串:NORMAL 基线、以服务器偏好协商、去掉 RSA 密钥交换/SSL3.0/RC4。实测默认配置下与 openconnect 8.20 协商出 (TLS1.3)-(ECDHE-SECP256R1)-(RSA-PSS-RSAE-SHA256)-(AES-256-GCM),DTLS 为 (DTLS1.2)-(PSK)-(AES-256-GCM)。
5.4 并发与超时类
5.4.1 max-clients / max-same-clients
max-clients = 128
max-same-clients = 2
max-clients 是全服务器并发上限;max-same-clients 是同一用户名同时在线数。实测把 max-same-clients 改为 1 后:第一个会话正常在线,同账号第二个连接被拒——客户端实测报错:
得到了不正确的 HTTP CONNECT 响应:HTTP/1.1 401 Cookie is not acceptable
创建 SSL 连接失败
Cookie was rejected by server; exiting.
服务端日志同步记录(实测):
sec-mod: using 'plain' authentication to authenticate user (session: vK4E+I)
sec-mod: initiating session for user 'admin' (session: vK4E+I)
worker[admin]: 127.0.0.1 failed cookie authentication attempt
sec-mod: temporarily closing session for admin (session: vK4E+I)
5.4.2 keepalive / dpd / mobile-dpd
| 参数 | 默认 | 含义 |
|---|---|---|
| keepalive | 300 | 保活包间隔秒数,维持 NAT 映射(实测协商头 X-CSTP-Keepalive: 300) |
| dpd | 60 | 死链检测间隔秒数,无响应即断开(移动网络可调大减少耗电) |
| mobile-dpd | 300 | 移动客户端(anyconnect 客户端以移动模式接入时)的 DPD 间隔 |
实测:dpd=60 时客户端收到的协商头为 X-CSTP-DPD: 60、X-DTLS-DPD: 60;改为 90 并 occtl reload 后重连,实测收到 X-CSTP-DPD: 90、X-DTLS-DPD: 90,证明热重载对该参数生效。
5.4.3 switch-to-tcp-timeout / idle-timeout / mobile-idle-timeout / rekey-time / rekey-method
| 参数 | 默认 | 含义 |
|---|---|---|
| switch-to-tcp-timeout | 25 | UDP/DTLS 不通多少秒后回落 TLS/TCP |
| idle-timeout | 1200 | 桌面客户端空闲断开秒数(0 不限制;实测协商头 X-CSTP-Idle-Timeout: 1200) |
| mobile-idle-timeout | 1800 | 移动客户端空闲断开秒数 |
| rekey-time | 172800 | 会话密钥重协商周期秒数(48h;实测协商头 X-CSTP-Rekey-Time: 172806,值随会话起算点略有偏移) |
| rekey-method | ssl | 重协商方式:ssl(走 TLS 重握手)或 eap |
5.4.4 server-stats-reset-time
server-stats-reset-time = 604800
occtl 统计周期(默认 7 天)自动清零的间隔;occtl show status 输出中的 Last stats reset 与之对应。
5.5 地址与路由类
5.5.1 ipv4-network / ipv4-netmask / predictable-ips / device
device = vpns
ipv4-network = 192.168.1.0
ipv4-netmask = 255.255.255.0
predictable-ips = true
- ipv4-network/netmask 定义客户端地址池;服务端取池内第一个可用地址(如 .1)作为隧道网关。
- predictable-ips=true:同一用户尽量拿历史同 IP(用户名哈希偏移);false 则顺序分配。
- device 是服务端 tun 网卡名基名;实测同一时刻多用户在线时出现 vpns0、vpns1(occtl show users 的 device 列可见)。
实测:地址池 10.10.10.0/24 时,同机客户端拿到 10.10.10.165(predictable-ips 的哈希偏移),隧道两端实测:
999: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1434 qdisc fq_codel state UNKNOWN group default qlen 500
link/none
inet 10.10.10.165/32 scope global tun0
valid_lft forever preferred_lft forever
998: vpns0: <POINTOPOINT,UP,LOWER_UP> mtu 1434 qdisc fq_codel state UNKNOWN group default qlen 500
link/none
inet 10.10.10.1 peer 10.10.10.165/32 scope global vpns0
valid_lft forever preferred_lft forever
⚠️ 注意:地址池不能与服务器既有内网网段重叠(否则回程路由冲突);默认的 192.168.1.0/24 在家用路由器环境极易撞段,建议改成冷门私网段(如 10.x)。另注意 IPv6 池
ipv6-network默认注释,双栈需求时需另行配置(默认配置文件第 443 行附近有示例#ipv6-network = fda9:4efe:7e3b:03ea::/48)。
5.5.2 dns
dns = 8.8.8.8
dns = 1.1.1.1
推送给客户端的 DNS 服务器,可写多行(实测协商头 X-CSTP-DNS: 8.8.8.8、X-CSTP-DNS: 1.1.1.1)。接入内网域控场景改成内网 DNS 即可实现通过 VPN 解析内网域名。
5.5.3 route(分流路由)
route = 10.0.0.0/8
route = 172.16.0.0/12
route = 192.168.0.0/16
推送到客户端的分流路由:仅目标在这些网段的流量进隧道,其余走本地网络(split-tunnel);不写任何 route 行则为全隧道。实测地址池 10.10.10.0/24、route = 10.10.20.0/24 时,客户端路由表与协商头为:
10.10.20.0/24 dev tun0 scope link
X-CSTP-Split-Include: 10.10.20.0/255.255.255.0
反选语义的 no-route(排除网段)与 route = default(全隧道,默认配置第 503 行注释示例)同样支持。
5.5.4 config-per-user / config-per-group(按用户覆盖)
#config-per-user = /etc/ocserv/config-per-user/
#config-per-group = /etc/ocserv/config-per-group/
以文件名=用户名/组名的文件覆盖该用户的 route、dns 等项(默认配置第 567 行注释:用户文件里出现的 routes、no-routes、DNS 会覆盖全局值)。服务端日志中实测可见补充配置机制已启用:note: setting 'file' as supplemental config option。
5.5.5 ping-leases / try-mtu-discovery / compression / no-compress-limit
| 参数 | 默认 | 含义与实测关联 |
|---|---|---|
| ping-leases | false | 是否对租约地址做 ICMP 探测判活 |
| try-mtu-discovery | false | 路径 MTU 探测;实测默认关闭时协商出 X-CSTP-Base-MTU: 1500、X-CSTP-MTU: 1434(1500 减去 TLS/DTLS 开销) |
| compression | true | 启用压缩,实测协商结果为 X-CSTP-Content-Encoding: oc-lz4、X-DTLS-Content-Encoding: oc-lz4,客户端显示「DTLS 连接压缩正使用 LZ4」 |
| no-compress-limit | 256 | 小于该字节数的包不压缩(小包压缩得不偿失) |
💡 技术拓展:VPN 隧道压缩常见选项——LZ4(ocserv 默认,速度优先、压缩比一般)、LZO(OpenVPN 传统选项)、DEFLATE(压缩比高但 CPU 开销大)、以及 TLS1.3 时代逐步推崇的「不压缩」(压缩流量可能被用于侧信道攻击,CRIME/BREACH 类攻击面)。本文沿用官方默认 oc-lz4:远程接入流量以文本类为主收益明显;若安全基线要求极高可设 compression=false 换确定性。
5.5.6 cisco-client-compat / dtls-legacy / cert-user-oid / default-domain / banner
| 参数 | 默认 | 含义 |
|---|---|---|
| cisco-client-compat | true | 兼容思科 AnyConnect 官方客户端(保持开启除非只用 openconnect) |
| dtls-legacy | true | 支持旧式 DTLS 协商(Cisco DTLSv1.0 兼容) |
| cert-user-oid | 0.9.2342.19200300.100.1.1 | certificate 认证时从证书哪个 OID 提取用户名(默认 UID OID) |
| default-domain | example.com | 推送给客户端的默认 DNS 搜索域(实测协商头 X-CSTP-Default-Domain: example.com) |
| banner | (注释) | 登录成功后展示给客户端的欢迎横幅,如 #banner = "Welcome" |
六、生产配置模板
适用场景:50 人以内团队远程接入,服务器 2 vCPU / 4GB 内存 / 40GB 磁盘(VPN 网关磁盘占用极小),plain 口令认证 + 高位端口 + 内网 DNS 分流。以下为实测可跑的完整模板(端口 15001 为示例高位端口,生产可自定义):
#=== /etc/ocserv/ocserv.conf 生产模板(2vCPU/4GB/50 人)===
auth = "plain[passwd=/etc/ocserv/ocpasswd]"
tcp-port = 15001
udp-port = 15001
listen-host = 0.0.0.0
run-as-user = nobody
run-as-group = daemon
socket-file = /run/ocserv.socket
pid-file = /run/ocserv.pid
use-occtl = true
server-cert = /etc/ocserv/server-cert.pem
server-key = /etc/ocserv/server-key.pem
ca-cert = /etc/ocserv/ca.pem
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128"
isolate-workers = true
max-clients = 64
max-same-clients = 2
auth-timeout = 240
cookie-timeout = 300
min-reauth-time = 300
max-ban-score = 80
ban-reset-time = 300
deny-roaming = false
keepalive = 300
dpd = 60
mobile-dpd = 300
switch-to-tcp-timeout = 25
idle-timeout = 1200
mobile-idle-timeout = 1800
rekey-time = 172800
rekey-method = ssl
server-stats-reset-time = 604800
device = vpns
ipv4-network = 10.99.0.0
ipv4-netmask = 255.255.255.0
predictable-ips = true
default-domain = example.com
dns = 10.99.0.1
dns = 223.5.5.5
route = 10.0.0.0/8
route = 172.16.0.0/12
route = 192.168.0.0/16
ping-leases = false
try-mtu-discovery = false
compression = true
no-compress-limit = 256
cisco-client-compat = true
dtls-legacy = true
逐块说明:认证块用 plain 文件口令,50 人以内免接 RADIUS;并发块 max-clients 按 4GB 内存取 64(实测单会话服务端内存占用为兆级,余量充足);地址块用 10.99.0.0/24 冷门段避免与办公网撞段,DNS 指向隧道网关做内网解析(需配合内网 DNS 服务,无内网 DNS 时删除该行只留公网 DNS);route 块为「RFC1918 三段进隧道」的经典分流策略。改动后先 ocserv -t -c 校验,再 systemctl restart ocserv,最后按第三章方法实测连接验证。
七、常见问题
Q1:改了配置不生效?
先确认改的是 /etc/ocserv/ocserv.conf(systemd 单元固定引用该路径),再确认生效方式:认证/端口/证书类必须 systemctl restart ocserv,其余可用 occtl reload(返回 Server scheduled to reload)。最终用 ss -ltnp | grep ocserv、客户端重连协商头或 occtl show status 实测确认,不要只凭 reload 返回成功判断。
Q2:服务起不来,日志报 you cannot mix multiple password authentication methods?
auth 与 enable-auth 写了同类的口令认证方式(见 5.1.1 实测)。删除多余行,只保留一行 auth。
Q3:客户端报 SSL 连接失败:Error in the pull function.?
服务端日志出现 The futex facility returned an unexpected error code. 时是 worker seccomp 沙箱在该内核上起不来,改 isolate-workers = false 后重启(见 5.3.3 实测)。
Q4:启动日志有 error connecting to sec-mod socket '/run/ocserv.socket.xxxx': No such file or directory,正常吗? 实测中该行出现在每次启动早期,随后紧接 listening (TCP/UDP) 且服务正常、连接正常——是主进程与 sec-mod 初始化顺序导致的瞬时报错,可忽略;以 ss 端口监听和客户端连通为准。
Q5:改了地址池后客户端拿到的还是旧网段?
地址池属于连接建立时下发的参数,需 systemctl restart ocserv 且客户端重连;先 occtl show users 确认旧会话已全部断开再验证。
Q6:封禁列表有 IP 但正确口令还能连上? 见 5.2 实测结论:1.1.3 版本计分封禁对「正确口价新连接」未观测到拦截效果,且分数按 ban-reset-time 周期整体归零。把 occtl 封禁作为观测手段,真正的暴力破解拦截叠加 fail2ban(监控 /var/log/syslog 中 ocserv 的认证失败行)。
Q7:想限制用户只能访问某几个网段? 全局用 route/no-route;按用户用 config-per-user(5.5.4),并在服务端启用 restrict-user-to-routes 强制(需 nftables 或 iptables,官方 README Runtime dependencies 明示)。
八、参考链接
- 默认配置文件(含全部参数官方注释):Ubuntu 22.04 ocserv 1.1.3-1 软件包
/etc/ocserv/ocserv.conf(本篇默认值出处) - ocserv 官方手册页:
man ocserv(/usr/share/man/man8/ocserv.8.gz) - ocserv 官方配置配方仓库:https://gitlab.com/openconnect/recipes
- ocserv 官方仓库与 README:https://gitlab.com/openconnect/ocserv(2026-10-20 查询)
- 上游最新版发布记录:https://gitlab.com/openconnect/ocserv/-/releases.atom(2026-10-20 查询,最新稳定版 1.6.0)
- 站内同系列:《Ubuntu 22.04 安装 OpenConnect 指南》《OpenConnect 常用 CLI 命令详解》