У меня есть 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
и серверу не нужно знать клиентов: все они доверяют ЦС.