[보안] OpenVPN을 통한 VPN 환경 구축하기 – 아랑
######### 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 환경 구축에 대해 설명을 마친다.