본문 바로가기

시스템/OpenVPN

OpenVPN | Server side script로 동시접속 제한 하기

반응형

조건


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/

반응형