我在服务器上安装了 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
可以是up
或client-connect
,client-disconnect
具体取决于脚本的调用时间。common_name
将包含连接用户的名称,即证书的 CN 字段的值或用户名,具体取决于您在服务器上使用何种类型的身份验证。
如果script_type
是up
,则需要清除所有客户端连接数据,因为此时 openvpn 刚刚启动,并且不存在任何客户端连接。
如果script_type
是client-connect
,则您的脚本需要确定变量中指定的用户是否common_name
已连接,如果是,则确定连接次数。如果允许连接,则脚本应以 0 值退出。任何其他退出值都将被解释为错误,客户端将不会连接。因此,您需要计算同名的客户端,如果该用户的连接数过多,则以错误退出。当script_type
是时,您应该减少计数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
答案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.crt
和client2.crt
+密钥+CA(用于同时连接两台电脑:如果不需要同时使用,1 就足够了)。 - 红色用户只有一台电脑,所以
client3.crt
+key+CA就够了。 - 客户端不需要
server.crt
,服务器也不需要了解客户端:他们都信任 CA。