openvpn 中的用户/配置仅允许 N 个连接

Jod*_*oro 2 vpn openvpn

我在服务器上有 openvpn 和一些客户端配置。如何只允许一个用户建立一个连接?或者,如果不一定是单个连接,但用户的连接数不超过 N 个。我在文档中没有找到任何关于此事的信息。

Lac*_*cek 6

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

这是您需要做的。

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

script-security 2
duplicate-cn
up /etc/openvpn/connectScript.sh
client-connect /etc/openvpn/connectScript.sh
client-disconnect /etc/openvpn/connectScript.sh
Run Code Online (Sandbox Code Playgroud)

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_typeis时减少计数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
Run Code Online (Sandbox Code Playgroud)