2008년 6월 29일

DD-WRT에 openvpn 서비스 설치하기 - PKI방식

Prepared by ChangHunLee KPMG IT Advisory Service.
Date : 2008-06-28

Part1 openvpn with PKI
DD-Wrt로 핵펌된 라포네라에 openvpn서비스를 실행하여 외부에서 내부망을 접속하거나 내부망의 Gateway를 이용해서 다양한(?) 응용을 할 수 있다.
물론 openvpn을 용량이 4mega인 linksys wrt54g에도 서비스 할수 있다. 하지만 이경우는 PKI방식을 사용할 경우 startup script에 대해 용량문제가 발생할수 있다.

**주의: 반드시 작업을 하기 전에 공유기의 NTP 서버와 PC의 NTP 서버를 맞추여야 한다. 그렇지 않으면 인증오류가 난다.

Part1-1. Jffs2 Enable
Openvpn 패키지 설치 전에는 반드시 jffs2 파티션을 활성화해서 공간을 확보한다.
dd-wrt의 웹 관리 화면의 administration에 보면 아래와 같이 jffs2 support를 enable하도록 하자. 그러면 현재 Total/Free Size가 표시된다. (Router를 reboot해야 한다.)공간이 준비가 되었으면 Openvpn관련 패키지를 설치한다.


Part1-2. openvpn 패키지 설치
우선 putty를 이용해 dd-wrt에 ssh로 접속한다.
필자는 Lafonera를 여러대 가지고 있으므로 192.168.0.102로 설정해 놓았지만 일반적으로 192.168.1.1로 접속한다. ID/패스워드는 변경하지 않았다면 root/admin 이다.
(!보안을 위해 반드시 패스워드는 변경하도록 하자.)

접속후에는 openvpn서비스에 필요한 패키지들을 설치한다.
그림에서 보면 /jffs 파티션이 생겼음을 알수 있다.

아래 명령어를 순서대로 수행해 openvpn관련 패키지를 jffs파티션에 설치한다.

cd /tmp
wget http://ipkg.k1k2.de/packages/libopenssl_0.9.8e-3_mips.ipk
ipkg -d /jffs/ install libopenssl_0.9.8e-3_mips.ipk
rm libopenssl_0.9.8e-3_mips.ipk
wget http://ipkg.k1k2.de/packages/openssl-util_0.9.8e-3_mips.ipk
ipkg -d /jffs/ install openssl-util_0.9.8e-3_mips.ipk
rm openssl-util_0.9.8e-3_mips.ipk
wget http://ipkg.k1k2.de/packages/liblzo_2.02-1_mips.ipk
ipkg -d /jffs/ install liblzo_2.02-1_mips.ipk
rm liblzo_2.02-1_mips.ipk
wget http://ipkg.k1k2.de/packages/openvpn_2.0.9-2_mips.ipk
ipkg -d /jffs/ install openvpn_2.0.9-2_mips.ipk
rm openvpn_2.0.9-2_mips.ipk
wget http://ipkg.k1k2.de/packages/openvpn-easy-rsa_2.0.9-2_mips.ipk
ipkg -d /jffs/ install openvpn-easy-rsa_2.0.9-2_mips.ipk
rm openvpn-easy-rsa_2.0.9-2_mips.ipk


Jffs를 확인해보면 용량이 줄었음을 알수 있다.


Part1-3 Openvpn Startup script만들기

vi /jffs/usr/sbin/openvpn-stop

#!/bin/sh
/usr/bin/killall -q openvpn
/usr/sbin/brctl delif br0 tap0
/jffs/usr/sbin/openvpn --rmtun --dev tap0

vi /jffs/usr/sbin/openvpn-start

#!/bin/sh
/jffs/usr/sbin/openvpn --mktun --dev tap0
/usr/sbin/brctl addif br0 tap0
/sbin/ifconfig tap0 0.0.0.0 promisc up
/jffs/usr/sbin/openvpn --config /jffs/etc/openvpn/config.conf

mkdir /jffs/etc/config/
vi /jffs/etc/config/openvpn.startup

#!/bin/sh
/jffs/usr/sbin/openvpn-stop
/jffs/usr/sbin/openvpn-start

chmod 755 /jffs/usr/sbin/openvpn-stop
chmod 755 /jffs/usr/sbin/openvpn-start
chmod 700 /jffs/etc/config/openvpn.startup


Part1-4 PKI설정하기(Key,Crt파일생성)

아래 명령어들을 실행하여 각 파일들내의 부분을 아래와 같이 변경한다.
mkdir /jffs/etc/easy-rsa/keys
vi /jffs/etc/easy-rsa/vars

주: KEY_SIZE를 2048로 하면 상당한 시간이 소요된다.

# easy-rsa parameter settings
export EASY_RSA="/jffs/etc/easy-rsa"
export KEY_CONFIG=`/jffs/usr/sbin/whichopensslcnf $EASY_RSA`export KEY_SIZE=1024



vi /jffs/usr/sbin/build-dh
. /jffs/etc/easy-rsa/vars

vi /jffs/usr/sbin/build-ca
"/jffs/usr/sbin/pkitool" --interact --initca $*



vi /jffs/usr/sbin/pkitool
. /jffs/etc/easy-rsa/vars


/jffs/usr/sbin/build-dh


/jffs/usr/sbin/build-ca


vi /jffs/usr/sbin/build-key-server
"/jffs/usr/sbin/pkitool" --interact --server $*


touch /jffs/etc/easy-rsa/keys/index.txt
echo "01" > /jffs/etc/easy-rsa/keys/serial
/jffs/usr/sbin/build-key-server VPN-Server



vi /jffs/usr/sbin/build-key
"/jffs/usr/sbin/pkitool" --interact $*


/jffs/usr/sbin/build-key VPN-Client1
/jffs/usr/sbin/build-key VPN-Client2



mkdir /jffs/etc/
mkdir /jffs/etc/openvpn/
vi /jffs/etc/openvpn/certificados.conf

*TCP로 서비스하는경우
daemon
port 443
proto tcp-server
tls-server
dh /jffs/etc/easy-rsa/keys/dh1024.pem
ca /jffs/etc/easy-rsa/keys/ca.crt
cert /jffs/etc/easy-rsa/keys/VPN-Server.crt
key /jffs/etc/easy-rsa/keys/VPN-Server.key
dev tap0
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
comp-lzo
verb 3



rm /jffs/etc/openvpn/config.conf
ln -s /jffs/etc/openvpn/certificados.conf /jffs/etc/openvpn/config.conf

Part1-5 실행 및 접속하기

* 서버에서 openvpn실행
/jffs/etc/config/openvpn.startup

*참고
/jffs/usr/sbin/openvpn-stop
/jffs/usr/sbin/openvpn-start


“ps grep openvpn” 명령으로 openvpn 서비스 실행을 확인


아래의 파일을 Client로 복사합니다.(안전한 방법으로전송해야겠죠?)
"ca.crt" "VPN-Client1.crt" and "VPN-Client1.key"

아래는 Client접속 스크립트입니다.

remote IP_address_for_vpn
port 443
proto tcp-client
tls-client
ca ca.crt
cert VPN-Client1.crt
key VPN-Client1.key
dev tap0
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
comp-lzo
verb 3
Openvpn-Gui로 연결하면 아래와 같이 연결됩니다.


이제 openvpn으로 외부에서 집컴퓨터의 사설망으로 접속이 가능하다.

** 만일 회사의 방화벽등을 우회하기 위해서 모든 트래픽을 openvpn을 통해서 전송하고 싶다면. 아래와 같은 client script를 사용한다. (맨아래 두줄이 다르다)

remote IP_address_for_vpn
port 443
proto tcp-client
tls-client
ca ca.crt
cert VPN-Client1.crt
key VPN-Client1.key
dev tap0
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
comp-lzo
verb 3
route-gateway 192.168.0.1
redirect-gateway

감사합니다.

댓글 없음: