강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
OpenVPN을 이용한 VPN 환경 구축
조회 : 22,128  


1.OpenVPN을 이용한 VPN 환경 구축

OpenVPN은 오픈 소스 프로그램으로 가상 사설망을 구축할 수 있는 소프트웨어다. 이와 비슷한 프로토콜로 PPTP와 L2TP/IPsec이 있다. 최근의 추세는 IPsec 혹은 OpenVPN 중 하나로 구축하는 것 같다. IPSec은 하드웨어 장비를 통해서 구현하는 경우가 많은데, 음.. 글쎄 돈이 남아돌지 않는다면 굳이 IPSec 기반으로 구현할 필요가 있을까 라는 생각을 해본다.

OpenVPN은 SSL기반의 VPN으로 openssl라이브러리를 사용한다.



캡처.JPG

위의 그림은 OpenVPN 서버와 클라이언트에 tun 디바이스가 만들어지고, 이 디바이스를 이용해서 10.8.0.0 주소영역을 가지는 사설망이 만들어 진것을 보여준다.



TUN방식은 다음과 같은 장점을 가진다.

  • 네트워크 디바이스를 생성함으로써, 네트워크 구조가 명확하고 비교적 안정적으로 작동한다는 장점을 가진다.

  • 고정 IP를 할당할 수 있어서 위치에 관계 없이 안정적으로 사설망을 유지할 수 있도록 한다.

  • 사설망을 위한 DHCP, 네임서버를 구축할 수 있다.

1.1 기본 원리

VPN은 물리적으로 떨어져 있는 두개의 네트워크를 가상의 네트워크로 묶는 개념이다. 두개 이상의 네트워크를 하나의 네트워크처럼 보이게 하려면 어떻게 해야 할까 ? Tunnel(터널)을 뚫으면 된다.



아래와 같이 간단하게 설명할 수 있다.



  • 10.10.0.0/16 네트워크와 10.50.0.0/16 네트워크가 internet(public network)를 사이에 두고 서로 떨어져 있다. 이들 네트워크는 사설 네트워크이기 때문에 트래픽을 전달할 수 없다.

  • 하지만 사설 네트워크에는 internet으로 트래픽을 보내기 위한 gateway가 있을 것이고, 이들은 public ip를 가지고 있을 것이다.



두 개의 사설 네트워크가 gateway를 통해서 연결이 되므로, 원칙적으로 사설 네트워크 끼리 통신이 가능하다.. 편지를 보내는 것처럼, 패킷을 한번 더 싸서 보내면 된다.


1.2 VPN 구성

아래는 VPN 를 구축한 사례다. eth0 네트워크 디바이스를 사용하는 222.x.189.97 이라는 공인IP 로 등록된 vpn 서버 1대가 있고, 내부방으로 구성된 2대의 서버가 추가적으로 있는 상태다. eth1 네트워크 디바이스를 이용해서 내부네트워크와 통신을 하고있다.

외부 클라이언트 가 내부네트워크 서버에 ssh 및 ftp 등 접근시도를 할려면 vpn 서버를 통하여 접근시도하는 방법밖에는 없는 상태라고 가정하고 구축을 해보도록 하겠다.

캡처1.JPG



1.3 OpenVPN 서버 설치

1.3.1 CentOS

CentOS 6.3을 기준으로 한다. centos는 EPEL레포지토리를 등록해야 한다.

wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -Uvh epel-release-6-8.noarch.rpm
yum install openvpn -y



키 관리를 도와주는 easy-rsa를 따로 설치해야 한다.

yum install easy-rsa -y



easy-rsa 파일들을 /etc 밑에 복사한다.

mkdir /etc/openvpn/easy-rsa

cp -rf /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa



OpenVPN은 Open SSL 라이브러리를 사용한다. 이를 위해서 openssl 설정파일을 만들어야 하는데, 미리 만들어져 있는 예제 설정파일을 복사해서 사용하면 된다. openssl 버전에 맞는 파일을 사용하자. "최대한 편하고 쉽게!!!" easy-rsa를 설치한 이유다.

cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf



easy-rsa 디렉토리 밑에 있는 vars 파일을 편집한다. 다른 건 수정할 필요 없다. "KEY_"로 시작하는 변수들만 수정하자.

# vi /etc/openvpn/easy-rsa/vars

대략 아래와 같은 환경변수들을 수정하면 된다.

export KEY_COUNTRY="US"
export KEY_PROVINCE="NY"
export KEY_CITY="New York"
export KEY_ORG="Organization Name"
export KEY_EMAIL="administrator@example.com"
export KEY_CN=droplet.example.com
export KEY_NAME=server
export KEY_OU=server



var를 적용하고, key를 빌드하기 시작한다. key 를 생성하게되면 현재 디렉토리에서 keys  라는 디렉토리가 생성된다.

cd /etc/openvpn/easy-rsa

chmod +rwx *
source ./vars
./clean-all
./build-ca

OpenVPN 서버에 필요한 키를 생성하기 위한 CA를 만든다.

./build-key-server server

[OpenVPN 클라이언트 사용자 키 추가]

##### 사용자별로 키 값을 생성해야된다. 접속하는 사용자가 10명이면 10개의 사용자 키 생성 해야됨.

VPN 을 사용할 클라이언트의 사용자 키를 만들어 줍니다. 이것 역시 서버키 생성과 마찬가지로 마지막 물어보는 2가지 항목에서 y 를 눌러 동의 하고 넘어 갑니다.

./build-key dslee



이제 최종적으로 pem 파일을 만들어 줍니다.

./build-dh




1.4 OpenVPN 서버 설정

이제 남은 건 설정파일이다. OpenVPN을 소개하는 책이 따로 출판되었을 정도로 OpenVPN은 많은 기능을 제공한다. 여기에서는 TUN 디바이스를 이용해서 step 3 VPN 환경 구축을 할 것이다.



vi /etc/openvpn/server.conf



아래내용 추가

###################################################

port 1194

proto tcp

dev tun

ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt

cert /etc/openvpn/easy-rsa/2.0/keys/server.crt

key /etc/openvpn/easy-rsa/2.0/keys/server.key # This file should be kept secret

dh /etc/openvpn/keys/dh2048.pem

server 10.8.0.0 255.255.255.0

ifconfig-pool-persist ipp.txt

push "redirect-gateway def1 bypass-dhcp"

push "dhcp-option DNS 168.126.63.1"

push "dhcp-option DNS 168.126.63.2"

client-to-client

keepalive 10 120

comp-lzo

plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-pam.so login

user nobody

group nobody

persist-key

persist-tun

status openvpn-status.log

log /var/log/openvpn.log

verb 9

mute 10

crl-verify /etc/openvpn/keys/crl.pem

##########################################################



crl-verify 파일 생성

vi /etc/openvpn/keys/crl.pem



-----BEGIN X509 CRL-----

MIIB6TCB0jANBgkqhkiG9w0BAQQFADCBojELMAkGA1UEBhMCVVMxCzAJBgNVBAgT

AkNBMRUwEwYDVQQHEwxTYW5GcmFuY2lzY28xFTATBgNVBAoTDEZvcnQtRnVuc3Rv

bjERMA8GA1UECxMIY2hhbmdlbWUxETAPBgNVBAMTCGNoYW5nZW1lMREwDwYDVQQp

EwhjaGFuZ2VtZTEfMB0GCSqGSIb3DQEJARYQbWFpbEBob3N0LmRvbWFpbhcNMTQx

MjE4MTMwMzQ1WhcNMTUwMTE3MTMwMzQ1WjANBgkqhkiG9w0BAQQFAAOCAQEADMuN

+z/F7fDQU/fgvHoOh1Mn/TQPf8CN/ITfSCOrNqQORCxqSMp2rf3YhRhOnClvzYTC

wjDr04lwWWhkbKzhRBH10zTP92EC9qk9Y379f9NLilhRmv6pxbItLZQmJxR9p9kB

0SynSaiHUu6X9mLbZ3Z3OYtmPIJI51KFmtpwM1OH++8qs/j9ZA+g9tqzU30Sn6LI

wpZc5jRJ7oBDwVtOe+rfDxfMe16pJW5bchjNKPneM5jXFyMDIIWJYVdXJpfS4i6m

r+iXENUmQqTJ4zUNqtbuFLWWGp5T7JFvSuxYgWW5/ULwXzL6Z0hYhN0VbfaxFghm

7cQmfXwnc4tuTTMefg==

-----END X509 CRL-----



추가 하도록 한다.



[OpenVPN 서버 실행]



OpenVPN 서버를 서비스에 등록 후 실행 합니다.



chkconfig --add openvpn

chkconfig --level 23456 openvpn



/etc/init.d/openvpn start

openvpn을 시작 중: [ OK ]

netstat -ant | grep 1194



tcp 0 0 0.0.0.0:1194 0.0.0.0:* LISTEN



[iptables 방화벽 설정]

#################################

*nat

:PREROUTING ACCEPT [21:1472]

:POSTROUTING ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A POSTROUTING -d 192.168.95.0/24 -o eth1 -j MASQUERADE

-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

COMMIT

#################################

추가



##########################################

#-A FORWARD -j REJECT --reject-with icmp-host-prohibited

#########################################

이부분은 주석처리 및 제거



[OpenVPN 클라이언트 설정]



리눅스 서버에서 생성한 사용자 키 ca.crt, dslee.crt, dslee.key 3가지 파일을 안전하게 윈도우로 다운로드 하여 윈도우용 OpenVPN 이 설치된 경로인 C:\Program Files\OpenVPN\config 에 넣어 줍니다.

클라이언트 설정파일을 C:\Program Files\OpenVPN\sample-config 에 가서 client.ovpn 파일을 config 폴더로 복사 해옵니다.



client.ovpn 파일을 열어서 아래 내용은 추가하도록 한다.



##################################

client

remote 222.x.189.97 1194

proto tcp

dev tun

ca   ca.crt

cert dslee.crt

key  dslee.key

ns-cert-type server

comp-lzo

auth-user-pass

persist-key

persist-tun

nobind

resolv-retry infinite

verb 3

mute 10  

################################



클라이언트에서 openvpc-gui 를 실행한후에 connect 를 실행하면, 사용자 id & pw 입력하라는 창이 나타나게 되는데, vpn 서버의 리눅스 사용자 계정 정보를 입력하면 접근할수 있다.




마치며..


OpenVPN 를 이용하여 VPN 환경을 구축하였다. 요즘은 스위치 및 공유기 등에서 VPN 이 지원되기 때문에 구지 이렇게 까지 서버단에서 구성하고 할 필요는 없을수 있지만, 리눅스 운영체제에서도 충분히 효율적으로 운영관리할수있다는 것을 경험하기 위해서 이번에 살펴보는 시간을 가졌다.  무엇보다 비용을 지불하지 않고, 오픈소스를 이용하여 구축하였고, 큰 규모의 사내인프라에서는 문제가 될수있겠지만, 중&소규모에서는 무난하게 사용할수있지 않을까 생각 된다.



작성자 : 서비님(dslee@linux.co.kr)



[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1862


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
서비님
dslee골벵이linux.co.kr