在 openvpn 中仅允许用户/配置进行 N 次连接

在 openvpn 中仅允许用户/配置进行 N 次连接

我在服务器上安装了 openvpn,并配置了一些客户端。我怎样才能只允许一个用户建立单个连接?或者,即使不一定是单个连接,但用户的连接数不超过 N 个。我在文档中没有找到有关此事的任何信息。

答案1

如果您提供自己的连接脚本,则可以控制每个用户允许的连接数。唯一的问题是您需要某种持久存储。请注意,默认行为是仅允许客户端一次。

这是您需要做的。

在服务器上,在配置中包含以下行:

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可以是upclient-connectclient-disconnect具体取决于脚本的调用时间。
  • common_name将包含连接用户的名称,即证书的 CN 字段的值或用户名,具体取决于您在服务器上使用何种类型的身份验证。

如果script_typeup,则需要清除所有客户端连接数据,因为此时 openvpn 刚刚启动,并且不存在任何客户端连接。

如果script_typeclient-connect,则您的脚本需要确定变量中指定的用户是否common_name已连接,如果是,则确定连接次数。如果允许连接,则脚本应以 0 值退出。任何其他退出值都将被解释为错误,客户端将不会连接。因此,您需要计算同名的客户端,如果该用户的连接数过多,则以错误退出。当script_type是时,您应该减少计数client-disconnect

您需要确保运行该openvpn进程的用户可以运行该脚本,最好不是 root (由usergroup配置变量指定)。

这是一个示例连接脚本。使用此脚本,每个客户端可以有两个连接,第三个将被拒绝。这只是一个非常原始的示例,您应该创建一个更复杂的示例,但这是一个很好的开始。

#!/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

答案2

我认为这是不可能的密码认证,因为你只能限制全局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 指南。虽然每台客户端计算机都需要一个客户端证书,但您可以通过为单个用户分配更多证书来允许更多同时连接。

在此处输入图片描述

  • 蓝色用户有两台电脑,需要client1.crtclient2.crt+密钥+CA(用于同时连接两台电脑:如果不需要同时使用,1 就足够了)。
  • 红色用户只有一台电脑,所以client3.crt+key+CA就够了。
  • 客户端不需要server.crt,服务器也不需要了解客户端:他们都信任 CA。

相关内容