OpenVPN을 이용한 VPN 환경 구축
OpenVPN은 오픈 소스 프로그램으로 가상 사설망을 구축할 수 있는 소프트웨어다. 이와 비슷한 프로토콜로 PPTP와 L2TP/IPsec이 있다. 최근의 추세는 IPsec 혹은 OpenVPN 중 하나로 구축하는 것 같다. IPSec은 하드웨어 장비를 통해서 구현하는 경우가 많은데, 음.. 글쎄 돈이 남아돌지 않는다면 굳이 IPSec 기반으로 구현할 필요가 있을까 라는 생각을 해본다.
OpenVPN은 SSL기반의 VPN으로 openssl라이브러리를 사용한다.
위의 그림은 OpenVPN 서버와 클라이언트에 tun 디바이스가 만들어지고, 이 디바이스를 이용해서 10.8.0.0 주소영역을 가지는 사설망이 만들어 진것을 보여준다.
TUN방식은 다음과 같은 장점을 가진다.
- 네트워크 디바이스를 생성함으로써, 네트워크 구조가 명확하고 비교적 안정적으로 작동한다는 장점을 가진다.
- 고정 IP를 할당할 수 있어서 위치에 관계 없이 안정적으로 사설망을 유지할 수 있도록 한다.
- 사설망을 위한 DHCP, 네임서버를 구축할 수 있다.
기본 원리
VPN은 물리적으로 떨어져 있는 두개의 네트워크를 가상의 네트워크로 묶는 개념이다. 두개 이상의 네트워크를 하나의 네트워크처럼 보이게 하려면 어떻게 해야 할까 ? Tunnel(터널)을 뚫으면 된다.
아래와 같이 간단하게 설명할 수 있다.
- 10.10.0.0/16 네트워크와 10.50.0.0/16 네트워크가 internet(public network)를 사이에 두고 서로 떨어져 있다. 이들 네트워크는 사설 네트워크이기 때문에 트래픽을 전달할 수 없다.
- 하지만 사설 네트워크에는 internet으로 트래픽을 보내기 위한 gateway가 있을 것이고, 이들은 public ip를 가지고 있을 것이다.
두 개의 사설 네트워크가 gateway를 통해서 연결이 되므로, 원칙적으로 사설 네트워크 끼리 통신이 가능하다.. 편지를 보내는 것처럼, 패킷을 한번 더 싸서 보내면 된다.
- 10.10.5.7 호스트가 10.50.50.2 호스트로 데이터를 보내려고 한다.
- 이 패킷의 src ip는 10.10.57.7 dst ip는 10.50.50.2 다.
- 패킷이 vpn 서버로 전달되면, vpn 서버는 public ip로 패킷을 둘러싼다. VPN 서버는 호스트가 보낸 패킷을 데이터로 하는 TCP/IP 패킷을 만든다.
- 이 패킷은 인터넷을 가로질러서 목적지까지 도착한다.
- 목적지의 vpn 서버는 패킷을 깐다.
- 패킷을 까면 원래 보내고자 하는 패킷이 나오고, 목적지 호스트로 전달할 수 있다.
- 응답 패킷은 정확히 반대의 과정을 거친다.
- 실제로는 더 복잡한 과정을 거치지만 이 정도면 알고 있으면, 쉽게 응용할 수 있다.
VPN 구성
아래는 VPN 를 구축한 사례다. eth0 네트워크 디바이스를 사용하는 222.x.189.97 이라는 공인IP 로 등록된 vpn 서버 1대가 있고, 내부방으로 구성된 2대의 서버가 추가적으로 있는 상태다. eth1 네트워크 디바이스를 이용해서 내부네트워크와 통신을 하고있다.
외부 클라이언트 가 내부네트워크 서버에 ssh 및 ftp 등 접근시도를 할려면 vpn 서버를 통하여 접근시도하는 방법밖에는 없는 상태라고 가정하고 구축을 해보도록 하겠다.
OpenVPN 서버 설치
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은 OpenSSL› 라이브러리를 사용한다. 이를 위해서 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
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 서버의 리눅스 사용자 계정 정보를 입력하면 접근할수 있다.