Posted on 2009/02/25 13:53
Filed Under 리눅스기술문서/서버관련 조회수: view 12481

######### openvpn 구축하기 ###############################################

작성자 : 서 진우 (alang@syszone.co.kr)
작성일 : 2008년 3월 1일

수정일 : 2008년 2월 25일
==========================================================================

외부에서 방화벽에 의해 차단된 회사나 연구실 내에 시스템으로 안전한 방법으로
접근하기 위해 OpenVPN을 사용할 수 있다.

본 문서는 OpenVPN 서버를 통해 VPN 환경을 구축하는 방법에 대해 설명한다.

1. OpenVPN 서버 설치

openvpn 환경을 구축하기 위해서는 아래와 같은 패키지를 설치해야 한다.

openvpn -> http://www.openvpn.net
lzo -> http://dag.wieers.com/packages/lzo
lzo-devel -> http://dag.wieers.com/packages/lzo
lzo 패키지는 VPN 접속 시 패킷의 암호화 압축에 사용된다.

본 패키지 설치는 서버/클라이언트 모두 동일하다. 윈도우 클라이언트의 경우
http://www.openvpn.se/files/install_packages/
에서 윈도우용 Openvpn을 설치하면 된다.
본 테스트에는 openvpn-2.0.7-gui-1.0.3-install.exe 파일을 사용하였다.

- lzo 설치

# rpm -Uvh lzo-1.08-4.2.el4.rf.x86_64.rpm
# rpm -Uvh lzo-devel-1.08-4.2.el4.rf.x86_64.rpm

- openvpn 설치

# wget http://openvpn.net/release/openvpn-2.0.9.tar.gz
# rpmbuild -tb openvpn-2.0.9.tar.gz
# rpm -Uvh /usr/src/redhat/RPM/x86_64/openvpn-2.0.9-1.x86_64.rpm

- 인증서 생성

# cd /usr/share/doc/openvpn-2.0.9/easy-rsa/

# vi vars
-------------------------------------------------------------------
.
.
export KEY_COUNTRY=KR   
export KEY_PROVINCE=NA
export KEY_CITY=SEOUL
export KEY_ORG="syszone.co.kr"
export KEY_EMAIL="
alang@syszone.co.kr"
-------------------------------------------------------------------

# . vars

# ./clean-all
기존에 생성된 인증서가 있을 경우 삭제한다.

# ./build-ca
인증서를 생성한다.

/usr/share/doc/openvpn-2.0.9/easy-rsa/keys 디렉토리에 ca.key(개인키),ca.crt(공개키)
가 생성된다.
ca.crt파일은 모든 클라이언트에 배포. ca.key는 서버만 가지고 있으면 된다.

- OpenVPN 서버키 생성

# ./build-key-server server
전부 기본 값으로 진행한다. 그럼 keys 디렉토리에 server.crt, server.csr, server.key
가 생성된다. 모두 OpenVPN 서버 설정에 사용된다.

- OpenVPN 클라이언트 키 생성

# ./build-key <client_name>

서버키 생성 시와 동일한 질문을 한다. Common Name은 <client_name>과 동일하게
입력한다.

keys 디렉토리에 <client_name> 으로 crt, key 파일이 생성된다.

여러 클라이언트가 존재할 경우 같은 key로 접속은 가능하나, 클라이언트 개별 관리
를 위해 별도 key를 생성해 주는 것을 권장한다.


- Diffie Hellman 파라메터 생성(암호화에 필요)

# ./build-dh 
keys 디렉토리에 dh1024.pem 파일이 생성된다.

2. OpenVPN 설정

- OpenVPN 서버 설정

# cd /usr/share/doc/openvpn-2.0.9/easy-rsa/
# vi server.conf
--------------------------------------------------------------------------
port 1194
proto tcp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
server 192.168.111.0 255.255.255.0 # Client에 배포되는 IP Subnet
ifconfig-pool-persist ipp.txt 0

;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
;push "redirect-gateway"
;push "dhcp-option DNS 10.8.0.1"
;push "dhcp-option WINS 10.8.0.1"

client-to-client # client 간의 통신 가능
duplicate-cn
# The keepalive directive causes ping-like
# messages to be sent back and forth over
# the link so that each side knows when
# the other side has gone down.
# Ping every 10 seconds, assume that remote
# peer is down if no ping received during
# a 120 second time period.
keepalive 10 120

# Enable compression on the VPN link.
# If you enable it here, you must also
# enable it in the client config file.
comp-lzo

# The maximum number of concurrently connected
# clients we want to allow.
max-clients 10
persist-key
persist-tun
status /var/log/openvpn-status.log
log         /var/log/openvpn.log
log-append  /var/log/openvpn-new.log
verb 3

# Silence repeating messages.  At most 20
# sequential messages of the same message
# category will be output to the log.
;mute 20
plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so login
;client-cert-not-required   # 사용자 인증서를 요청하지 않는다.
;username-as-common-name
-----------------------------------------------------------------------

# zip openvpn_server_key.zip server.* ca.* dh1024.pem
# cp openvpn_server_key.zip /etc/openvpn
# cd /etc/openvpn
# unzip openvpn_server_key.zip

openvpn_server_key.zip 파일은 OpenVPN 서버 복구 시 사용할 수 있게 백업해둠.

# /etc/rc.d/init.d/openvpn start
# ifconfig
.
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00 
          inet addr:192.168.111.1  P-t-P:192.168.111.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)


- OpenVPN 리눅스 클라이언트 설정

# cd /usr/share/doc/openvpn-2.0.9/easy-rsa/
# vi client.conf
-----------------------------------------------------------------------
client
dev tun
proto tcp
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert <client_name>.crt
key <cluent_name>.key
comp-lzo
verb 3
remote <VPN서버IP> 1194
auth-user-pass # 사용자 계정/암호 인증 -> 기본 시스템 계정 사용
------------------------------------------------------------------------

# cp client.conf client.ovpn

client.ovpn 파일은 윈도우 클라이언트 설정 파일
client.conf 파일은 리눅스 클라이언트 설정 파일

# zip vpn_client_key_linux.zip client.conf ca.crt <client_name>.*
# zip vpn_client_key_win.zip client.ovpn ca.crt <client_name>.*

# cp vpn_client_key_linux.zip /etc/openvpn
# unzip vpn_client_key_linux.zip

# /etc/rc.d/init.d/openvpn start 
------------------------------------------------------------------------------
openvpn을 시작 중: Enter Auth Username: <- OpenVPN 서버에 시스템 계정 입력
Enter Auth Password: <- 해당 계정의 패스워드 입력
                                                           [  OK  ]
------------------------------------------------------------------------------

# ifconfig
-----------------------------------------------------------------------------
.
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00 
          inet addr:192.168.111.6  P-t-P:192.168.111.5  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
-----------------------------------------------------------------------------

- 윈도우 클라이언트 설정

openvpn-2.0.7-gui-1.0.3-install.exe 설치
시작 -> 프로그램 -> OpenVPN -> Open VPN configuration file directory 선택

사용자 삽입 이미지


vpn_client_key_win.zip 파일을 해당 디렉토리에 복사한다.
현재 디렉토리에 압축 풀기를 한다.

사용자 삽입 이미지


작업표시창에 트레이아이콘에 오른쪽 마우스키를 클릭한후 connect 실행
시스템 계정과 패스워드를 입력하면 접속이 된다.

사용자 삽입 이미지
사용자 삽입 이미지

사용자 삽입 이미지


- OpenVPN 방화벽 설정

OpenVPN 서버에서 간단한 방화벽 설정을 한다.

.
iptables -A INPUT -p tcp --dport 1194 -m limit --limit 1/m -j LOG --log-prefix "VPN connect: "

-> VPN 접속 패킷이 들어오는 경우 /var/log/message 파일에 "VPN Connect" 이름의
로그를 생성한다.

iptables -A INPUT -p tcp -s 192.168.111.0/24 --dport 22 -j ACCEPT

-> VPN 클라이언트에서 VPN 서버의 22번 포트 접근 허용

iptables -A INPUT -p tcp  --dport 1194 -j ACCEPT

-> VPN 포트 허용

iptables -t nat -A POSTROUTING -s 192.168.111.0/255.255.255.0 -j MASQUERADE

-> VPN 클라이언트에서 인터넷 공유 기능 허용


3. VPN 사용 현황 파악

openvpn 서버에서 아래 명령 수행

# /etc/rc.d/init.d/openvpn status

그럼 /var/log/openvpn.log 에 OpenVPN CLIENT LIST 관련 로그가 생성된다.

# tail -f /var/log/openvpn.log
------------------------------------------------------------------------------
Wed Feb 25 13:47:02 2009 OpenVPN CLIENT LIST
Wed Feb 25 13:47:02 2009 Updated,Wed Feb 25 13:47:02 2009
Wed Feb 25 13:47:02 2009 Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
Wed Feb 25 13:47:02 2009 alang03,123.xxx.xxx.xxx:50081,6954,7348,Wed Feb 25 13:36:42 2009
Wed Feb 25 13:47:02 2009 client,123.xxx.xxx.xxx:43584,19972,20988,Wed Feb 25 12:55:09 2009
Wed Feb 25 13:47:02 2009 ROUTING TABLE
Wed Feb 25 13:47:02 2009 Virtual Address,Common Name,Real Address,Last Ref
Wed Feb 25 13:47:02 2009 192.168.111.10,client,123.xxx.xxx.xxx:43584,Wed Feb 25 12:55:10 2009
Wed Feb 25 13:47:02 2009 192.168.111.6,alang03,123.xxx.xxx.xxx:50081,Wed Feb 25 13:37:57 2009
Wed Feb 25 13:47:02 2009 GLOBAL STATS
Wed Feb 25 13:47:02 2009 Max bcast/mcast queue length,0
Wed Feb 25 13:47:02 2009 END
-----------------------------------------------------------------------------

현재 alang03, client 란 이름의 클라이언트에서 VPN 접속 중에 있는 것을 알수 있다.

이로써 OpenVPN을 이용한 VPN 환경 구축에 대해 설명을 마친다.


 

Writer profile
author image
-아랑 -
2009/02/25 13:53 2009/02/25 13:53

트랙백 주소 : 이 글에는 트랙백을 보낼 수 없습니다

About

by 서진우
Twitter :@muchunalang

Counter

• Total
: 4315409
• Today
: 1217
• Yesterday
: 1625