Предыстория

У вас конечно же нет VPN сервера ocserv, но возможно у какого-то абсолютно незнакомого человека он есть — с десятками, а может сотней пользователей. И этот незнакомый человек наверняка знает эту боль: каждый раз при добавлении нового клиента нужно вспоминать команды, лезть в документацию, не забыть обновить CRL, правильно экспортировать .p12. Когда этот гипотетический человек в очередной раз забыл флаг --legacy в openssl и получил нечитаемый файл сертификата — он вероятно захотел бы какое-нибудь автоматизированное решение.

Я написал набор bash скриптов для этого человека, чтобы автоматизировать рутину. Скрипт изначально создавался именно под связку ocserv + easy-rsa, поэтому глубоко интегрирован с её структурой PKI. Потом я решил привести код в порядок и выложить — вдруг найдутся ещё люди, которым он пригодится.

Что такое ocservice

Я смотрел существующие решения — нашёл несколько репозиториев на GitHub, но все они заброшены 2-4 года назад и работают только с логин/пароль авторизацией через ocpasswd. Сертификаты не поддерживает никто. Есть популярный проект с веб-интерфейсом, но это совсем другая история: Docker, отдельный порт, база данных, и всё равно только логин/пароль без easy-rsa. Если вам нужно просто управлять пользователями прямо на сервере без дополнительной инфраструктуры — это избыточно.

ocservice — это набор интерактивных bash скриптов для управления ocserv прямо из командной строки. Никакого Docker, никаких веб-серверов и баз данных — только bash и стандартные инструменты которые уже есть на сервере. Главная особенность — полная интеграция с easy-rsa: создание сертификатов, экспорт в .p12, отзыв и обновление CRL всё это делается в несколько нажатий.

Поддерживаются три режима авторизации:

  • cert — только сертификаты

  • plain — только логин/пароль

  • both — оба метода одновременно

Возможности

Главное меню

ocservice — главный скрипт с меню. При каждом открытии меню отображается актуальный статус сервера: аптайм, активные сессии, трафик RX/TX, ошибки авторизации, забаненные IP. Удобно — зашёл в меню и сразу видишь что происходит на сервере, не нужно отдельно запускать occtl show status.

Главное меню
Главное меню

Создание пользователей с сертификатами

Скрипт gen-client спрашивает имя пользователя, срок действия сертификата и лимит одновременных подключений. Затем генерирует клиентский сертификат через easy-rsa, экспортирует его в .p12 файл с паролем и записывает результат в лог.

Шаблон выдачи данных созданного пользователя
Шаблон выдачи данных созданного пользователя

Создание пользователей с логином и паролем

Скрипт gen-login создаёт пользователя через ocpasswd. Доступен только если включена парольная авторизация.

Центр управления пользователями

user-center показывает таблицу всех пользователей с онлайн статусом, датами сертификата, бан-поинтами и лимитом подключений. Для каждого пользователя можно посмотреть детали подключения, отредактировать config-per-user, кикнуть, сбросить бан-поинты или удалить.

Центр пользователей
Центр пользователей
Управление пользователем
Управление пользователем

Установка

Для установки достаточно четырех команд:

git clone https://github.com/Ilyntiy/ocservice.git
cd ocservice
chmod +x install.sh
sudo ./install.sh

Установщик install.sh делает всё сам:

  • Парсит пути из вашего ocserv.confocpasswd, config-per-user

  • Автоматически определяет URL камуфляжа если он включён

  • Задаёт несколько вопросов: префикс установки ocserv, режим авторизации, адрес сервера

  • Генерирует ocservice.conf с вашими настройками

  • Копирует скрипты в ~/bin/

  • Создаёт /etc/sudoers.d/ocservice с минимально необходимыми правами

Технические детали

Конфигурация

Все настройки хранятся в одном файле ocservice.conf рядом со скриптами. Скрипты читают его через source при каждом запуске. Это позволяет использовать инструмент с любой раскладкой файлов — ocserv в /opt, в домашнем каталоге или в любом другом месте.

Права и sudo

ocserv устанавливается из исходников от root, поэтому его файлы принадлежат root. Вместо того чтобы запускать весь инструмент через sudo, install.sh создаёт /etc/sudoers.d/ocservice с точечными правами только на нужные команды: occtl, ocpasswd, journalctl, systemctl restart/reload ocserv.

Камуфляж

ocserv поддерживает режим камуфляжа — сервер выглядит как обычный веб-сайт и принимает VPN подключения только если клиент передаёт секретный токен в URL. install.sh автоматически читает camouflage_secret из ocserv.conf и подставляет его в URL шлюза который показывается новым пользователям.

Сертификаты и CRL

При удалении пользователя с сертификатом скрипт отзывает сертификат через easyrsa revoke и обновляет CRL. ocserv читает CRL напрямую из easy-rsa/pki/crl.pem — копировать файл никуда не нужно, достаточно прописать правильный путь в ocserv.conf.

Требования

  • ocserv собранный из исходников

  • easy-rsa 3.x (для сертификатной авторизации)

  • openssl

  • use-occtl = true в ocserv.conf

Планы

  • База имён пользователей — имя при создании будет выбираться из заготовленного списка, а не вводиться вручную

  • Резервное копирование — отдельный скрипт и пункт меню для бэкапа конфигов, сертификатов и базы пользователей

  • Продление сертификата — без удаления и пересоздания, прямо из User Management Center

  • Уведомления об истечении сертификатов — предупреждение когда до конца срока остаётся N дней

  • Интеграция с Telegram ботом — управление сервером, выпуск и отзыв сертификатов прямо из Telegram

Ссылки

GitHub

Скрипт заточен под конкретный стек: ocserv из исходников + easy-rsa. Если у вас похожая конфигурация — попробуйте, буду рад отзывам. Если что-то не работает или не хватает какой-то функции — пишите в issues.