본문 바로가기
네트워크 (LAN,WAN)

[리눅스] OpenVPN을 이용한 VPN 구현

by 날으는물고기 2009. 1. 7.

[리눅스] OpenVPN을 이용한 VPN 구현

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

 

 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은 이외의 다양한 환경에서도 응용이 가능하므로 홈페이지를 통해 자세한 내용을 참고하기 바란다.


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

원   문 : http://www.ionthenet.co.kr/newspaper/view.php?idx=11247



OpenVPN 에 대한 참고 글

http://j2k.naver.com/j2k_frame.php/korean/kano.feena.jp/?OpenVPN

http://j2k.naver.com/j2k_frame.php/korean/www.komoto.org/vpn/openvpn.html

간단한 예

  1. 회사(학교) 네트워크는 방화벽 안에 있다
  2. 사무실의 1194/udp 포트는 외부에서 접근 가능하다
  3. 방화벽에서 192.168.0.0 네트워크는 신뢰하고 있다
  4. 사무실과 집의 컴퓨터는 tun (터널링)을 지원한다
  5. 사무실과 집의 컴퓨터는 같은 내용의 static.key 를 가지고 있다
  6. 사무실과 집의 컴퓨터는 192.168.0.1 과 192.168.0.2 로 PeerToPeer 연결하는 한가지 예이다. 사무실의 VPN 서버를 여러대의 클라이언트를 거느릴 수 있도록 하기위해서는 PeerToPeer 연결이 아닌 넷 마스크 구성을 하여야 한다

사무실 설정

# mkdir /etc/openvpn
# cd /etc/openvpn
# openvpn --genkey --secret static.key

생성된 static.key 파일은 집에도 복사해둔다

office.conf:

port 1194
proto udp
dev tun
ifconfig 192.168.0.1 192.168.0.2
up ./office.up
secret static.key
user nobody
group nobody
ping 60
ping-restart 300
ping-timer-rem
persist-tun
persist-key
verb 3

office.up:

#!/bin/sh
route add -net 192.168.0.0 netmask 255.255.255.0 gw $5

집 설정

home.conf:

port 1194
proto udp
dev tun
remote a.b.c.d
ifconfig 192.168.0.2 192.168.0.1
up ./home.up
secret static.key
user nobody
group nobody
ping 60
ping-restart 300
ping-timer-rem
persist-tun
persist-key
verb 3

remote a.b.c.d 에서 a.b.c.d 는 사무실의 인터넷 주소다. ifconfig 부분이 사무실 설정과 약간 다르다. static.key 는 미리 가져다 두어야 한다.

home.up:

#!/bin/sh
route add -net 192.168.0.0 netmask 255.255.255.0 gw $5
728x90

댓글