OpenConnect 配置参数详解

ocserv.conf 逐参数实测详解:默认配置 47 行生效参数全量核对,认证/计分封禁/监听进程/并发超时/地址路由五大类逐项验证改动效果(端口、max-same-clients、dpd 热重载、封禁计分、地址池),ocserv -t 校验与 reload 实测,含 50 人生产模板与 FAQ,实测日期 2026-10-20。

OpenConnectOpenConnectVPN网络配置Ubuntu2026/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。

参数默认含义
auth-timeout240客户端完成整个认证流程的最长秒数,超时断开未认证连接
cookie-timeout300认证成功后下发的 cookie 在未使用时的有效期;连接期间与断线后该时间内可用 cookie 重连
min-reauth-time300客户端两次重新认证之间的最小间隔秒数

实测关联:封禁列表的「封禁时长」按 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

参数默认含义
keepalive300保活包间隔秒数,维持 NAT 映射(实测协商头 X-CSTP-Keepalive: 300)
dpd60死链检测间隔秒数,无响应即断开(移动网络可调大减少耗电)
mobile-dpd300移动客户端(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-timeout25UDP/DTLS 不通多少秒后回落 TLS/TCP
idle-timeout1200桌面客户端空闲断开秒数(0 不限制;实测协商头 X-CSTP-Idle-Timeout: 1200)
mobile-idle-timeout1800移动客户端空闲断开秒数
rekey-time172800会话密钥重协商周期秒数(48h;实测协商头 X-CSTP-Rekey-Time: 172806,值随会话起算点略有偏移)
rekey-methodssl重协商方式: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-leasesfalse是否对租约地址做 ICMP 探测判活
try-mtu-discoveryfalse路径 MTU 探测;实测默认关闭时协商出 X-CSTP-Base-MTU: 1500、X-CSTP-MTU: 1434(1500 减去 TLS/DTLS 开销)
compressiontrue启用压缩,实测协商结果为 X-CSTP-Content-Encoding: oc-lz4、X-DTLS-Content-Encoding: oc-lz4,客户端显示「DTLS 连接压缩正使用 LZ4」
no-compress-limit256小于该字节数的包不压缩(小包压缩得不偿失)

💡 技术拓展: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-compattrue兼容思科 AnyConnect 官方客户端(保持开启除非只用 openconnect)
dtls-legacytrue支持旧式 DTLS 协商(Cisco DTLSv1.0 兼容)
cert-user-oid0.9.2342.19200300.100.1.1certificate 认证时从证书哪个 OID 提取用户名(默认 UID OID)
default-domainexample.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 明示)。

八、参考链接