조건
1. 중복로그인(접속)을 허용함
2. client 당 2개의 동시접속을 허용함
3. client 당 2개를 초과한 접속의 경우 접속 시도에 실패함.
설정
중복 접속 허용
openvpn server config 에 아래와 같은 설정으로 중복 접속을 허용한다.
> server.conf
...
duplicate-cn
...
동시접속 수 체크를 위한 script 설정
openvpn server config 에 상황을 조건으로 하는 사용자 정의 script를 정의 할 수 있다.
script를 정의하기에 앞서 script 사용에 대한 정책 수준제어를 설정을 할 수 있다.
script-security <level> <method>
level은 값이 낮을 수록 보안수준이 높고 값이 높을 수록 보안수준이 낮다.
0 -- Strictly no calling of external programs.
=> 외부 실행 파일을 호출 하지 않는다.
1 -- (Default) Only call built-in executables such as ifconfig, ip, route, or netsh.
=> default값으로 ifconfig, ip, route 또는 netsh와 같은 내장 실행 파일만 호출 할 수 있다.
2 -- Allow calling of built-in executables and user-defined scripts.
=> 내장 실행 및 사용자 정의 스크립트를 호출 할 수 있다.
3 --Allow passwords to be passed to scripts via environmental variables (potentially unsafe).
=> 암호를 환경 변수를 통해 스크립트에 전달 되도록 허용하므로 보안에 취약하다.
설정은 server config에 아래와 같이 설정한다.
> server.conf
...
script-security 2
...
script 정의
여러가지 경우가 있지만 사용될 script는 3가지 경우로 나누어 실행 할 수 있다.
- up : tcp/udp socket이 bind 되고 tun/tab 등의 device가 오픈될때, 즉 openvpn이 daemon으로 실행될 경우이다. 반대는 down을 쓸수 있다.
- client-connect : client가 접속 하여 인증에 성공 한 후
- client-disconnect : client가 접속을 종료한 후
스크립트 이름은 "connectScript.sh"이고 server config에 아래와 같이 설정한다.
> server.conf
...
up /etc/openvpn/server/connectScript.sh
client-connect /etc/openvpn/server/connectScript.sh
client-disconnect /etc/openvpn/server/connectScript.sh
...
script 작성
server config에 script를 정의하고 실행 될때 client 이름과 ip주소 등이 환경변수로 script에 넘어간다.
client 이름($common_name) 을 이용하여 tmp 디렉토리에 client 이름 별로 동시접속 수를 기록하고 2개를 초과 하는 접속시도가 들어올 경우 접속을 종료 시키는 간단한 스크립트를 작성한다.
> connectScript.sh
#!/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
tmp 디렉토리에 다음과 같이 client이름으로 동접 수를 기록한다.
참조 : https://openvpn.net/community-resources/reference-manual-for-openvpn-2-1/
'시스템 > OpenVPN' 카테고리의 다른 글
[OpenVPN] management를 이용한 사용자 접속해제 하기 (0) | 2022.08.11 |
---|---|
[OpenVPN] openvpn-monitor 설치하기(docker) (0) | 2022.08.11 |
[OpenVPN] AD(Active Directory) 연동 (0) | 2022.05.12 |
[OpenVPN] PAM인증을 통한 Client ID/PASSWORD 방식 접속 (2) | 2022.05.12 |
[OpenVPN] Client Key 파기 + Key 관리 (0) | 2022.05.12 |