Sign inSign up

benyoo/ocserv

By benyoo

•Updated 6 months ago

ocserv run in docker

Image
0

972

benyoo/ocserv repository overview

⁠Docker OpenConnect

Lightweight ocserv container image for OpenConnect / AnyConnect compatible VPN deployments.

⁠Features

  • Based on CentOS Stream 9
  • ocserv server with supervisord process management
  • Auto-generated runtime config from environment variables
  • Built-in healthcheck
  • Built-in file watcher and config reload flow
  • Optional Telegram notifications
  • Optional Google Authenticator support
  • Optional server-side ACL sync support
  • Persistent data layout for certificates, users, logs, and runtime state

⁠Requirements

  • Docker Engine or Docker Compose v2
  • /dev/net/tun available on host
  • Container started with NET_ADMIN
  • TCP/UDP port 443 exposed

⁠Quick Start

Create host directories:

mkdir -p /data/ocserv/etc /data/ocserv/{users,certs,logs,state} /data/ocserv/run

Run the container:

docker run -d \
  --name ocserv_server \
  --restart unless-stopped \
  --cap-add NET_ADMIN \
  --device /dev/net/tun:/dev/net/tun \
  -p 443:443/tcp \
  -p 443:443/udp \
  -e TZ=Asia/Shanghai \
  -e OC_AUTH_MODE=plain \
  -e OC_PASSWD_FILE=/data/ocserv/users/ocpasswd \
  -e OC_IPV4_NETWORK=10.20.30.0 \
  -e OC_IPV4_NETMASK=255.255.255.0 \
  -e OC_DNS=1.1.1.1,9.9.9.9 \
  -v /data/ocserv/etc:/etc/ocserv \
  -v /data/ocserv:/data/ocserv \
  -v /data/ocserv/run:/run/ocserv \
  benyoo/ocserv:9-stream-1.4.1-1-20260408

⁠Docker Compose Example

services:
  ocserv:
    image: benyoo/ocserv:9-stream-1.4.1-1-20260408
    container_name: ocserv_server
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun:/dev/net/tun
    ports:
      - "443:443/tcp"
      - "443:443/udp"
    environment:
      TZ: Asia/Shanghai
      OC_AUTH_MODE: plain
      OC_PASSWD_FILE: /data/ocserv/users/ocpasswd
      OC_IPV4_NETWORK: 10.20.30.0
      OC_IPV4_NETMASK: 255.255.255.0
      OC_DNS: 1.1.1.1,9.9.9.9
    volumes:
      - /data/ocserv/etc:/etc/ocserv
      - /data/ocserv:/data/ocserv
      - /data/ocserv/run:/run/ocserv

⁠Persistent Paths

  • /etc/ocserv
  • /data/ocserv
  • /run/ocserv

Recommended subdirectories under /data/ocserv:

  • users
  • certs
  • logs
  • state

⁠Certificates

Expected certificate paths:

  • /data/ocserv/certs/server-cert.pem
  • /data/ocserv/certs/server-key.pem

Optional:

  • /data/ocserv/certs/ca.pem
  • /data/ocserv/certs/crl.pem

If no certificate is provided and OC_AUTO_GEN_CERT=true, the container can generate a self-signed certificate on first start.

⁠Common Environment Variables

  • OC_AUTH_MODE
  • OC_PASSWD_FILE
  • OC_TCP_PORT
  • OC_UDP_PORT
  • OC_IPV4_NETWORK
  • OC_IPV4_NETMASK
  • OC_DNS
  • OC_SERVER_CERT
  • OC_SERVER_KEY
  • OC_CA_CERT
  • OC_CRL_FILE
  • OC_TELEGRAM_ENABLE
  • OC_ACL_ENABLE

⁠Healthcheck

The image includes a built-in healthcheck script:

/app/scripts/healthcheck.sh

⁠Check Online Sessions

docker exec -it ocserv_server occtl-show-users
docker exec -it ocserv_server occtl-show-users --json

⁠Image Version Labels

The image can include detected ocserv RPM metadata in labels:

  • org.opencontainers.image.version
  • io.benyoo.ocserv.rpm-package
  • io.benyoo.ocserv.rpm-version
  • io.benyoo.ocserv.rpm-release
  • io.benyoo.ocserv.rpm-version-short

Inspect them with:

docker image inspect benyoo/ocserv:latest --format '{{ json .Config.Labels }}'

⁠变量作用对照表

变量默认值用途影响位置常见覆盖场景
TZAsia/Shanghai容器时区容器环境、日志时间服务器不在中国时区
OCSERV_BUILD_CONTEXThttps://git.dwhd.org/lookback/Docker-OpenConnect.git#mainCompose 构建上下文compose.ocserv.yml 的 build.context私有仓库认证、切到本地源码、切换分支
OCSERV_BUILD_DOCKERFILEDockerfileCompose 构建使用的 Dockerfilebuild.dockerfile使用其他 Dockerfile 变体
OC_DEBUG0ocserv 日志级别ocserv.conf 的 log-level排查认证、证书、路由问题
OC_TCP_PORT443TCP 监听端口Compose 端口映射、ocserv.conf tcp-port宿主机 443 被占用时改成 8443
OC_UDP_PORT443UDP 监听端口Compose 端口映射、ocserv.conf udp-port与 TCP 一起改端口
OC_DEVICEvpnsTUN 设备名称ocserv.conf device避免和现有虚拟网卡命名冲突
OC_IPV4_NETWORK10.20.30.0VPN 地址池网段ocserv.conf ipv4-network改成你的内网规划
OC_IPV4_NETMASK255.255.255.0VPN 地址池掩码ocserv.conf ipv4-netmask地址池变更时一起调整
OC_DNS1.1.1.1,8.8.8.8下发给客户端的 DNSocserv.conf dns =换成公司内网 DNS
OC_TUNNEL_MODEsplit全隧道或分流模式render-config.sh 路由渲染逻辑想让所有流量走 VPN 时改 full
OC_ROUTES空分流模式下推送路由ocserv.conf route =split 模式下配置办公网段
OC_NO_ROUTES空客户端排除路由ocserv.conf no-route =避免某些网段走 VPN
OC_MTU1420VPN MTUocserv.conf mtu某些网络环境需要降 MTU
OC_EGRESS_MASQUERADEfalse在容器内为 VPN 地址池开启出口 NATentrypoint.sh 里的独立 nft NAT 表访问公网分流目标时补容器内 SNAT
OC_EGRESS_INTERFACEeth0容器内出口网卡名容器内 nft NAT 规则Docker 默认网络下通常保持 eth0
OC_EGRESS_MASQUERADE_IPV4_CIDR空容器内出口 NAT 的源 CIDR容器内 nft NAT 规则不想自动从 OC_IPV4_NETWORK/NETMASK 推导时显式指定
OC_EGRESS_NAT_TABLEocserv_egress_nat容器内出口 NAT 使用的表名容器内 nftables避免和已有规则表冲突
OC_AUTH_MODEplain认证方式render-config.sh 认证配置在 plain 和 pam_google_totp 之间切换
OC_PASSWD_FILE/data/ocserv/users/ocpasswd用户密码文件路径ocserv.conf、/etc/ocserv/ocpasswd 软链想把密码文件放到其他卷
OC_PAM_SERVICEocservPAM service 名称auth = "pam"、/etc/pam.d/<service>接入自定义 PAM 栈
OC_PAM_HOME_ROOT/data/ocserv/pam/homePAM 用户 home 根目录manage-pam-user把本地 PAM 用户 home 放到持久卷
OC_PAM_GA_SECRET_DIR/data/ocserv/pam/google-authenticatorGoogle Authenticator 种子目录/etc/pam.d/ocserv、enroll-google-totp修改 TOTP 种子存储位置
OC_PAM_GA_ISSUEROpenConnectTOTP 发行方标识enroll-google-totp在 Google Authenticator 里展示自定义 issuer
OC_PAM_GA_REPORT_MODEnoneTOTP 绑定报告落盘模式enroll-google-totpnone 不落盘;masked 只写脱敏元数据;full 明文写入,不建议
OC_PAM_GA_ALLOW_UNENROLLEDfalse是否允许未绑定 TOTP 的 PAM 用户直接登录/etc/pam.d/ocserv灰度上线 TOTP 时临时放开
OC_PAM_GA_PROMPT_MODEchallengeTOTP 输入交互模式/etc/pam.d/ocservchallenge 走二次 challenge;append 适配只有一个密码框的客户端
OC_DEFAULT_GROUPdefault默认组配置名ocserv.conf default-group-config使用自定义组配置
OC_SELECT_GROUPS空登录时可选择的组列表ocserv.conf select-group =启用单用户多组选择
OC_DEFAULT_SELECT_GROUP空登录界面的默认组ocserv.conf default-select-group给多组用户提供默认组
OC_AUTO_SELECT_GROUPfalse自动扫描可选组ocserv.conf auto-select-group不想手写组清单时启用
OC_AUTO_SELECT_GROUP_EXCLUDE空自动扫描可选组时排除的组列表render-config.sh 生成 select-group =继续自动扫描,但隐藏 Route、All 等不想暴露的组
OC_SELECT_GROUP_BY_URLfalse允许通过 URL 直接指定组ocserv.conf select-group-by-url用不同入口 URL 对应不同组
OC_ENABLE_CERT_AUTHfalse是否启用证书认证ocserv.conf enable-auth开启双因子或证书登录
OC_AUTO_GEN_CERTtrue缺证书时自动生成自签证书entrypoint.sh 证书初始化逻辑首次部署不想手工准备证书
OC_CERT_CN空自动生成证书时的 CN自动生成证书主题强制使用域名或指定 IP 作为证书主名
OC_CERT_DAYS365自动生成证书有效期自动生成证书调整测试证书有效期
OC_CERT_COUNTRY空自动证书主题国家自动生成证书设置证书主题字段
OC_CERT_STATE空自动证书主题省份自动生成证书设置证书主题字段
OC_CERT_LOCALITY空自动证书主题城市自动生成证书设置证书主题字段
OC_CERT_ORG空自动证书主题组织自动生成证书设置证书主题字段
OC_CERT_OU空自动证书主题部门自动生成证书设置证书主题字段
OC_CERT_AUTO_HOSTNAMEtrue自动把当前 hostname 写入 SAN自动生成证书不想暴露 hostname 时关闭
OC_CERT_AUTO_PUBLIC_IPStrue自动探测公网 IPv4/IPv6 写入 SAN自动生成证书纯域名访问时关闭
OC_CERT_EXTRA_DNS空额外写入证书的 DNS SAN 列表自动生成证书增加域名别名
OC_CERT_EXTRA_IPS空额外写入证书的 IP SAN 列表自动生成证书显式加入私网 IP 或固定公网 IP
OC_PUBLIC_IPV4_URLhttps://api.ipify.org公网 IPv4 探测接口自动生成证书使用自建或内网可访问的探测服务
OC_PUBLIC_IPV6_URLhttps://api64.ipify.org公网 IPv6 探测接口自动生成证书使用自建或内网可访问的探测服务
OC_SERVER_CERT/data/ocserv/certs/server-cert.pem服务端证书路径ocserv.conf、启动证书校验换正式证书或自定义挂载目录
OC_SERVER_KEY/data/ocserv/certs/server-key.pem服务端私钥路径ocserv.conf、启动证书校验与证书路径一起调整
OC_CA_CERT/data/ocserv/certs/ca.pemCA 证书路径ocserv.conf ca-cert使用私有 CA 或客户端证书认证
OC_CRL_FILE/data/ocserv/certs/crl.pemCRL 吊销列表路径ocserv.conf crl启用证书吊销控制
OC_TLS_PRIORITIES空自定义 TLS 优先级ocserv.conf tls-priorities兼容特殊客户端或收紧 TLS
OC_MAX_CLIENTS128最大在线客户端数ocserv.conf max-clients控制总连接规模
OC_MAX_SAME_CLIENTS2单用户最大并发ocserv.conf max-same-clients限制账号共享
OC_KEEPALIVE30keepalive 周期,单位:秒ocserv.conf keepalive优化 NAT 保活行为
OC_DPD90死连接探测周期,单位:秒ocserv.conf dpd弱网环境优化
OC_MOBILE_DPD1800移动端 DPD 周期,单位:秒ocserv.conf mobile-dpd移动客户端省电优化
OC_SESSION_TIMEOUT0会话超时,单位:秒ocserv.conf session-timeout需要定时踢下线时设置
OC_IDLE_TIMEOUT0空闲超时,单位:秒ocserv.conf idle-timeout限制长时间空闲连接
OC_SOCKET_FILE/run/ocserv/occtl.socketocctl 控制 socketocserv.conf、健康检查自定义控制面 socket 路径
OC_PID_FILE/run/ocserv/ocserv.pid进程 PID 文件ocserv.conf少数运维脚本会用到
OC_RESET_STATEnone启动前清理挂载数据entrypoint.sh 启动初始化重建时清空用户、路由、证书或全部状态
OC_LOG_TO_FILEtrue是否把容器运行日志同步写入文件entrypoint.sh、/data/ocserv/logs/ocserv.log需要宿主机直接看日志或保留日志文件
OC_SERVER_LOG_FILE/data/ocserv/logs/ocserv.logocserv 运行日志文件路径宿主机挂载日志目录想把日志放到其他卷
OC_MONITOR_ENABLEfalse启用登录/登出监控session-monitor.sh需要审计会话变化
OC_MONITOR_INTERVAL10会话监控轮询秒数session-monitor.sh调整监控灵敏度
OC_MONITOR_STATE_DIR/data/ocserv/state/session-monitor会话监控状态目录session-monitor.sh自定义状态缓存位置
OC_MONITOR_LOG_FILE/data/ocserv/logs/session-monitor.log登录/登出审计日志路径宿主机挂载日志目录审计日志单独落盘
OC_MONITOR_HOST_LABEL空监控消息中的节点标识session-monitor.sh多节点部署时标明来源主机
OC_TELEGRAM_ENABLEfalse启用 Telegram 推送session-monitor.sh登录/登出实时通知
OC_TELEGRAM_BOT_TOKEN空Telegram Bot TokenTelegram API配合通知使用
OC_TELEGRAM_CHAT_ID空Telegram 群组或用户 IDTelegram API指定消息接收目标
OC_TELEGRAM_QUEUE_ENABLEtrueTelegram 发送失败时写入本地补发队列telegram-send.sh建议保持开启,降低延迟/丢消息风险
OC_TELEGRAM_QUEUE_DIR/data/ocserv/state/telegram-queueTelegram 本地待补发队列目录telegram-send.sh队列消息按文件落地
OC_TELEGRAM_RETRY_CRON*/1 * * * *Telegram 补发队列执行周期crond默认每分钟补发一次
OC_TELEGRAM_RETRY_INTERVAL_SECONDS5Telegram 常驻补发 worker 的轮询间隔(单位:秒)telegram-retry-worker.sh比分钟级 cron 更适合追求准时通知
OC_TELEGRAM_SEND_RETRIES4Telegram 单次发送的 curl 重试次数telegram-send.sh配合队列使用
OC_TELEGRAM_CONNECT_TIMEOUT_SECONDS5Telegram 连接超时(单位:秒)telegram-send.shAPI 或 DNS 慢时可调大
OC_TELEGRAM_MAX_TIME_SECONDS15Telegram 单次请求总超时(单位:秒)telegram-send.sh防止发送线程长时间卡住
OC_TELEGRAM_DRAIN_BATCH50每轮队列补发的最大消息数telegram-send.sh避免积压时单次补发过猛
OC_TELEGRAM_LOG_FILE/data/ocserv/logs/telegram-delivery.logTelegram 发送/入队日志文件telegram-send.sh用于排查延迟和失败原因
OC_TELEGRAM_RETRY_LOG_FILE/data/ocserv/logs/telegram-retry.logTelegram 常驻补发 worker 日志文件telegram-retry-worker.sh排查启动初期或网络抖动时的补发行为
OC_PASSWORD_RESET_REPORT_MODEnone密码重置报告落盘模式reset-passwords-batch.shnone 只输出到终端;file 才写入报告文件
OC_PASSWORD_RESET_REPORT_RETENTION_DAYS3密码重置报告保留天数reset-passwords-batch.sh、启动清理逻辑仅在报告落盘时控制文件多久自动删除
OC_PASSWORD_RESET_REPORT_CLEANUP_CRON17 * * * *密码报告清理 cron 表达式crond 定时任务调整自动清理周期
OC_WATCH_ENABLEtrue启用配置/密码/证书变更监听inotifywait watcher宿主机改文件后自动 reload 或 restart
OC_WATCH_PATHS/etc/ocserv,/data/ocserv/certs,/data/ocserv/users监听目录列表ocserv-watch.sh扩展自动监听范围
OC_WATCH_LOG_FILE/data/ocserv/logs/ocserv-watch.log文件监听日志watcher 落盘排查自动 reload/restart 行为
OC_EVENT_ENABLEtrue启用 ocserv 原生 connect/disconnect/host-update 事件ocserv-event-hook.sh输出更完整的登录/登出通知和审计日志
OC_EVENT_LOG_FILE/data/ocserv/logs/session-events.log会话文本日志路径事件 worker便于人工查看登录/登出详情
OC_EVENT_JSON_LOG_FILE/data/ocserv/logs/session-events.jsonl会话 JSON 日志路径事件 worker便于后续采集或分析
OC_EVENT_STATE_DIR/data/ocserv/state/session-events会话状态缓存目录事件 worker保存登录时间、主机名等会话上下文
OC_ACL_ENABLEfalse启用服务端 ACL 强制控制nftables + 事件 worker防止客户端私自改本地路由绕过限制
OC_ACL_TABLEocserv_aclACL 使用的 nftables 表名ocserv-acl-sync.sh与现有宿主机规则隔离
OC_ACL_STATE_DIR/data/ocserv/state/session-acl会话 ACL 状态目录ACL 同步脚本保存在线会话的用户名、组、VPN IP
OC_ACL_LOG_FILE/data/ocserv/logs/acl-sync.logACL 同步日志路径ACL 同步脚本排查规则下发与会话撤销
OC_ACL_ENFORCE_INPUTtrue是否限制访问 VPN 服务器本机服务nftables input防止客户端越权访问宿主机服务
OC_ACL_ENFORCE_FORWARDtrue是否限制访问转发到内网的流量nftables forward防止客户端越权访问内网目标
OC_ACL_SYNC_LOCK_FILE/run/ocserv/ocserv-acl-sync.lockACL 同步互斥锁文件ocserv-acl-sync.sh防止并发重入导致重复同步
OC_ACL_SYNC_LAST_FILE/run/ocserv/ocserv-acl-sync.lastACL 最近一次成功同步时间戳文件ocserv-acl-sync.sh配合去抖逻辑使用
OC_ACL_SYNC_MIN_INTERVAL_SECONDS2ACL 同步最小间隔(单位:秒)ocserv-acl-sync.sh抑制 connect/host-update/watch 短时间重复触发
OC_SERVER_DISPLAY_IP空通知里显示的服务器 IP事件 worker固定展示公网 IP 或域名
OC_TELEGRAM_TEST_MODEfalseTelegram 测试模式Telegram 发送逻辑给测试消息打单独标记,避免误判为正式告警
OC_TELEGRAM_TEST_LABEL[TEST MODE]Telegram 测试模式前缀Telegram 发送逻辑自定义测试消息标记
OC_IP_GEO_ENABLEtrue启用客户端源 IP 归属查询事件 worker在通知和日志里附加归属信息
OC_IP_GEO_PROVIDER_URLhttps://ipwho.is/{ip}IP 归属查询接口模板事件 worker切到你自己的归属服务
OC_IP_GEO_TIMEOUT_SECONDS5IP 归属查询超时秒数事件 worker限制外部接口等待时间
OC_LOG_ROTATE_ENABLEtrue启用日志轮转rotate-ocserv-logs.sh自动压缩归档历史日志
OC_LOG_ROTATE_CRON13 * * * *日志轮转 cron 表达式crond 定时任务调整轮转检查频率
OC_LOG_RETENTION_DAYS30历史压缩日志保留天数日志轮转脚本控制压缩归档保存多久
OC_LOG_ROTATE_MAX_SIZE_MB20单个日志文件轮转阈值日志轮转脚本日志过大时提前切割
OC_LOG_ROTATE_DIR/data/ocserv/logs当前日志目录日志轮转脚本自定义轮转目录
OC_LOG_ARCHIVE_DIR/data/ocserv/logs/archive历史压缩日志目录日志轮转脚本单独存放 .gz 历史包

⁠Notes

  • This image is intended for Linux hosts with TUN support.
  • ocserv control socket discovery is handled automatically.
  • For full deployment, advanced ACL, Telegram, PAM, and build instructions, use the repository README.

Tag summary

Content type

Image

Digest

Size

13.4 MB

Last updated

about 9 years ago

docker pull benyoo/ocserv