[보안] 브리짓(bridge) 기반의 OpenVPN 구축하기
필요한 소스파일을 아래 사이트에서 다운 받도록 한다.
http://openvpn.net/ (openvpn-2.0.9.tar.gz)
http://www.oberhumer.com/opensource/lzo/ (lzo-2.02.tar.gz)
http://linux-net.osdl.org/index.php/Main_Page (bridge-utils-1.2.tar.gz)
1. 먼저 OpenVPN설정파일(스크립트 및 인증서 키)을 저장할 디렉토리를 생성한다.
[root@vpn /]# cd /etc
[root@vpn etc]# mkdir openvpn
2. lzo설치
[root@vpn home]# tar xvfz lzo-2.02.tar.gz
[root@vpn home]# cd lzo-2.02
[root@vpn lzo-2.02]# ./configure
[root@vpn lzo-2.02]# make;make install
3. bridge-utils설치 (만약 브릿지 모드를 사용하지 않는다면 설치할 필요없음)
[root@vpn home]# tar bridge-utils-1.2.tar.gz
[root@vpn bridge-utils-1.2]# autoconf
[root@vpn bridge-utils-1.2]# ./configure
[root@vpn bridge-utils-1.2]# make;make install
아래와 같이 브릿지 시작 스크립트를 “/etc/openvpn/bridge-start” 파일로 생성후 퍼미션을 755로 설정한다.
#!/bin/bash
#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################
# Define Bridge Interface
br=”br0″
# Define list of TAP interfaces to be bridged,
# for example tap=”tap0 tap1 tap2″.
tap=”tap0″
# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
eth=”eth1″ # 일반적으로 내부 인터페이스
eth_ip=”192.168.8.4″ # 내부인터페이스의 설정된 IP값
eth_netmask=”255.255.255.0″ # 내부네트워크의 넷마스크 값
eth_broadcast=”192.168.8.255″ # 내부네트워크의 브로드캐스트 값
for t in $tap; do
openvpn –mktun –dev $t
done
brctl addbr $br
brctl addif $br $eth
for t in $tap; do
brctl addif $br $t
done
for t in $tap; do
ifconfig $t 0.0.0.0 promisc up
done
ifconfig $eth 0.0.0.0 promisc up
ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast
아래와 같이 브릿지 정지 스크립트를 “/etc/openvpn/bridge-stop” 파일로 생성후 퍼미션을 755로 설정한다.
#!/bin/bash
####################################
# Tear Down Ethernet bridge on Linux
####################################
# Define Bridge Interface
br=”br0″
# Define list of TAP interfaces to be bridged together
tap=”tap0″
ifconfig $br down
brctl delbr $br
for t in $tap; do
openvpn –rmtun –dev $t
done
4. OpenVPN 설치
[root@vpn home]# tar xvfz openvpn-2.0.9.tar.gz
[root@vpn openvpn-2.0.9]# ./configure
[root@vpn openvpn-2.0.9]# make;make install
[root@vpn openvpn-2.0.9]# cd plugin/auth-pam/
[root@vpn auth-pam]# make
[root@vpn auth-pam]# cp openvpn-auth-pam.so /usr/lib # linux shell 계정을 통한 인증시 필요
[root@vpn auth-pam]# cd ../../sample-scripts
[root@vpn sample-scripts]# cp openvpn.init /etc/init.d/openvpn
[root@vpn sample-scripts]# cd /etc/init.d
[root@vpn init.d]# vi openvpn
——————–중략—————————–
# Location of openvpn binary
openvpn=””
openvpn_locations=”/usr/local/sbin/openvpn”
for location in $openvpn_locations
do
if [ -f “$location” ]
then
openvpn=$location
fi
done
——————–중략—————————–
# See how we were called.
case “$1” in
start)
/etc/openvpn/bridge-start >/dev/null 2>&1 # 브릿지 모드 사용시
echo -n $”Starting openvpn: ”
/sbin/modprobe tun >/dev/null 2>&1
——————–중략—————————–
stop)
echo -n $”Shutting down openvpn: ”
for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
if [ -s $pidf ]; then
kill `cat $pidf` >/dev/null 2>&1
fi
rm -f $pidf
done
# Run shutdown script, if defined
if [ -f $work/openvpn-shutdown ]; then
$work/openvpn-shutdown
fi
success; echo
rm -f $lock
/etc/openvpn/bridge-stop >/dev/null 2>&1 # 브릿지 모드 사용시
;;
——————–중략—————————–
[root@vpn init.d]# chkconfig –add openvpn # 서비스 목록에 등록
[root@vpn init.d]# chkconfig –level 3 openvpn # 시스템 시작시 자동실행
5. 인증서 키 생성
[root@vpn openvpn-2.0.9]#cd easy-rsa
[root@vpn easy-rsa]# vi vars
우선 vars 라는 파일을 열어 제일 아래쪽에 있는 변수를 수정한다.
# These are the default values for fields
# which will be placed in the certificate.
# Don’t leave any of these fields blank.
export KEY_COUNTRY=KR
export KEY_PROVINCE=CHUNGBUK
export KEY_CITY=CHEONGJU
export KEY_ORG=”NEXASOFT”
export KEY_EMAIL=”root@nexa.co.kr”
[root@vpn easy-rsa]# . vars # 환경변수 설정
[root@vpn easy-rsa]# ./clean-all # 기존 열쇠들을 지운다
[root@vpn easy-rsa]# ./build-ca # ca.crt 와 ca.key를 생성
[root@vpn easy-rsa]# ./build-key-server server # Server.crt 와 server.key 생성
[root@vpn easy-rsa]# ./build-dh # dh1024.pem 생성
[root@vpn easy-rsa]# ./build-key [username] # 사용자 개별인증서 생성시에 사용
만들어진 열쇠들을 한번 살펴보자 (OpenVPN HOWTO에서 가져왔습니다.)
Filename Needed By Purpose Secret
ca.crt server + all clients Root CA certificate NO
ca.key key signing machine only Root CA key YES
dh{n}.pem server only Diffie Hellman parameters NO
server.crt server only Server Certificate NO
server.key server only Server Key YES
user.crt user only user Certificate NO
user.key user only user Key YES
[root@vpn easy-rsa]# mv keys /etc/openvpn # 생성된 인증서 키를 /etc/openvpn으로 이동
6. OpenVPN 설정파일 생성
[root@vpn easy-rsa]# cd /etc/openvpn
[root@vpn openvpn]# vi openvpn.conf
port 1194 # openvpn 접속포트
proto udp # 사용 프로토콜 설정, 일반적으로 UDP를 사용한다.
dev tap0 # 브릿지 모드 사용시 반드시 tap다바이스로 설정
# 인증서 키 파일의 위치를 정확하게 지정한다.
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
ifconfig-pool-persist ipp.txt
# 브릿지 모드 사용시 IP자동할당 영역지정 (로컬아이피피는 반드시 내부인터페이스 값을 설정)
server-bridge 192.168.50.10 255.255.255.0 192.168.50.51 192.168.50.100
client-to-client # client간의 통신을 허용한다.
duplicate-cn # client중복 접속을 허용한다.
keepalive 10 120
comp-lzo # 압축전송을 지원한다.
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
log-append openvpn.log
verb 3
plugin /usr/lib/openvpn-auth-pam.so login # 리눅스 쉘 계정을 통한 인증을 허용한다.
client-cert-not-required # 사용자 인증서를 요청하지 않는다.
username-as-common-name
7. OpenVPN 실행
[root@vpn openvpn]# /etc/rc.d/init.d/openvpn start