OpenVPN позволяет разрешить конкурентные (одновременные) подключения пользователей с одним сертификатом. Для этого в конфигурационном файле server.conf используется опция duplicate-cn.
Если к серверу без опции duplicate-cn подключился второй пользователе с тем же сертификатом, то сессия первого пользователя будет отключена. Благодаря опции duplicate-cn ваш OpenVPN сервер сможет поддерживать несколько активных подключений с одним сертификатом. Количество таких одновременных сессий можно ограничить скриптом.

Рассмотрим, как разрешить конкурентные подключения на сервере OpenVPN и ограничить их количество.
Добавьте следующе параметры в конфигурационный файл сервера:
duplicate-cn script-security 2 up /etc/openvpn/connection_sript.sh client-connect /etc/openvpn/connection_sript.sh client-disconnect /etc/openvpn/connection_sript.sh
- duplicate-cn — разрешает одновременные подключения
- script-security 2 — разрешает запуск внешних скриптов
- up, client-connect, client-disconnect — переменные окружения для передачи в скрипт
Создайте файл скрипта /etc/openvpn/connection_sript.sh со следующим кодом:
#!/bin/bash
PERSIST_DIR=/tmp/open
mkdir -p $PERSIST_DIR
# владелицам $PERSIST_DIR должен быть пользователь, от которого запущен OpenVPN
chown nobody:nobody $PERSIST_DIR
function handle_connect {
CLIENTFILE=$PERSIST_DIR/$common_name
if [ -e "$CLIENTFILE" ]; then
NUMCONN=$(cat $CLIENTFILE)
NEWCONN=$(expr $NUMCONN + 1)
# разрешить не более одного одновременного подключения с одним сертификатом
if [ $NEWCONN -gt 1 ]; then exit 1; fi
echo $NEWCONN >$CLIENTFILE
else
echo 1 >$CLIENTFILE
fi
}
function handle_disconnect {
CLIENTFILE=$PERSIST_DIR/$common_name
if [ -e "$CLIENTFILE" ]; then
NUMCONN=$(cat $CLIENTFILE)
NEWCONN=$(expr $NUMCONN - 1)
echo $NEWCONN >$CLIENTFILE
fi
}
case "$script_type" in
up)
rm -f $PERSIST_DIR/$common_name
;;
client-connect)
"handle_connect"
;;
client-disconnect)
"handle_disconnect"
;;
esacЗатем задайте права на скрипт:
chown nobody:nobody connectScript.sh
chmod 755 connectScript.sh
Выполните валидацию конфигурации и перезапустите сервис:
openvpn --config openvpn.conf
service openvpn restart
Добавьте в конфигурационный файл на стороне клиентов OpenVPN параметр:
explicit-exit-notify
Данный параметр заставляет клиента уведомлять сервер OpenVPN о разъединении сессии.
