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 о разъединении сессии.