brunch

You can make anything
by writing

C.S.Lewis

by 맥가이버 잡부 Mar 11. 2022

오픈소스 SoftEther VPN 구축#1

반백년을 앞둔 현역 개발자의 일상기록

코로나19가 시작되면서 반강제(?)로 재택업무가 시작되었고, 언택트 솔루션이 충분하지 않은 상황에서 수개월간의 원격근무 시행착오를 겪었고 이제 어느 정도 익숙해졌지만, 그동안 급해서 도입했던 솔루션들로 인한 보안, 비용 등의 문제가 아직 다 해결되지 않은 상황인것 같다.


'21년 11월부터 위드코로나가 시작되면서 재택에서 출근으로 전환하는 회사들도 있지만, 현재 근무중인 회사를 포함하여 IT기업들은 3년전으로 돌아가기는 어려울 것 같아 이 기회에 보안관리자 관점에서 소규모 기업 또는 조직에서 보안수준을 유지하면서, 비용이슈도 없으며 무엇보다 어렵지 않게 도입가능한 오픈소스 VPN서버 구축기를 정리하기로 하였다.


지금 소개할 SoftEther VPN(https://www.softether.org)은 쓰구바대학에서 시작된 오픈소스 프로젝트로 현재는 전세계적으로 많이 사용되고 있는것 같으며, 무엇보다 설치형 오픈소스로 계정만 생성하는 Cloud방식의 VPN보다 기밀성이나 보안이슈가 적고, ISMS인증 심사 또는 개인정보보호법을 준수해야 하는 입장에서는 KISA의 기술적보호조치 가이드 라인 준수에 적합하다고 할 수 있다.


물론 Google Outline(https://www.getoutline.org)도 있지만 VPN이라 하기에는 좀 부족하고, 암호화 방식도 가이드라인에 부적합하여 향후 문제소지가 있어, 배제 하였으며, OpenVPN의 경우 Client를 구현하기가 어려워 제외 하였다.


본 문서는 네트웍 또는 인프라 전문가가 아니더라도 구축 가능하도록 최대한 설명을 쉽게 작성하려 노력했으며, 가정에서 사용하는 일반적인 인터넷 공유기의 네트워크 세팅을 자유롭게 할 수 있는 수준이면 충분히 구축하는데 어렵지 않을 것으로 생각된다.



1. VPN 구성환경 및 요구사항


1.1. VPN 환경

VPN 서버 : AWS Linux(AMI)로 일반 RHEL 또는 CentOS 계열

VPN 클라이언트 :  Windows PC / Mac, 스마트폰(IPsec 적용시)


1.2. VPN 요구사항

VPN방식은 IPSec(L2TP) 또는 SSLVPN을 지원해야 한다.

VPN Client 제공 또는 OpenVPN Client와 호환성이 있어야 한다.

MFA를 지원해야 한다. > SoftEther는 MFA를 지원하지 않으나, Radius 인증을 사용하여 우회적으로 구현 가능함, 상세내용은 2장에서 다룸

VPN 서버를 통해서 사설 네트웍에 접근 가능해야 한다.



2. VPN 서버 구축


2.1. VPN 서버 구축에 필요한 기본 Software

Softether은 원격접속을 위한 VPN 모드로 SecureNAT와 Local Bridge 방식을 제공하며, SecureNAT는 Softether Server에 DHCP 및 NAT가 내장되어 있어 구성이 용이하나 All-in-one 방식의 특성상 트래픽이 일정 수준이상 높은 경우 지연이 발생되는 문제점이 있어 본장에서는 Local Bridge 구성을 전제로 한다.

Softether VPN Server

dnsmasq : VPN Client에게 사설 IP를 할당하기 위해 필요한 DHCP서버

iptables : VPN Server에서 Client로 부터 인입되는 패킷을 내부의 사설 네트웍으로 연결하기 위해 로컬브리지(Local Bridge)를 구성하며 이때 서로 다른 네트웍을 연결하기 위해 iptables를 이용한다.


2.2. dnsmasq 설치 및 구성

네트웍은 root 권한으로 구성해야 하므로 sudo 명령어를 이용하여 "Figure 1."처럼 RPM 패키지 설치 및 DHCP 구성을 진행한다.

$ sudo yum install dnsmasq

$ sudo vi /etc/dnsmasq.conf

interface=tap_my_vpn  #내외부 네트웍 연결을 위한 TAP driver(ex : tap_my_vpn)

dhcp-range=tap_my_vpn,192.168.0.11,192.168.0.249,24h  #DHCP IP 192.168.0.11~249, 24시간 

dhcp-option=tap_my_vpn,option:netmask,255.255.255.0

dhcp-option=tap_my_vpn,option:router,192.168.0.254  #DHCP Gateway IP주소

dhcp-option=tap_my_vpn,option:dns-server,168.126.63.1,164.124.101.2  #DNS 네임서버

dhcp-option=tap_my_vpn,option:classless-static-route,10.0.0.0/24,192.168.0.254 #Client split tunneling 구성, Client에서 VPN을 사용할 CIDR과 Gateway를 순서대로 설정 

port=0

Figure 1. dnsmasq 설치


2.3 iptables 설치 및 구성

"Figure 2."처럼 RPM 패키지 설치 및 서버의 포워딩 기본설정을 변경한다.

$ sudo yum install iptables-services

$ sudo vi /etc/sysctl.conf

net.ipv4.ip_forward = 1

net.ipv4.conf.all.accept_redirects = 0

net.ipv4.conf.all.send_redirects = 0

$ sudo sysctl -p

Figure 2. iptables 설치 및 서버 기본설정 변경


"Figure 3."과 같이 iptable 정책을 추가한다.

$ sudo su -  #root 권한으로 변경

$ systemctl start iptables

$ systemctl enable iptables

$ iptables -P INPUT ACCEPT

$ iptables -P FORWARD ACCEPT

$ iptables -P OUTPUT ACCEPT

$ iptables -t nat -F

$ iptables -t mangle -F

$ iptables -F

$ iptables -X

$ iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 10.0.0.1  #사설 네트워크 대역 : 192.168.0.1~254, 서버의 IP주소 : 10.0.0.1, 서버의 IP주소가 Dynamic IP 인 경우 "iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE" 으로 명령어를 수정한다. 

$ service iptables save  #iptable 정책 저장

Figure 3. iptables routing  설정


2.4. Softether VPN Server 설치

Softether VPN 서버는 소스형태로 제공되며 서버OS 맞게 컴파일해서 설치한다. Figure 4~6.는 VPN서버 설치경로 및 컴파일에 필요한 Tool및 c 컴파일러를 설치하는 모습이다.

$ sudo mkdir /app

$ sudo chown -R ec2-user:ec2-user /app  #AWS EC2 기본 계정인 ec2-user로 소유자 변환(VPN 서버는 root로 기동되므로 반드시 필요하지는 않으며 관리 차원의 설정임

$ cd /app

$ sudo yum groupinstall "Development Tools"  #컴파일에 필요한 개발 Tool 설치

Figure 4. 설치경로(/app) 생성 및 Tool 설치


"Figure 5."와 같이 Softether 소스 컴파일을 위한 gcc를 설치하고. Softether 다운로드 사이트(https://www.softether-download.com)에서 Linux Platform를 다운로드 한다. (Figure 6. 참조)

$ sudo install gcc

$ wget http://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.38-9760-rtm/softether-vpnserver-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz

$ tar xvzf ./softether-vpnserver-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz

Figure 5. gcc 설치 및 Softether VPN Server 소스 다운로드
Figure 6. Softether VPN Server download


"Figure 7."를 참조하여 Softether VPN 소스를 컴파일 한다.

$ cd vpnserver

$ make  #소스 컴파일

$ sudo ./vpnserver start  #vpnserver 명령어(start & stop)으로 정상 기동 여부를 확인한다. 

vpnserver가 기동되면 Web console도 기본적으로 활성화 되며, 보안상 문제가 있는 경우 설정에서 비활성화 가능하다.

Figure 7. Softether VPN Server Build


2.5. vpnserver 서비스 설정 및 TAP driver 연결

2.2에서 설치한 DHCP와 Softether VPN Server(이하 vpnserver)를 연결해야만 Client가 vpnserver에 접속시 사설IP를 할당 받을 수 있다. "Figure 8."은 ifconfig 명령어를 사용하여 vpnserver에 DHCP를 연결하는 shell을 생성하고 해당 shell을 service로 등록하여 Linux 부팅시 자동으로 실행되도록 설정한 것이다.

$ sudo su -  #service는 root로 등록한다. 

vi /usr/sbin/vpnserver.sh

#!/bin/sh

# chkconfig: 2345 99 01

# description: SoftEther VPN Server

DAEMON=/app/vpnserver/vpnserver

LOCK=/var/lock/subsys/vpnserver

TAP_INF=tap_my_vpn  #2.2에서 설정한 TAP driver명과 동일해야 함

TAP_ADDR=192.168.0.254

TAP_MASK=255.255.255.0

test -x $DAEMON || exit 0

case "$1" in

        start)

        systemctl start dnsmasq

        sleep 1

        $DAEMON start

        touch $LOCK

        sleep 1

        /sbin/ifconfig $TAP_INF $TAP_ADDR netmask $TAP_MASK

        ;;

        stop)

        $DAEMON stop

        rm $LOCK

        systemctl stop dnsmasq

        ;;

        *)

        echo "Usage: $0 {start|stop}"

        exit 1

esac

exit 0

$ chmod 664 /usr/sbin/vpnserver.sh

$ vi /etc/systemd/system/vpnserver.service  #Linux service 등록

[Unit]

Description=SoftEther VPN Server


[Service]

Type=simple

WorkingDirectory=/app/vpnserver

ExecStart=/usr/sbin/vpnserver.sh start

ExecStop=/usr/sbin/vpnserver.sh stop


[Install]

WantedBy=multi-user.target

$ systemctl enable vpnserver.service  #Linux 부팅시 자동시작 되도록 설정

Figure 8. vpnserver shell 및 service 등록


상기와 같이 설정이 완료되면 systemctl 명령어로 vpnserver를 제어할 수 있다

$ systemctl start vpnserver  #vpnserver 시작

$ systemctl stop vpnserver  #vpnserver 중지

$ systemctl status vpnserver  #vpnserver 서비스 상태 조회




3. VPN 서버 매니저 설치


3.1. VPN Server Manager 다운로드

Softether VPN Server 설정, 암호화 레벨, 이용자 등록 등은 Manager 유틸리티로 진행하며 Windows 기반의 GUI를 사용하여 용이한 설정이 가능하다.

Manager 유틸리티는 2.4에서와 같이 다운로드 사이트(https://www.softether-download.com)에서 무설치 파일을 다운로드 한다. (Figure 9. 참조)

Figure 9. VPN Server Manager Utility 다운로드


3.2. Manager 접속 설정

Managr를 실행하면 "Figure 10."과 같이 최초 접속 설정을 진행해야 하며 접속 Port는 기본값인 5555를 선택하여 VPN Port(443)와 구분한다. 

ref.) VPN서버는 보안 장비로 일반 서버보다 높은 보안 수준에서 관리되어야 하므로 Manager로 접속 가능한 IP를 최소화하는 ACL을 적용해야 한다.

Figure 10. VPN Server Manager 접속 설정


VPN 서버 설정 저장 후 최초로 접속하면 Admin 접속 비밀번호 설정화면이 표시되며 이때 저장된 비밀번호로 재접속시 사용된다. 높은 보안수준 필요시 "Make a Certificate"를 사용하여 소유(인증서) 기반 인증도 가능하나 본 장에서는 다루지 않는다.

Figure 11. VPN Server Manager 비밀번호 설정


최초 접속시 비밀번호 설정 다음에 설정 마법사(Easy Setup)가 표시되나 해당 기능을 사용하지 않고 skip 하며, IPsec 설정 역시 추후에 추가 설정이 가능하므로 마법사와 마찬가지로 skip 한다.

Figure 12. Easy Setup 및 IPsec 설정 화면


3.3. Local Bridge 설정

Managr 콘솔에 접속하면 DEFAULT 가상 Hub가 등록된 상태로 표시되며 해당 Hub는 삭제(Delete)후 재생성(Create a Virtual Hub)도 가능하다. "Figure 13."은 앞서 2.1.에서 설명했던 VPN 2가지 모드중 Local Bridge를 설정하는 것으로 VPN외부와 사설망 내부를 연결하기 위해 서버의 이더넷 카드를 선택한다.

Figure 13. Local Bridge 설정


3.4. Virtual Hub VPN 계정 설정

VPN서버의 네트웍은 가상 Hub 단위로 분리되며, VPN 이용자(User) 및 인증, 암호화를 Hub에서 설정할 수 있다. "Figure 14."는 VPN 계정을 생성하는 것으로 동시접속 차단, 세션 제어등 보안정책을 설정한다면 그룹을 생성하여 정책관리를 하는 것이 용이하다 

Figure 14. Virtual Hub  계정 설정


VPN 계정은 비밀번호 인증(Password Authentication)부터 NT 인증(NT Domain Authentication)까지 선택이 가능하며 Softether의 장점은 이용자 계정별로 인증 방법을 선택할 수 있다는 점이다. 즉, 내부 사용자는 NT 도메인 인증을, 외부 사용자는 비밀번호 인증을 구분하여 적용할 수가 있다.

ref.) Radius 인증과 NT 도메인 인증은 외부 인증서버와의 인증을 별도로 설정 해야하며, 앞서 언급했듯 MFA 적용 예제를 위해 다음 챕터에서 다룰 예정이다. 

Figure 15. VPN 계정 생성(Password Authentication)


3.5. 기타 설정

Local Bridge 모드로 설정하면 SecureNAT를 비활성화 해야만 트래픽이 Loop되지 않으므로 "Figure 16." 처럼 SecureNAT를 비활성화 해야한다.

Figure 16. SecureNAT 비활성화


VPN 통신구간의 암호화 강도는 VPN 성능(통신속도 및 동시접속)과 반비례 관계로 암호 알고리즘 강도가 높을수록 성능은 낮아진다. 그러나 ISMS-P 등 규정준수를 위해서는 안전한 알고리즘을 사용해야 하므로  AES256과 SHA384 이상을 선택하는 것이 좋으며 이 정도 수준으로는 성능저하가 가시화 될 정도로 낮아지진 않으므로 걱정하지 않아도 된다.

Figure 17. 암호화 알고리즘 변경





4. VPN 클라이언트 설치


4.1. VPN Client 다운로드 및 설치

Softether VPN Client는 Windows, Linux이 있으나 본 장에서는 Windows Client만 다룬다. 설치파일은 공식 사이트(https://www.softether-download.com)에서 다운로드 하여 설치한다.

ref.) Mac을 포함한 기타 OS(모바일 단말기 등)는 L2TP방식의 IPsec 연결을 지원한다.



4.2. VPN Connection 생성

VPN 터널링을 위한 가상 어뎁터를 먼저 생성하고 해당 가상 어뎁터를 통해 VPN 커넥션을 생성한다.

커넥션 생성은 "Figure 18."과 같이 VPN서버의 Host(IP주소)와 Port(Default 443)를 입력하면 서버에서 설정한 가상 Hub가 조회되며, VPN 계정은 현 단계에서 저장하지 않아도 된다.

ref.) 가상 어뎁터가 없는 경우 VPN 커넥션 생성시 자동으로 생성되며, VPN Client와 Server 사이에 Proxy Server가 있는 경우 Proxy를 경유해서 접속도 가능하다.

Figure 18. VPN Connection 생성


4.3. VPN 접속

생성된 VPN 커넥션을 더블 클릭했을때 4.2. 단계에서 계정정보를 저장하지 않은 경우 "Figure 19."와 같이 접속 계정정보를 입력하는 창이 표시되며, 앞서 3.4.에서 생성한 VPN 계정을 입력하여 로그인을 시도한다.

VPN 접속이 성공하면 DHCP에서 할당된 사설 IP주소가 표시되며 접속상태와 관련된 제어는 Windows Taskbar의 Softether 아이콘을 확인하면 된다.

Figure 19. VPN 로그인 및 접속



@다음 챕터에서는 Client level에서 인터넷과 VPN네트웍을 분리하는 Split Tunneling과 MFA를 적용하기 위한 Radius Authentication을 다룰 예정입니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari