OPEN VPN을 이용한 VPN 구현

Security 2008. 11. 2. 20:14

VPN의 종류와 필요성에 대해서는 많은 이들이 숙지하고 있다. 하지만 비용이나 불편함 때문에 실제 도입을 꺼려지는 경우가 상당수에 이르는데, 이는 오픈소스로 개발돼 배포중인 OpenVPN이라는 프로그램을 통해 극복할 수 있다. VPN 도입의 가장 큰 걸림돌이었던 비용 문제를 해결하면서 고성능의 VPN을 구현할 수 있도록 지원하는 OpenVPN의 특징에 대해 알아보자.

 

- OpenVPN은 하나의 UDP 포트를 통해 모든 트래픽을 터널링할 수 있다. 즉 웹 접속(HTTP)을 하거나 DNS 질의를 할 때(UDP/53), ping(ICMP)을 날려도 중간에 패킷을 캡처하면 500/UDP를 통해 전송되는 것처럼 보이게 한다.


- 안전한 VPN 통신을 위해 별도의 모듈이 필요없이 널리 사용하고 있는 OpenSSL에서 지원하는 강력한 암호화와 인증 기능 등을 그대로 이용할 수 있다.


- OpenVPN은 시스템 내에서 별도의 데몬 형태로 작동하기 때문에 IPsec 기반의 VPN 프로그램처럼 복잡한 커널 패치나 커널 모듈이 필요하지 않으며, 설치 방법도 간단하다.


- 모든 패킷이 VPN을 통해 터널링되고 압축 혹은 암호화됨에도 불구하고 시스템에 부하를 유발하지 않으며, 속도도 빠르다.

 

이외에도 OpenVPN은 많은 특징과 확장 가능성을 가지고 있다. 더 자세한 내용은 홈페이지(http://openvpn.net/)를 참고하기 바란다.


지금부터는 OpenVPN을 이용해 (그림 1)처럼 전자우편이나 웹 서버 등의 용도로 많이 사용되는 리눅스 서버와 윈도우 PC 간에 VPN을 연동해 안전한 네트워크를 구성하는 사례를 살펴보자. 



 

(그림 1)처럼 IDC 등의 전산 센터에 있는 서버에 VPN 데몬을, PC에 VPN 클라이언트 프로그램을 설치한다. 그 뒤 VPN 서버에 접속해 인증을 받으면, VPN 서버로부터 별도의 VPN용 IP를 할당받아 VPN 터널을 통해 접속할 수 있다.


물론 이때의 서버 접속은 인터넷은 물론 VPN 터널을 통해서도 가능하다.

 

 

·VPN 서버 설치와 설정


먼저 서버에서 VPN 데몬을 설정하자. OpenVPN에서는 TUN이나 TAP이라는 별도의 가상 인터페이스로 VPN 통신을 하므로, 우선 커널에서 이 드라이버를 지원하도록 다음과 같이 설정한 뒤 커널을 컴파일해야 한다.

 

[*]   Universal TUN/TAP device driver support

 

이후 디바이스를 설정하기 위해 다음의 명령어를 실행하는데, 이미 설정돼 있는 경우가 대부분이다.

 

# mkdir /dev/net
# mknod /dev/net/tun c 10 200
                         
다음으로 OpenVPN을 설치하기 전에 OpenSSL과 LZO라는 두 프로그램을 먼저 설치한다. 이들 프로그램은 VPN 이용 시, 패킷을 암호화하고 압축해 전송할 때 필요한 모듈로, 다음 사이트에서 다운로드해 설치하면 된다.
 
* OpenSSL :
http://www.openssl.org/
* LZO      :
http://www.oberhumer.com/opensource/lzo/

 

프로그램 설치가 끝났으면 OpenVPN 홈페이지에서 소스를 다운로드해 './configure ; make; make install'로 설치하면 된다. VPN 클라이언트와 서버 간 인증을 위해서는 인증서가 필요하므로 먼저 서버에서 인증서를 생성한다. 인증서를 생성할 때나 사인을 할 때는 OpenSSL을 이용하므로 미리 설치돼 있어야 한다.


먼저 Root CA 인증서와 비밀키를 생성해야 하는데, 다음 명령어를 실행하면 1년 동안 유효한 CA와 비밀키(개인키)를 생성할 수 있다.

 

# openssl req -nodes -new -x509 -keyout my-ca.key -out my-ca.crt -days 365

 

다음은 클라이언트와 서버에서 사용할 키를 각각 생성한다.

 

# openssl req -nodes -new -keyout client.key -out client.csr
# openssl req -nodes -new -keyout server.key -out server.csr

 

Root CA를 이용해 서버와 클라이언트 인증서에 각각 사인한다. 

 

# openssl ca -out server.crt -in server.csr
# openssl ca -out client.crt -in client.csr

 

다음으로 서버에서 암호화 협상 시 필요한 Diffe Hellman 파라미터를 생성한다.

 

# openssl dhparam -out dh1024.pem 1024


이제 나머지는 서버에 그대로 두고, client.crt와 client.key 그리고 my-ca.key 파일을 클라이언트 PC의 적당한 디렉토리로 복사하면 된다. 이제 서버의 설정 파일을 살펴보자.

 

[서버 설정 파일 - openvpn.conf]

 

port 500 : OpenVPN은 기본적으로 UDP를 이용해 패킷을 터널링해 전달하는데, 이때 포트는 사용되지 않은 어떤 포트를 사용해도 관계없다.

 

proto udp : 기본 값인 UDP를 사용하는 것이 좋다. TCP는 권장하지 않는다.

 

dev tap : OpenVPN 서버와 클라이언트 상호 통신에 필요한 인터페이스를 지정하는데, TUN이나 TAP을 지정할 수 있다.

 

ifconfig 10.105.11.1 255.255.0.0 : VPN 서버가 사용할 IP를 지정한다. TAP에 이 IP가 할당돼 원격지 PC와  통신할 수 있게 되는데, 가급적 사용하지 않는 사설 IP를 사용하는 것이 좋다.

 

keepalive 10 120 : 클라이언트와 서버 간에 VPN 연동이 활성화됐는지 체크하기 위해 사용되는데, 매 10초마다 ping을 발송해 120초 동안 응답이 없으면 원격지의 네트워크가 다운된 것으로 파악한다는 의미다.

 

comp-lzo : 압축 알고리즘을 사용하도록 한다. 서버에 이 같이 설정했다면, 클라이언트에도 동일하게 설정하도록 한다.

 

persist-key
persist-tun
user nobody          
group nobody   
: 초기화된 후에 OpenVPN 데몬이 nobody 권한으로 작동하도록 한다. 

 

status       openvpn-status.log
log          openvpn.log              
log-append  openvpn.log
: OpenVPN의 로그를 생성하는 설정이다.

 

tls-server : SSL 키 교환 시에 서버 역할을 하므로 tls-server로 지정한다.

 

dh  dh1024.pem
ca  my-ca.crt             
cert  server.crt                  
key server.key
:  CA 파일이나 인증서의 공개키 혹은 비밀키를 지정한다.

 

이후 서버에서 --mode server를 추가해 다음과 같이 실행하면 앞에서 지정한 포트로 데몬이 작동하는 것을 확인할 수 있다.

 

# openvpn --config /etc/server.conf --daemon --mode server

 


·VPN 클라이언트 설치와 설정


다음으로는 윈도우 PC의 클라이언트 프로그램 설정에 관한 내용을 살펴보자. 윈도우 클라이언트 프로그램으로는 OpenVPN GUI라는 프로그램이 많이 사용되는데, 웹 사이트(
http://openvpn.se/)에서 다운로드해 설치하면 된다. 설치 이후 '시작->프로그램->OpenVPN'을 선택하면 다음과 같은 메뉴가 보이는데, 여기에서 OpenVPN GUI를 실행하면 된다. 이후 우측의 트레이에 생긴 아이콘에 오른쪽 마우스를 클릭하면 사용 가능한 메뉴가 나오는데, 여기에서 Edit Config를 선택하면 메모장이 뜨면서 설정작업을 진행할 수 있다. 서버 설정과 크게 다르지 않으므로 쉽게 이해될 것이다.
                 

(화면 1) OpenVPN 메뉴

 

[클라이언트 설정 파일 - config.ovpn 파일]

 

remote 220.11.xx.xx : VPN 데몬이 설치돼 있는 서버의 IP를 설정한다.

 

port 500 : VPN 서버와 통신할 포트를 지정해야 하는데, 서버에서 지정된 포트와 동일한 포트를 설정한다.

 

proto udp : 역시 기본 값인 UDP를 사용하도록 한다.

 

dev tap : 앞의 서버와 동일하게 설정한다.

 

ifconfig 10.105.11.3 255.255.0.0 : VPN 클라이언트 PC에 할당할 IP를 지정한다.

 

ping 10
verb 4       
: 상호간에 망이 살아있는지 확인하기 위해 매 10초마다 ping을 발송한다. 로그 수준은 4로 지정한다.
 
comp-lzo : 서버에서 지정한대로 압축 알고리즘을 지정한다.

 

tls-client : SSL을 통한 클라이언트 역할을 하므로 tls-client라고 정의한다.
 
ca my-ca.crt
cert client.crt         
key client.key
: 서버에서 살펴본 바와 같이 CA와 클라이언트 키를 지정한다. 나머지는 앞에서 살펴본 내용과 동일하다.

 

설정이 끝난 후 PC에서 OpenVPN GUI를 실행하면 (화면 2, 3과) 같이 서버와 클라이언트 간에 VPN 연동이 되는 것을 알 수 있다. 

(화면 2)OpenVPN GUI를 통해 연결된 화면

 

(화면 3)VPN 연결 후 IP 할당 화면

 

설정이 끝나면 VPN에서 지정된 IP를 할당받게 되고, 비공인 VPN IP로 접속하면 VPN을 통해 안전하게 터널링돼 접속하게 된다. 이때의 VPN 트래픽은 암호화되고 터널링되므로 누군가가 중간에서 가로챘다 하더라도 패킷 내용을 해석할 수 없으므로 스니핑이 불가능하다. 한편, 패킷을 터널링하는 과정으로 인해 다소 속도가 저하될 수 있으나 거의 인지할 수 없는 수준이다.


VPN을 이용하면 패킷을 암호화하는 것뿐만 아니라 파이어월을 사용할 때도 매우 편리하다. 외국  출장 등을 이유로 외부에서 접속하더라도 VPN을 통하면 항시 고정된 IP를 사용할 수 있기 때문이다. 따라서 파이어월에서는 접속을 허용해야 할 사용자가 유동 IP를 사용하더라도 단 한 개의 UDP 포트만 허용하면 되기 때문에 보안과 편리함 모두를 만족시킬 수 있다.
지금까지 단순하면서도 가장 많이 사용하는 구조에서의 VPN 활용 방법에 대해 살펴봤다. VPN은 이외의 다양한 환경에서도 응용이 가능하므로 홈페이지를 통해 자세한 내용을 참고하기 바란다.

 

작성자 : 홍석범 | 오늘과 내일 차장

작성일 : 2006년 7월호

 

VPN(Virtual Private Network : 가상 사설망) 이 뭐죠?

 

인터넷으로 연결되지만 별도의 전용회선으로 연결된 것처럼 보이는 격리된 네트워크를 말한다. 따라서 비록 인터넷에 연결되어 있다 하더라도 그 VPN 구성원이 아닌 호스트/PC는 그 VPN에 소속된 호스트/PC와는 윈칙적으로 데이타를 교환할수 없다. 따라서 데이타 보안이 중요한 회사의 본 지사 간의 업무용 통신, 재택 근무 등에 많이 사용된다

 

VPN은 어떤 경우에 사용하나요?

  1. 해외에서 우리나라의 IP 주소를 받아 우리나라의 온라인 게임/사이트 (리니지, 열혈강호, 로한 등)를 접속하고 싶다.(일부 온라인 게임이나 사이트는 국내 IP인 경우만 접속을 허용하고 있다.).

  2. 지방/외국/집/지사에 출장을 가서도 회사의 (내 PC의) IP 주소를 사용하고 싶다.

  3. 집에 퇴근해서 집 PC에서 회사 PC의 하드 디스크에 들어있는 워드/엑셀 파일을 편집하고 싶다.(집 PC와 회사 PC 간에 파일/프린터 공유를 하고 싶다.)

  4. 집에서 재택근무를 하는데 회사 방화벽 내의 DB 서버에 접속해야 한다. 그런데 방화벽 담당자는 IP가 고정돼어 있어야 방화벽에서 그 IP를 통과 시켜줄 수 있다고 한다. 그런데 난 ADSL/케이블 유동 IP 사용자다.

  5. 난 공유기를 사용하는데 내가 사용하는 프로그램은 공인 IP(real IP/public ip) 여만 모든 기능을 사용 가능하다.(넷미팅에서 화상/음성 송수신, 스타 게임에서 방 만들기 등등) 공유기에 연결된 PC에서 공인 IP를 사용하고 싶다.

  6. 인터넷으로 어떤 게임을 하는데 그 게임에서는 같은 방에 들어오는 두 사람이 동일한 C Class IP 주소를 사용하면 안된다.(고스톱/포카 등) 내 친구랑 같은 ADSL 라인에 공유기를 연결해 두 대의 피시를 사용하는데 둘이가 다른 C Class IP를 받아 같은 방에 들어가 게임을 하고 싶다.

  7. 우리 회사/학교 방화벽에서는 p2p, 게임 등을 차단하고 있다. 방화벽에서 막은 사이트를 접속하고 싶다.

  8. 회사 메일 서버는 회사 내에서만(또는 메일서버에 등록된 IP 주소에서만) 접근이 가능하다. 그런데 지사/외부 거래처/직원집 에서도 회사 메일 서버를 사용하게 하고 싶지만 유동 IP 사용자라 IP가 자주 바뀌므로 메일서버에서 그 IP를 열어 줄 수가 없다.

  9. 회사 DB 서버/인트라넷 서버는 사설 IP를 사용하므로 회사 내에서만 접속이 가능하다. 재택근무를 하는 직원이나 거래처, 지사에서 회사 DB 서버/인트라넷 서버를 사용할 수 있게 하고 싶다.

  10. 본사 방화벽 내의 인사 관리 서버는 인사 담당자만 접속할 수 있어야 한다. 그런데 지사의 인사 담당자도 이 서버를 사용해야 하므로 지사의 IP 주소를 방화벽에서 인사 서버에 접속 가능하도록 열어 놓았다. 그러니까 지사의 다른 직원도 그 서버 내용을 볼수 있다. 지사에서 인사 담당자 PC 만 본사 IP를 사용하게 하고 그 IP에 대해서만 인사 관리 서버에 접속할 수 있게 하고 싶다.

  11. 지사에는 고정 IP 한 개에 공유기를 사용해 인터넷이 연결돼 있다. 그런데 본사에는 E-1 전용선을 사용해서 공인 IP를 많이 갖고 있다. 이 남는 공인 IP를 지사에서 사용하게 할수 있을까...

  12. 우리회사 본사와 연구소 모두 T-1 전용선을 사용하고 있는데 본사는 한국통신, 연구소는 하나로망을 사용한다. 그런데 해외 지사와 데이타 송수신시는 한국통신이 하나로보다 훨씬 빠르다. 연구소에서 해외지사를 연결할 때만 본사의 한국통신망을 이용하는 방법이 있을까?

  13. 우리 회사 웹서버는 한국의 IP 주소를 사용한다. 그리고 중국에 지사가 있는데 중국에서는 중국 지사에서 사용하는 IP 주소로 회사 웹서버를 연결하고 싶다.
  14. 고정 IP가 아닌 유동 IP 사용자이기 때문에 어떤 문제가 있다면 VPN으로 해결 가능하다. 왜냐하면 윈도우 PC에서 VPN 서버와 VPN을 구성하면 그 윈도우 PC에서 인터넷을 사용시는 윈도우 PC에 부여된 IP 주소(유동) 대신 VPN 서버에 부여된 또는 VPN 서버에서 할당한 IP 주소(고정)가 사용되기 때문이다.
  15. VPN 은 IP 주소의 지역적 한계 또는 물리적인 위치를 초월할 수 있다. 예를들어 ADSL 라인에 공유기를 연결하여 그 아래에 4 대의 PC를 연결해서 각 PC 의 IP 주소를 192.168.1.2, 192.168.1.3, 192.168.1.4, 192.168.1.5 로 부여했다고 하자.
  16. 그리고 VPN 서버가 한국통신, 데이콤, 하나로, 드림라인 등 4 군데에 설치되어 있다면 PC 1 번은 한국통신 VPN 서버로 , PC 2 번은 데이콤로, PC 3 번은 하나로 VPN 서버로, PC 4 번은 드림라인 서버로 연결한다.
  17. 이제 네 PC 는 외부의 인터넷 사이트를 접속할 때는 공유기에 부여된 IP 주소가 아닌 네 개의 전혀 다른 IP 주소를 사용한다. 하지만 공유기 밑에서 네 PC 끼리 상호 연결시는 192.168.1.x IP 주소가 그대로 사용된다. 즉 파일공유나 프린터공유를 하는데 아무런 지장이 없다.

VPN을 연결하려면 뭐가 필요하죠?

 

VPN을 구성하려면 VPN 서버와 VPN 클라이언트가 필요하다. 여기에서는 VPN 서버는 IDC에 설치되어 있는 라이브라 장비를 사용한다. (지원하는 VPN 프로토콜은 PPTP이다.)

VPN 클라이언트는 윈도우 사용자라면 윈도우에 기본으로 내장된 프로그램을 사용하면 된다. 모든 윈도우 PC에서 사용 가능한 VPN 프로토콜은 PPTP이다. PPTP는 Microsoft 사에서 제안한 VPN 프로토콜 이다.

리눅스랩에서 만드는 라이브라는 PPTP, IPSec, GRE, IPIP, CIPE, Layer 2 등의 VPN 프로토콜을 지원한다. 윈도우 XP는 PPTP외에도 L2TP/IPSec 등을 지원한다.

일부 공유기(라우터)는 ppTp client 기능이 있다. 즉 라이브라 ppTp 서버와 직접 연결이 가능하다. 단 고정 IP를 사용해야 한다. D-Link 사의 DI-604 모델이 그 예이다. 자세한 사항은 FAQ 를 참고하시오. <DI-604 매뉴얼>

 

= OpenVPN mini HOWTO =


== OpenVPN 소개 ==
VPN(Virtual Private Network:가상사설망)을 이용하는 여러 프로그램 중의 하나. IPSec(FreeS/WAN project)보다 간단하고 쉽게 할 수 있습니다.
2.0beta를 선택한 이유는 이전 버젼들이 다중접속을 지원하지 않기 때문입니다.

== 설치 ==
=== 준비할 패키지 ===
RedHat Linux 사용자는 위의 두 패키지를 RPM으로 설치하면 편리합니다.

1. OpenSSL 라이브러리. [http://www.openssl.org]
2. LZO 라이브러리 [http://www.oberhumer.com/opensource/lzo]

=== OpenVPN 설치 ===
1. OpenVPN 최신버젼을 [http://openvpn.sourceforge.net/beta/ 다운로드] 받습니다 (2004.04.20 현재 2.0-test23)
2. 적당한 곳에 압축을 풀고 들어갑니다
{{{
[root@odyssey root]# tar xzf openvpn-2.0_test23.tar.gz
[root@odyssey root]# cd openvpn-2.0_test23
}}}
3. 늘 하던 대로 컴파일 합니다. configure 할 때에 에러가 나오면 몇몇 더 필요한 프로그램들이 있을 수 있으니 그것들을 추가로 더 깔아 줍니다.
{{{
[root@odyssey openvpn-2.0_test23]# ./configure
......
[root@odyssey openvpn-2.0_test23]# make
......
[root@odyssey openvpn-2.0_test23]# make install
......
}}}
== 설정 ==
1. 설정파일이 들어갈 디렉토리를 만듭니다.
{{{
[root@odyssey openvpn-2.0_test23]# mkdir /etc/openvpn
[root@odyssey openvpn-2.0_test23]# cd /etc/openvpn
}}}
5. 설정파일을 다음과 같이 만듭니다.
{{{
[root@odyssey openvpn]# vi vpnserver.conf
###########################################################
# OpenVPN udp 다중 tap style 접속 서버 설정파일 예제 입니다.

port 50000
dev tap

# TLS parameters
tls-server
ca my-ca.crt
cert server.crt
key server.key
dh dh1024.pem

# multi-client udp 서버로 설정
mode server

# 서버의 가상 서브넷
ifconfig 10.8.0.1 255.255.0.0

# 클라이언트에 배정할 IP주소 (정상적으로 작동되는지 아직 확인을 못했음)
ifconfig-pool 10.8.0.4 10.8.1.255

# push route to client to bind it to our local virtual endpoint
# 라고 하는데 이것 역시 정상적으로 작동하는지 알 수 없음
push "route 10.8.0.1 255.255.255.255"

# 클라이언트가 반응 없는상태로 600초 자나면 끊어짐
inactive 600

# 서버에 권한 줄 필요 없음
user nobody
group nobody

# 로그를 자세히
verb 4
}}}
6. 키를 생성한다. 우선 테스트만을 위해서 OpenVPN에서 샘플로 제공하는 키를 이용하도록 하겠습니다. 실제 서비스를 할 때는 OpenSSL 을 이용해서 키를 생성해야 합니다.
{{{
[root@odyssey openvpn]# cp ~/openvpn-2.0_test23/sample-keys/* ./
}}}
7. 설정파일에 파일 이름이 my-ca.crt my-ca.key로 되어 있으니 편의상 맞춰 줍니다
{{{
[root@odyssey openvpn]# mv tmp-ca.crt my-ca.crt
[root@odyssey openvpn]# mv tmp-ca.key my-ca.key
}}}
8. 서비스를 시작해 봅니다
{{{
[root@odyssey openvpn]# openvpn --config vpnserver.conf --daemon
}}}
9. 정상적으로 실행되었는지 확인 해 봅니다.
{{{
[root@Eso-ns0 openvpn]# ps ax
......
[root@Eso-ns0 openvpn]# netstat -na
......
[root@Eso-ns0 openvpn]# tail -n 100 /var/log/messeges
......
}}}

== MS-Windows 2000/XP 클라이언트 설정 ==
(생략)
{{{
port 50000
dev tap
remote vpn5.esocom.com

tls-client
ca my-ca.crt
cert client.crt
key client.key

verb 4
}}}
== 테스트 ==
클라이언트(윈도우)에서 시작->실행을 하거나 윈도우키+R 을 누른 다음
{{{
ping -t 10.0.0.1 }}} 을 입력해서 쌍방향 소통이 되면 연결완료!

== OpenSSL 키 생성 ==
kldp에서 [http://wiki.kldp.org/wiki.php/DocbookSgml/SSL-Certificates-HOWTO SSL Certificates HOWTO] 문서와 [http://wiki.kldp.org/wiki.php/DocbookSgml/SSL-RedHat-HOWTO#SSL-REDHAT-HOWTO-3 Building a Secure RedHat Apache Server HOWTO]를 참조하였습니다.
1. /usr/share/ssl/openssl.conf 파일 수정
2. /usr/share/ssl/misc/CA.pl 파일 실행
{{{
# CA.pl -newca }}}
3. 루트 인증 기관 인증서(Root Certification Authority Certificate) 만들기
{{{
# openssl req -nodes -new -x509 -keyout my-ca.key -out my-ca.crt -days 365 }}}
4. 서버용 키쌍 생성
{{{
# openssl req -nodes -new -keyout server.key -out server.csr
# openssl ca -out server.crt -in server.csr }}}
5. 클라이언트용 키쌍 생성
{{{
# openssl req -nodes -new -keyout client.key -out client.csr
# openssl ca -out client.crt -in client.csr }}}
6. 주의하실 점은 (당연하겠지만) 서버키쌍의 정보/서명과 클라이언트키쌍의 정보/서명이 달라야 합니다.
8. 생성된 클라이언트키쌍을 클라이언트에 복사를 합니다.
7. Diffie Hellman parameters 생성
{{{
# openssl dhparam -out dh1024.pem 1024}}}

Posted by 불량소금
,