Назад | Перейти на главную страницу

Разрешить только N соединение для пользователя / конфигурации в openvpn

У меня есть openvpn на сервере и несколько клиентских конфигураций. Как я могу разрешить пользователю только одно соединение? Или, если не обязательно одно соединение, но не более N соединений для пользователя. Я не нашел ничего по этому поводу в документации.

Если вы предоставляете свои собственные сценарии подключения, вы можете контролировать, сколько подключений разрешено для каждого пользователя. Единственная загвоздка в том, что вам нужно какое-то постоянное хранилище. Обратите внимание, что поведение по умолчанию - разрешить клиенту только один раз.

Вот что вам нужно сделать.

На сервере включите в конфиг следующие строки:

script-security 2
duplicate-cn
up /etc/openvpn/connectScript.sh
client-connect /etc/openvpn/connectScript.sh
client-disconnect /etc/openvpn/connectScript.sh

В duplicate-cn необходим для одновременного подключения клиентов, script-security 2 нужен для запуска внешних скриптов. На клиенте нужно добавить explicit-exit-notify вариант, потому что без этого сервер не получит сообщение об отключении, когда клиент выходит или отключается, поэтому сценарий отключения будет вызываться только по истечении времени ожидания.

Следующие переменные среды будут экспортированы для сценария (вместе с другими - см. Раздел «Переменные среды» на странице руководства openvpn):

  • script_type может быть up, client-connect или client-disconnect, в зависимости от того, когда вызывается скрипт.
  • common_name будет содержать имя подключающегося пользователя, то есть значение поля CN сертификата или имя пользователя, в зависимости от того, какой тип аутентификации у вас на сервере.

Если script_type является up, вам необходимо очистить все данные клиентских подключений, поскольку в это время openvpn только что запущен, а клиентские подключения отсутствуют.

Если script_type является client-connect, то ваш сценарий должен решить, если пользователь, указанный в common_name переменная уже была подключена, и если да, то сколько раз. Если подключение разрешено, сценарий должен завершиться со значением 0. Любое другое значение выхода интерпретируется как ошибка, и клиент не подключается. Поэтому вам нужно подсчитать клиентов с одинаковыми именами и выйти с ошибкой, если для этого пользователя слишком много подключений. Вы должны уменьшить счет, когда script_type является client-disconnect.

Вам необходимо убедиться, что сценарий запускается пользователем, который запускает openvpn процесс, который предпочтительно не является корневым (указывается user и group переменные конфигурации).

Вот пример скрипта подключения. используя это, каждый клиент может иметь два соединения, третьему будет отказано. Это всего лишь очень примитивный образец, вам следует создать более сложный, но это хорошее начало.

#!/bin/bash

PERSIST_DIR=/tmp/pDir
mkdir -p $PERSIST_DIR

function handle_connect {
  CLIENTFILE=$PERSIST_DIR/$common_name
  if [ -e "$CLIENTFILE" ]; then
     NUMCONN=$(cat $CLIENTFILE)
     NEWCONN=$(expr $NUMCONN + 1)
     if [ $NEWCONN -gt 2 ]; 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/*
        ;;
  client-connect)
        "handle_connect"
        ;;
  client-disconnect)
        "handle_disconnect"
        ;;
esac

Я не думаю, что это возможно с аутентификация по паролю, так как вы можете ограничить только глобальные max-clients. Однако это поведение по умолчанию с сертификат аутентификации.

# Uncomment this directive if multiple clients
# might connect with the same certificate/key
# files or common names.  This is recommended
# only for testing purposes.  For production use,
# each client should have its own certificate/key
# pair.
#
# IF YOU HAVE NOT GENERATED INDIVIDUAL
# CERTIFICATE/KEY PAIRS FOR EACH CLIENT,
# EACH HAVING ITS OWN UNIQUE "COMMON NAME",
# UNCOMMENT THIS LINE OUT.
;duplicate-cn

Использование сертификатов для аутентификации подробно описано в OpenVPN PKI HOWTO. Хотя вам нужен один сертификат клиента на каждый клиентский компьютер, вы можете разрешить большее количество одновременных подключений для одного пользователя, назначив ему больше сертификатов.

  • У синего пользователя два компьютера, и ему нужны оба. client1.crt и client2.crt + клавиши + CA (для одновременного подключения обоих: если нет необходимости в одновременном использовании, достаточно 1).
  • У красного пользователя только один компьютер, поэтому client3.crt + ключ + CA достаточно.
  • Клиентам не нужно server.crt и серверу не нужно знать клиентов: все они доверяют ЦС.