Контейнер OCServ VPN сервера на базе Alpine Linux с полной поддержкой настройки через переменные окружения.
- 🔧 Минимальная конфигурация - Статический конфиг и secrets
- 🔒 Безопасное хранение секретов - Сертификаты и файл паролей только как Docker secrets
- 🐧 Alpine Linux - Минимальный размер образа
- 📦 Компиляция из исходников - OCServ собирается из master ветки GitLab
- 🔗 Поддержка AnyConnect - Совместимость с Cisco AnyConnect клиентами
- 🌐 Гибкая настройка сети - Настройка IP диапазонов, DNS, маршрутизации
- Клонируйте проект:
git clone https://github.com/Danzercroft/ocserv-docker.git
cd ocserv-docker- Подготовьте SSL сертификаты:
# Поместите ваши сертификаты в директорию certs/
cp your-server.crt certs/server.crt
cp your-server.key certs/server.key
cp your-ca.crt certs/ca.crt
# Или создайте тестовые самоподписанные сертификаты
cd certs && openssl genrsa -out server.key 3072
openssl req -new -key server.key -out server.csr -subj "/CN=vpn.example.com"
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
cp server.crt ca.crt && rm server.csr && cd ..- Настройте переменные окружения:
cp .env.example .env
# Отредактируйте .env файл под ваши нужды- Запустите контейнер:
docker-compose up -dПроект использует Docker Compose configs и secrets для безопасного управления конфигурационными файлами и секретными данными:
- ocserv_config: Конфигурационный файл OCServ (
./config/ocserv.conf)- Монтируется в контейнер как
/etc/ocserv/ocserv.conf - Права доступа: 0644
- Содержит статическую конфигурацию с разумными значениями по умолчанию
- Монтируется в контейнер как
-
ocserv_passwd: Файл паролей пользователей (
./config/passwd)- В контейнере как secret:
/run/secrets/ocserv_passwd - Права доступа: 0600
- В контейнере как secret:
-
server_cert: SSL сертификат сервера (
./certs/server.crt)- Secret:
/run/secrets/server_cert - Права доступа: 0644
- Secret:
-
server_key: Приватный ключ сервера (
./certs/server.key)- Secret:
/run/secrets/server_key - Права доступа: 0600
- Secret:
-
ca_cert: CA сертификат (
./certs/ca.crt)- Secret:
/run/secrets/ca_cert - Права доступа: 0644
- Secret:
- Безопасность: Секретные данные не копируются в образ Docker
- Простота: Конфигурация использует разумные значения по умолчанию
- Гибкость: Основные параметры настраиваются через переменные окружения
- Изоляция: Configs и secrets обрабатываются в соответствии с их назначением
- Права доступа: Автоматическая установка корректных прав для файлов
В режиме Swarm secrets автоматически доступны в каталоге /run/secrets/* с именами, совпадающими с названием секрета:
| Secret | Путь в контейнере | Использование |
|---|---|---|
ocserv_passwd |
/run/secrets/ocserv_passwd |
Файл пользователей (auth) |
server_cert |
/run/secrets/server_cert |
Сертификат сервера |
server_key |
/run/secrets/server_key |
Приватный ключ |
ca_cert |
/run/secrets/ca_cert |
CA сертификат |
Файл ocserv.conf обновлен для использования этих путей.
Базовая конфигурация статична. Доступны следующие переменные:
| Переменная | По умолчанию | Описание |
|---|---|---|
ENABLE_METRICS |
true |
Включить/отключить экспорт метрик |
METRICS_PORT |
8000 |
Порт экспортера |
METRICS_INTERVAL |
30 |
Интервал опроса ocserv (сек) |
| Переменная | По умолчанию | Описание |
|---|---|---|
SERVER_CERT_PATH |
/run/secrets/server_cert |
Путь к сертификату сервера |
SERVER_KEY_PATH |
/run/secrets/server_key |
Путь к приватному ключу |
PASSWD_PATH |
/run/secrets/ocserv_passwd |
Путь к файлу паролей |
Переменная ENABLE_LOGS удалена. Используйте стандартный вывод контейнера и системы логирования Docker.
Следующие параметры настроены в статическом конфигурационном файле и не требуют переменных окружения:
- Клиенты: max-clients = 128, max-same-clients = 10
- Сессии: keepalive = 30, dpd = 60, mobile-dpd = 300
- Аутентификация: auth-timeout = 240, cookie-timeout = 300
- Безопасность: ban-score = 80, ban-reset-time = 300, min-reauth-time = 300
- DNS: dns = 8.8.8.8, dns = 1.1.1.1, tunnel-all-dns = true
- IPv6: ipv6-network = fda9:4efe:7e3b:03ea::/48, ipv6-subnet-prefix = 64
- Прочее: compression = true, cisco-client-compat = true, log-level = 1
Пользователи задаются статически в файле config/passwd (монтируется как secret ocserv_passwd). Формат строк:
username:password_hash
Генерация хеша (SHA512, рекомендовано):
openssl passwd -6 "ваш_пароль"После изменения файла config/passwd пересоздайте secret (для Docker Swarm) и перезапустите сервис:
docker secret rm ocserv_passwd 2>/dev/null || true
docker secret create ocserv_passwd config/passwd
docker service update --force <service_name>Проект поддерживает экспорт метрик через встроенный ocserv-exporter.
# Просмотр всех логов
docker-compose logs -f ocserv
# Только логи доступа
docker-compose logs ocserv 2>&1 | grep '\[ACCESS\]'
# Только ошибки
docker-compose logs ocserv 2>&1 | grep '\[ERROR\]'
# Состояние контейнера
docker-compose psДоступ к метрикам:
# Просмотр метрик
curl http://localhost:8000/metrics
# Проверка статуса экспортера
docker-compose exec ocserv pgrep ocserv-exporterДополнительные функции мониторинга доступны напрямую через occtl внутри контейнера.
docker-compose build
docker-compose up -d# Просмотр первых строк конфигурации
docker-compose exec ocserv head -n 50 /etc/ocserv/ocserv.conf
# Проверка наличия secrets
docker-compose exec ocserv ls -l /run/secrets | grep ocserv_Используется ocserv-exporter от Criteo.
- Эндпоинт:
http://localhost:8000/metrics - VPN метрики: активные сессии, аутентификация, трафик
- Go runtime: память, GC, goroutines
vpn_active_sessions - Текущие подключения
vpn_authentication_failures - Ошибки аутентификации
vpn_rx_bytes / vpn_tx_bytes - Объем трафика
vpn_start_time_seconds - Время запуска сервера
# Прямой запрос метрик
curl http://localhost:8000/metrics
# Через Docker
docker exec ocserv-docker wget -q -O - http://localhost:8000/metrics# Просмотр логов контейнера
docker logs ocserv-docker -f
# Системные логи OCServ
docker exec ocserv-docker tail -f /var/log/messages | grep ocservscrape_configs:
- job_name: 'ocserv'
static_configs:
- targets: ['ocserv-host:8000']
scrape_interval: 30sУбедитесь, что контейнер запущен в привилегированном режиме:
privileged: trueУдалите существующие сертификаты для перегенерации:
docker-compose exec ocserv rm -f /etc/ocserv/certs/*
docker-compose restart ocservПроверьте настройки iptables на хосте и убедитесь, что IP forwarding включен.
- Используйте сильные пароли для пользователей
- Регулярно обновляйте образ контейнера
- Мониторьте логи на предмет подозрительной активности
- Рассмотрите использование внешнего RADIUS сервера для аутентификации
Этот проект использует OCServ под лицензией GPL v2.