我在服务器上有 openvpn 和一些客户端配置。如何只允许一个用户建立一个连接?或者,如果不一定是单个连接,但用户的连接数不超过 N 个。我在文档中没有找到任何关于此事的信息。
如果您提供自己的连接脚本,则可以控制每个用户允许的连接数。唯一的问题是您需要某种类型的持久存储。请注意,默认行为是仅允许客户端一次。
这是您需要做的。
在服务器上,在配置中包含以下几行:
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可以是up,client-connect或client-disconnect,这取决于脚本的调用时间。common_name 将包含连接用户的名称,即证书的 CN 字段的值或用户名,具体取决于您在服务器上的身份验证类型。如果script_type是up,则需要清除所有客户端连接数据,因为那时 openvpn 刚刚启动,并且不存在客户端连接。
如果script_type是client-connect,则您的脚本需要确定common_name变量中指定的用户是否已连接,如果已连接,则连接多少次。如果允许连接,脚本应以 0 值退出。任何其他退出值都被解释为错误,客户端将不会连接。因此,您需要计算具有相同名称的客户端,如果该用户的连接过多,则会出现错误退出。您应该在script_typeis时减少计数client-disconnect。
您需要确保脚本可由运行该openvpn进程的用户运行,该用户最好不是 root(由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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5533 次 |
| 最近记录: |