Lightweight ocserv container image for OpenConnect / AnyConnect compatible VPN deployments.
ocserv server with supervisord process management/dev/net/tun available on hostNET_ADMIN443 exposedCreate 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
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
/etc/ocserv/data/ocserv/run/ocservRecommended subdirectories under /data/ocserv:
userscertslogsstateExpected certificate paths:
/data/ocserv/certs/server-cert.pem/data/ocserv/certs/server-key.pemOptional:
/data/ocserv/certs/ca.pem/data/ocserv/certs/crl.pemIf no certificate is provided and OC_AUTO_GEN_CERT=true, the container can generate a self-signed certificate on first start.
OC_AUTH_MODEOC_PASSWD_FILEOC_TCP_PORTOC_UDP_PORTOC_IPV4_NETWORKOC_IPV4_NETMASKOC_DNSOC_SERVER_CERTOC_SERVER_KEYOC_CA_CERTOC_CRL_FILEOC_TELEGRAM_ENABLEOC_ACL_ENABLEThe image includes a built-in healthcheck script:
/app/scripts/healthcheck.sh
docker exec -it ocserv_server occtl-show-users
docker exec -it ocserv_server occtl-show-users --json
The image can include detected ocserv RPM metadata in labels:
org.opencontainers.image.versionio.benyoo.ocserv.rpm-packageio.benyoo.ocserv.rpm-versionio.benyoo.ocserv.rpm-releaseio.benyoo.ocserv.rpm-version-shortInspect them with:
docker image inspect benyoo/ocserv:latest --format '{{ json .Config.Labels }}'
| 变量 | 默认值 | 用途 | 影响位置 | 常见覆盖场景 |
|---|---|---|---|---|
TZ | Asia/Shanghai | 容器时区 | 容器环境、日志时间 | 服务器不在中国时区 |
OCSERV_BUILD_CONTEXT | https://git.dwhd.org/lookback/Docker-OpenConnect.git#main | Compose 构建上下文 | compose.ocserv.yml 的 build.context | 私有仓库认证、切到本地源码、切换分支 |
OCSERV_BUILD_DOCKERFILE | Dockerfile | Compose 构建使用的 Dockerfile | build.dockerfile | 使用其他 Dockerfile 变体 |
OC_DEBUG | 0 | ocserv 日志级别 | ocserv.conf 的 log-level | 排查认证、证书、路由问题 |
OC_TCP_PORT | 443 | TCP 监听端口 | Compose 端口映射、ocserv.conf tcp-port | 宿主机 443 被占用时改成 8443 |
OC_UDP_PORT | 443 | UDP 监听端口 | Compose 端口映射、ocserv.conf udp-port | 与 TCP 一起改端口 |
OC_DEVICE | vpns | TUN 设备名称 | ocserv.conf device | 避免和现有虚拟网卡命名冲突 |
OC_IPV4_NETWORK | 10.20.30.0 | VPN 地址池网段 | ocserv.conf ipv4-network | 改成你的内网规划 |
OC_IPV4_NETMASK | 255.255.255.0 | VPN 地址池掩码 | ocserv.conf ipv4-netmask | 地址池变更时一起调整 |
OC_DNS | 1.1.1.1,8.8.8.8 | 下发给客户端的 DNS | ocserv.conf dns = | 换成公司内网 DNS |
OC_TUNNEL_MODE | split | 全隧道或分流模式 | render-config.sh 路由渲染逻辑 | 想让所有流量走 VPN 时改 full |
OC_ROUTES | 空 | 分流模式下推送路由 | ocserv.conf route = | split 模式下配置办公网段 |
OC_NO_ROUTES | 空 | 客户端排除路由 | ocserv.conf no-route = | 避免某些网段走 VPN |
OC_MTU | 1420 | VPN MTU | ocserv.conf mtu | 某些网络环境需要降 MTU |
OC_EGRESS_MASQUERADE | false | 在容器内为 VPN 地址池开启出口 NAT | entrypoint.sh 里的独立 nft NAT 表 | 访问公网分流目标时补容器内 SNAT |
OC_EGRESS_INTERFACE | eth0 | 容器内出口网卡名 | 容器内 nft NAT 规则 | Docker 默认网络下通常保持 eth0 |
OC_EGRESS_MASQUERADE_IPV4_CIDR | 空 | 容器内出口 NAT 的源 CIDR | 容器内 nft NAT 规则 | 不想自动从 OC_IPV4_NETWORK/NETMASK 推导时显式指定 |
OC_EGRESS_NAT_TABLE | ocserv_egress_nat | 容器内出口 NAT 使用的表名 | 容器内 nftables | 避免和已有规则表冲突 |
OC_AUTH_MODE | plain | 认证方式 | render-config.sh 认证配置 | 在 plain 和 pam_google_totp 之间切换 |
OC_PASSWD_FILE | /data/ocserv/users/ocpasswd | 用户密码文件路径 | ocserv.conf、/etc/ocserv/ocpasswd 软链 | 想把密码文件放到其他卷 |
OC_PAM_SERVICE | ocserv | PAM service 名称 | auth = "pam"、/etc/pam.d/<service> | 接入自定义 PAM 栈 |
OC_PAM_HOME_ROOT | /data/ocserv/pam/home | PAM 用户 home 根目录 | manage-pam-user | 把本地 PAM 用户 home 放到持久卷 |
OC_PAM_GA_SECRET_DIR | /data/ocserv/pam/google-authenticator | Google Authenticator 种子目录 | /etc/pam.d/ocserv、enroll-google-totp | 修改 TOTP 种子存储位置 |
OC_PAM_GA_ISSUER | OpenConnect | TOTP 发行方标识 | enroll-google-totp | 在 Google Authenticator 里展示自定义 issuer |
OC_PAM_GA_REPORT_MODE | none | TOTP 绑定报告落盘模式 | enroll-google-totp | none 不落盘;masked 只写脱敏元数据;full 明文写入,不建议 |
OC_PAM_GA_ALLOW_UNENROLLED | false | 是否允许未绑定 TOTP 的 PAM 用户直接登录 | /etc/pam.d/ocserv | 灰度上线 TOTP 时临时放开 |
OC_PAM_GA_PROMPT_MODE | challenge | TOTP 输入交互模式 | /etc/pam.d/ocserv | challenge 走二次 challenge;append 适配只有一个密码框的客户端 |
OC_DEFAULT_GROUP | default | 默认组配置名 | ocserv.conf default-group-config | 使用自定义组配置 |
OC_SELECT_GROUPS | 空 | 登录时可选择的组列表 | ocserv.conf select-group = | 启用单用户多组选择 |
OC_DEFAULT_SELECT_GROUP | 空 | 登录界面的默认组 | ocserv.conf default-select-group | 给多组用户提供默认组 |
OC_AUTO_SELECT_GROUP | false | 自动扫描可选组 | ocserv.conf auto-select-group | 不想手写组清单时启用 |
OC_AUTO_SELECT_GROUP_EXCLUDE | 空 | 自动扫描可选组时排除的组列表 | render-config.sh 生成 select-group = | 继续自动扫描,但隐藏 Route、All 等不想暴露的组 |
OC_SELECT_GROUP_BY_URL | false | 允许通过 URL 直接指定组 | ocserv.conf select-group-by-url | 用不同入口 URL 对应不同组 |
OC_ENABLE_CERT_AUTH | false | 是否启用证书认证 | ocserv.conf enable-auth | 开启双因子或证书登录 |
OC_AUTO_GEN_CERT | true | 缺证书时自动生成自签证书 | entrypoint.sh 证书初始化逻辑 | 首次部署不想手工准备证书 |
OC_CERT_CN | 空 | 自动生成证书时的 CN | 自动生成证书主题 | 强制使用域名或指定 IP 作为证书主名 |
OC_CERT_DAYS | 365 | 自动生成证书有效期 | 自动生成证书 | 调整测试证书有效期 |
OC_CERT_COUNTRY | 空 | 自动证书主题国家 | 自动生成证书 | 设置证书主题字段 |
OC_CERT_STATE | 空 | 自动证书主题省份 | 自动生成证书 | 设置证书主题字段 |
OC_CERT_LOCALITY | 空 | 自动证书主题城市 | 自动生成证书 | 设置证书主题字段 |
OC_CERT_ORG | 空 | 自动证书主题组织 | 自动生成证书 | 设置证书主题字段 |
OC_CERT_OU | 空 | 自动证书主题部门 | 自动生成证书 | 设置证书主题字段 |
OC_CERT_AUTO_HOSTNAME | true | 自动把当前 hostname 写入 SAN | 自动生成证书 | 不想暴露 hostname 时关闭 |
OC_CERT_AUTO_PUBLIC_IPS | true | 自动探测公网 IPv4/IPv6 写入 SAN | 自动生成证书 | 纯域名访问时关闭 |
OC_CERT_EXTRA_DNS | 空 | 额外写入证书的 DNS SAN 列表 | 自动生成证书 | 增加域名别名 |
OC_CERT_EXTRA_IPS | 空 | 额外写入证书的 IP SAN 列表 | 自动生成证书 | 显式加入私网 IP 或固定公网 IP |
OC_PUBLIC_IPV4_URL | https://api.ipify.org | 公网 IPv4 探测接口 | 自动生成证书 | 使用自建或内网可访问的探测服务 |
OC_PUBLIC_IPV6_URL | https://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.pem | CA 证书路径 | ocserv.conf ca-cert | 使用私有 CA 或客户端证书认证 |
OC_CRL_FILE | /data/ocserv/certs/crl.pem | CRL 吊销列表路径 | ocserv.conf crl | 启用证书吊销控制 |
OC_TLS_PRIORITIES | 空 | 自定义 TLS 优先级 | ocserv.conf tls-priorities | 兼容特殊客户端或收紧 TLS |
OC_MAX_CLIENTS | 128 | 最大在线客户端数 | ocserv.conf max-clients | 控制总连接规模 |
OC_MAX_SAME_CLIENTS | 2 | 单用户最大并发 | ocserv.conf max-same-clients | 限制账号共享 |
OC_KEEPALIVE | 30 | keepalive 周期,单位:秒 | ocserv.conf keepalive | 优化 NAT 保活行为 |
OC_DPD | 90 | 死连接探测周期,单位:秒 | ocserv.conf dpd | 弱网环境优化 |
OC_MOBILE_DPD | 1800 | 移动端 DPD 周期,单位:秒 | ocserv.conf mobile-dpd | 移动客户端省电优化 |
OC_SESSION_TIMEOUT | 0 | 会话超时,单位:秒 | ocserv.conf session-timeout | 需要定时踢下线时设置 |
OC_IDLE_TIMEOUT | 0 | 空闲超时,单位:秒 | ocserv.conf idle-timeout | 限制长时间空闲连接 |
OC_SOCKET_FILE | /run/ocserv/occtl.socket | occtl 控制 socket | ocserv.conf、健康检查 | 自定义控制面 socket 路径 |
OC_PID_FILE | /run/ocserv/ocserv.pid | 进程 PID 文件 | ocserv.conf | 少数运维脚本会用到 |
OC_RESET_STATE | none | 启动前清理挂载数据 | entrypoint.sh 启动初始化 | 重建时清空用户、路由、证书或全部状态 |
OC_LOG_TO_FILE | true | 是否把容器运行日志同步写入文件 | entrypoint.sh、/data/ocserv/logs/ocserv.log | 需要宿主机直接看日志或保留日志文件 |
OC_SERVER_LOG_FILE | /data/ocserv/logs/ocserv.log | ocserv 运行日志文件路径 | 宿主机挂载日志目录 | 想把日志放到其他卷 |
OC_MONITOR_ENABLE | false | 启用登录/登出监控 | session-monitor.sh | 需要审计会话变化 |
OC_MONITOR_INTERVAL | 10 | 会话监控轮询秒数 | 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_ENABLE | false | 启用 Telegram 推送 | session-monitor.sh | 登录/登出实时通知 |
OC_TELEGRAM_BOT_TOKEN | 空 | Telegram Bot Token | Telegram API | 配合通知使用 |
OC_TELEGRAM_CHAT_ID | 空 | Telegram 群组或用户 ID | Telegram API | 指定消息接收目标 |
OC_TELEGRAM_QUEUE_ENABLE | true | Telegram 发送失败时写入本地补发队列 | telegram-send.sh | 建议保持开启,降低延迟/丢消息风险 |
OC_TELEGRAM_QUEUE_DIR | /data/ocserv/state/telegram-queue | Telegram 本地待补发队列目录 | telegram-send.sh | 队列消息按文件落地 |
OC_TELEGRAM_RETRY_CRON | */1 * * * * | Telegram 补发队列执行周期 | crond | 默认每分钟补发一次 |
OC_TELEGRAM_RETRY_INTERVAL_SECONDS | 5 | Telegram 常驻补发 worker 的轮询间隔(单位:秒) | telegram-retry-worker.sh | 比分钟级 cron 更适合追求准时通知 |
OC_TELEGRAM_SEND_RETRIES | 4 | Telegram 单次发送的 curl 重试次数 | telegram-send.sh | 配合队列使用 |
OC_TELEGRAM_CONNECT_TIMEOUT_SECONDS | 5 | Telegram 连接超时(单位:秒) | telegram-send.sh | API 或 DNS 慢时可调大 |
OC_TELEGRAM_MAX_TIME_SECONDS | 15 | Telegram 单次请求总超时(单位:秒) | telegram-send.sh | 防止发送线程长时间卡住 |
OC_TELEGRAM_DRAIN_BATCH | 50 | 每轮队列补发的最大消息数 | telegram-send.sh | 避免积压时单次补发过猛 |
OC_TELEGRAM_LOG_FILE | /data/ocserv/logs/telegram-delivery.log | Telegram 发送/入队日志文件 | telegram-send.sh | 用于排查延迟和失败原因 |
OC_TELEGRAM_RETRY_LOG_FILE | /data/ocserv/logs/telegram-retry.log | Telegram 常驻补发 worker 日志文件 | telegram-retry-worker.sh | 排查启动初期或网络抖动时的补发行为 |
OC_PASSWORD_RESET_REPORT_MODE | none | 密码重置报告落盘模式 | reset-passwords-batch.sh | none 只输出到终端;file 才写入报告文件 |
OC_PASSWORD_RESET_REPORT_RETENTION_DAYS | 3 | 密码重置报告保留天数 | reset-passwords-batch.sh、启动清理逻辑 | 仅在报告落盘时控制文件多久自动删除 |
OC_PASSWORD_RESET_REPORT_CLEANUP_CRON | 17 * * * * | 密码报告清理 cron 表达式 | crond 定时任务 | 调整自动清理周期 |
OC_WATCH_ENABLE | true | 启用配置/密码/证书变更监听 | 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_ENABLE | true | 启用 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_ENABLE | false | 启用服务端 ACL 强制控制 | nftables + 事件 worker | 防止客户端私自改本地路由绕过限制 |
OC_ACL_TABLE | ocserv_acl | ACL 使用的 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.log | ACL 同步日志路径 | ACL 同步脚本 | 排查规则下发与会话撤销 |
OC_ACL_ENFORCE_INPUT | true | 是否限制访问 VPN 服务器本机服务 | nftables input | 防止客户端越权访问宿主机服务 |
OC_ACL_ENFORCE_FORWARD | true | 是否限制访问转发到内网的流量 | nftables forward | 防止客户端越权访问内网目标 |
OC_ACL_SYNC_LOCK_FILE | /run/ocserv/ocserv-acl-sync.lock | ACL 同步互斥锁文件 | ocserv-acl-sync.sh | 防止并发重入导致重复同步 |
OC_ACL_SYNC_LAST_FILE | /run/ocserv/ocserv-acl-sync.last | ACL 最近一次成功同步时间戳文件 | ocserv-acl-sync.sh | 配合去抖逻辑使用 |
OC_ACL_SYNC_MIN_INTERVAL_SECONDS | 2 | ACL 同步最小间隔(单位:秒) | ocserv-acl-sync.sh | 抑制 connect/host-update/watch 短时间重复触发 |
OC_SERVER_DISPLAY_IP | 空 | 通知里显示的服务器 IP | 事件 worker | 固定展示公网 IP 或域名 |
OC_TELEGRAM_TEST_MODE | false | Telegram 测试模式 | Telegram 发送逻辑 | 给测试消息打单独标记,避免误判为正式告警 |
OC_TELEGRAM_TEST_LABEL | [TEST MODE] | Telegram 测试模式前缀 | Telegram 发送逻辑 | 自定义测试消息标记 |
OC_IP_GEO_ENABLE | true | 启用客户端源 IP 归属查询 | 事件 worker | 在通知和日志里附加归属信息 |
OC_IP_GEO_PROVIDER_URL | https://ipwho.is/{ip} | IP 归属查询接口模板 | 事件 worker | 切到你自己的归属服务 |
OC_IP_GEO_TIMEOUT_SECONDS | 5 | IP 归属查询超时秒数 | 事件 worker | 限制外部接口等待时间 |
OC_LOG_ROTATE_ENABLE | true | 启用日志轮转 | rotate-ocserv-logs.sh | 自动压缩归档历史日志 |
OC_LOG_ROTATE_CRON | 13 * * * * | 日志轮转 cron 表达式 | crond 定时任务 | 调整轮转检查频率 |
OC_LOG_RETENTION_DAYS | 30 | 历史压缩日志保留天数 | 日志轮转脚本 | 控制压缩归档保存多久 |
OC_LOG_ROTATE_MAX_SIZE_MB | 20 | 单个日志文件轮转阈值 | 日志轮转脚本 | 日志过大时提前切割 |
OC_LOG_ROTATE_DIR | /data/ocserv/logs | 当前日志目录 | 日志轮转脚本 | 自定义轮转目录 |
OC_LOG_ARCHIVE_DIR | /data/ocserv/logs/archive | 历史压缩日志目录 | 日志轮转脚本 | 单独存放 .gz 历史包 |
ocserv control socket discovery is handled automatically.Content type
Image
Digest
Size
13.4 MB
Last updated
about 9 years ago
docker pull benyoo/ocserv