본문 바로가기

Technical/Network

OpenVPN 설정 & 사용하기


대표적 Open source VPN인 OpenVPN은 point-to-point 접속을 구현하는 SSL VPN 솔루션이다. VPN은 일반적으로 PPTP, L2TP, SSL VPN, IPSec VPN, MPLS VPN 등이 있고, 유명 벤더의 VPN Router 제품도 시중에 나와 있다. 일반적인 상용장비들은 모든 표준들을 준수하며, 100, 1000 user 이상의 접속을 고속으로 처리하도록 VPN전용 OS와 하드웨어를 개발하여 제품화하고 있는 것이다.


요즘 시중의 iptime 기종 같은 인터넷공유기도 pptp VPN 정도는 거의 지원하는데, openvpn이나 windows의 pptp vpn 설정을 통해 VPN을 사용할 수도 있겠다. 한편, 100 user 이내의 Small Office의 경우, 외부에서 방화벽이나 NAT로 차단된 상황에서 사무실 내부로 접속이 필요하다거나, IDC의 특정 서버로 관리를 위한 빈번한 접속이 필요하지만(Point-To-Point), 중/대규모 통신은 그다지 필요하지 않다면, 비용적인 측면에서 OpenVPN을 써 봄이 좋을 듯하다. 나름 단순하면서도 속도도 쓸만 하다고 사람들은 말한다.


Mac OS X 10.3 이상에서는 PPTP, L2TP, IPSec 까지 포함되어 있다고도 하고, Windows 2000 Server 급 이상의 OS에서도 역시 VPN 서버 기능을 제공하고 있다(이건 나중에 알아보기로 하자)

OpenVPN을 설치한 서버에서 iptables로 매스커레이딩을 하거나 라우팅 기능을 이용한다면 상용 장비들이 제공하는 Point-To-Multi 형태의 사용도 가능해지게 된다. 물론 성능면에선...조금 거시기하겠지만 SOHO용이므로 그런대로 쓸만하지 않을까 한다.


개념 정리


개념을 정리해 보자면, VPN solution의 적용 방식은 조합을 해본다면 여러가지가 나오겠지만, 일반적으로 사용목적에 따라 Site-to-site와 Remote Access의 2가지로 나뉘며, 실제 적용 방법은 크게 아래의 4가지 정도로 정리된다.


 - Site-to-site with IPsec
 - Remote Access Using PPTP
 - Remote Access Using L2TP and IPsec
 - Site-to-site and Remote Access Using OpenVPN


주의할 것은, OpenVPN을 SSL VPN으로 오해하는 경우가 간혹 있는데, Open VPN은 OpenSSL의 암호화, 인증방식을 사용하는 것이지, 일반적인 SSL VPN처럼 Web을 통한 VPN 접근/사용 위주의  SSL VPN 솔루션이라는 오해가 없기를 바란다. 또한 OpenVPN 자체는 업계표준의 VPN이 아닌 자체 프로토콜을 적용한, 소위 표준에는 해당되지 않는  별도의 VPN솔루션이라는 점에 유의하자.

여기에서는 OpenVPN의 기본적인 개념과 설치, 설정, 접속을 위한 절차를 정리해 둔다.


1. 요구사항을 요약하면 간단히 아래 그림처럼 표현된다



2. OpenVPN 서버의 설치(Ubuntu 9.10, OpenVPN 2.1.1, openssl 2.0 기준)

OpenVPN Server 다운로드 설치한다. 방법은 

1)  http://www.openvpn.net 에서 타르볼이나 zip으로 된 소스를 다운로드 받고 tar -xvzf...해서 ./configure, make, make install 하여 컴파일해서 빌드하거나 

2) rpm을 다운로드 받아서 dpkg로 설치하거나 

3) apt-get 으로설치한다거나 하는

여러 방법이 있겠지만 ubuntu의 시냅틱관리자에서 간편하게 설치할 수 있으므로 이 방법을 써 보자. 참고로 위의 1번처럼 source를 받아서 자체 빌드를 하기 위해서는 openssl, lzo, pam 과 같은 라이브러리 패키지들이 필요한데, 개발환경에서 서버에 맞게 안정적으로 사용하기 위해서는 이 방법을 쓰는 것이 더 낫다. 자동 provisioning과  발급까지 고려한 솔루션이라면 더욱 더 이 방법을 써야 할 것이다.

여기서는 시냅틱패키관리자를 띄우고 검색에서 openvpn을 치면 패키지가 목록에 뜬다. 체크하고 적용하면 간단히 설치 끝. 예전 버전에서는 설치 후에 tun 또는 tap device를 /dev/net 아래 만들어서 커널에서 지원하도록 별도 설정을 해야 했지만, 지금은 설치하면 자동으로 /dev/net/tun device가 만들어져 있음을 알 수 있다.

설치 후 vpn 기능을 사용하려면 키 파일이 필요한데, 키 생성을 위해서 시냅틱관리자에서 openssl 패키지도 설치해둔다.


3. Root CA 서버 인증키 생성

OpenVPN 용 Root CA 인증서(*.crt)와 키파일(*.key)을 만들기 위해 /usr/share/doc/openvpn/examples/easy-rsa/2.0 으로 간다. 

su - 해서 root 로 수행한다. rpm으로 설치한다면 이 디렉토리가 맞을 것이다.

나중에 패키지 업그레이드 시를 대비한다면
# cp -r /usr/share/doc/openvpn/* /etc/openvpn/ => 원본 디렉토리는 보존하고 복사본으로 설정작업을 한다 여러번 수행할 경우에 대비 vars 파일의 가장 끝 부분을 아래와 같이 수정하자

     export KEY_COUNTRY=KR
     export KEY_PROVINCE=NA
     export KEY_CITY=Seoul
     export KEY_ORG="mydomain.com"
     export KEY_EMAIL=name@mydomain.com

# . ./vars => space 1칸 주의(source ./vars 와 같다)
# source ./clean-all
# ./build-ca => Enter 만 탁탁~

이렇게 하면
./keys 디렉 ca.crt(공개인증서), ca.key(개인키파일), index.txt, serial 파일이 만들어진다


4. 서버키 생성

서버에서 사용할 인증서, 키파일이 위에서 생성한 Root CA를 이용해서 sign되어 아래와 같이 생성한다.
# ./build-key-server server => Enter,... 끝에 Sign the certificate? 부터 2번의 y/n은 y 선택

이렇게 하면 server 라는 common name으로 ./keys 디렉토리에 서버인증서와 키 파일들이 만들어진다.


5. 클라이언트키 생성

클라이언트에서 사용할 인증서, 키파일을 아래와 같이 생성한다.
# ./build-key my-client

이렇게 하면 my-client 라는 common name으로 ./keys 디렉토리에 클라이언트인증서와 키 파일들이 만들어진다.


6. Diffi Hellman 암호화를 위한 pem 파일 생성

# ./build-dh

./keys 디렉토리 내에 dh1024.pem 파일이 생성된다.


7. 키파일 복사 & 보관

나중에 클라이언트에서 사용하기 위해서 방금 생성한 클라이언트 키 파일들을 따로 보관해 둘 필요가 있다.

# mkdir -p /root/client-keys
# cp ./keys/ca.crt ./keys/my-client.* /root/client-keys
# cd /root
# zip my-client-keys.zip client-keys/ca.crt client-keys/my-client.crt client-keys/my-client.key


8. 설정파일, 키파일 복사, 설정 편집, 기동

# cd /usr/share/doc/openvpn/examples/sample-config-files
# gunzip server.conf.gz
# cp server.conf /etc/openvpn
# cd /usr/share/doc/openvpn/examples/easy-rsa/2.0
# cp keys/server.* /etc/openvpn/
# cp keys/dh1024.pem /etc/openvpn/
# cp keys/ca.* /etc/openvpn/

# vi /etc/openvpn/server.conf => 해당 항목을 찾아 수정한다
    server 10.8.0.1 255.255.255.0 => openvpn server subnet 설정
    ; OpenVPN 서버를 gateway로 사용할 경우 10.8.1.0 255.255.255.0 으로 서브넷을 준다
    client-to-client => client 끼리 서로 인식할 수 있게
    duplicate-cn => 동일한 클라이언트 인증서로 여러 클라이언트가 쓰게
    max-clients 100 => 최대 동시 접속자 수
    plugin /usr/lib/openvpn/openvpn-auth-pam.so login => 시스템 계정으로 로그인 되게


* Gateway 설정, 10.8.1.* 대역의 서버들과 외부 클라이언트 사이의 gateway로 설정하고, VPN 클라이언트의 모든 인터넷 접속 요청을 모두 VPN server를 통해서 처리하려면(서버쪽의 보안성을 활용, 클라이언트측 보안성 극대화) 아래와 같이 한다(tun 사용, 즉 routed VPN일 경우)

push "redirect-gateway def1" ==> server.conf 에 추가(또는 un-comment)
다음, linux prompt에서

# echo 1 > /proc/sys/net/ipv4/ip_forward
# echo 'iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -o eth0 -j MASQUERADE' >> /etc/init.d/rc.local ==> 하지 않으면 1회성
# iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -o eth0 -j MASQUERADE
# iptables -t nat -L
# push "dhcp-option DNS 10.8.0.1" ==> VPN서버 자체가 DNS 기능을 가진다면 이와 같이 설정하면 된다.

* 만약 단순히 VPN client가 VPN서버측의 네트워크와 동일한 위치의 나머지 서버들에 접속할 수 있도록 하려면
(이 경우도 역시 tun 사용, 즉 routed VPN일 경우)

push "route 211.150.240.0 255.255.255.0"

==> server.conf에 설정(서버 위치의 네트웍이 211.150.240.0/24 라면)

다음, linux prompt에서
# echo 1 > /proc/sys/net/ipv4/ip_forward ==> ip forwarding 가능하게
# iptables -A INPUT -i tun+ -j ACCEPT
# iptables -A FORWARD -i tun+ -j ACCEPT
으로 설정하여 사용


서버의 설정이 끝났으면 아래와 같이 기동/종료/재시작 할 수 있다.
# /etc/init.d/openvpn start
# /etc/init.d/openvpn stop
# /etc/init.d/openvpn restart


9. 클라이언트 설치, 키 복사 & 접속

linux 클라이언트라면 openvpn 설치 후
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn
# cd /etc/openvpn
# 위에서 압축해서 보내준 client-keys.zip 파일을 여기에 해제
# vi client.conf => 설정 파일을 편집, 아래 2줄을 추가 편집
    remote 168.126.189.55 1194
    auth-user-pass => server.conf에서 linux등의 시스템 계정으로 plugin(위 설명 참조)을 지정했다면 반드시 이 줄을 추가

# /etc/init.d/openvpn start => 서버쪽으로 접속 시도

windows 클라이언트라면
openvpn-2.x.x-gui-1.x.x-install.exe 을 다운받아서 설치하고 최근 버전은 여기(http://openvpn.se/download.html) 에서 다운받을 수 있다.

위에서 압축해서 보내준 client-keys.zip 파일을 openvpn configuration directory에 풀고(client-keys 내의 키파일들을 이 디렉토리에 복사해야 한다. 클라이언트측 필수 파일은 ca.crt, my-client.crt, my-client.key)

OpenVPN client 가 설치된 디렉토리를 찾아서 ...x86/openvpn/sample-config/client.ovpn 파일을
...x86/openvpn/config 디렉토리로 복사한 후, client.ovpn 파일을 편집기로 열어서(또는 트레이에서 Edit config)


* 중요한 Client 설정 몇가지...

    dev tun => tun/tap 중에서 server측과 맞춘다
    proto udp => tcp/udp 중에서 역시 server측과 맞춘다
    remote 130.5.120.55 1194 => 부분의 ip를 OpenVPN 서버로 접속되도록 대표ip 또는 openvpn 서버의 ip로 지정
    ca ca.crt => 여기부터 아래 3개 cert 항목은, 필요 없는 항목은 반드시 # 로 comment 처리(중요!)
    cert my-client.crt
    key my-client.key
    ns-cert-type server => server 설정에 따라 켜거나 또는 꺼야 한다
    auth-user-pass => server 계정을 사용하여 인증후에 접속해야 하는 경우에 사용

트레이아이콘에서 접속 시도 -> 접속에 성공하면 OpenVPN 서버와 클라이언트 간의 가상 전용회선이 뚫린 것이므로 마음대로 쓰면 된다.



- Barracuda -