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

감사합니다.

2008년 6월 28일

폰공유기 핵펌 Part 2-2 Flashing Legend Firmware

이번에는 Legend firmware로 핵펌해보자

pc의 아이피를 아래와 같이 바꾼다.

tftpd32.exe를 실행한다. 다운로드 받을 파일이 같은 디렉토리에 있으면 된다. 실행후 ip는 192.168.1.166을 선택한다.


putty를 이용해 telnet 접속을 port9000으로 한다. 접속대상 ip는 192.168.1.254

아래의 명령어를 순서대로 입력한다. Continue(y/n)이 나오면 ‘y’를 입력한다.
주 : fis command는 시간이 조금 소요된다.(1-10분정도)

ip_address -l 192.168.1.254/24 -h 192.168.1.166
fis init



load -r -v -b %{FREEMEMLO} openwrt-atheros-2.6-root.jffs2-64k


fis create -f 0xA8030000 -l 0x006F0000 rootfs
이명령어는 10-20분정도 시간이 소요된다. 작업이 완료되고 나서도 output이 없을수도 있으니, 파워를 끄거나 세션을 종료하지 말자.


load -r -v -b %{FREEMEMLO} openwrt-atheros-2.6-vmlinux.lzma






fis create -r 0x80041000 -e 0x80041000 vmlinux.bin.l7



reset command로 reset한다.

legend ssid로 연결하고, 브라우저에서 192.168.1.1로 web management화면으로 접속한다.



아래와 같은 에러 메시지가 나타날 경우는 telnet으로 접속해서 (ssh는 default root 패스워드가 없으므로접속이 불가능하다)

webif를 재설치 해야 한다.



webif 패키지를 설치하기 위해 순서대로 아래 명령어를 입력한다.
기존의 webif를 삭제한다.

ipkg remove webif


ipkg install http://downloads.x-wrt.org/xwrt/kamikaze/7.09/atheros-2.6/packages/webif_0.3-8_mips.ipk

webif를 재설치 하면 아래와 같은 legend 초기 화면을 볼 수 있다

다음에는 DD-WRT에 openvpn서비스를 올려 실제로 응용(?)하는 방법에 대해 알아보자

폰공유기 핵펌 Part 2-1 Flashing DD-WRT Firmware

RedBoot과 ssh를 활성화 시켰으니 이제 본격적으로 DD-WRT펌웨어를 핵펌해보자.


pc의 아이피를 아래와 같이 바꾼다.


tftpd32.exe를 실행한다. 다운로드 받을 파일이 같은 디렉토리에 있으면 된다. 실행후 Server interface에 192.168.1.166을 선택한다.



putty를 이용해 telnet 접속을 port9000으로 한다. 접속대상 ip는 192.168.1.254



아래의 명령어를 순서대로 입력한다. Continue(y/n)이 나오면 ‘y’를 입력한다.
주 : fis command는 시간이 조금 소요된다.(1-10분정도)


ip_address -l 192.168.1.254/24 -h 192.168.1.166
fis init


load -r -v -b 0x80041000 root.fs


fis create -b 0x80041000 -f 0xA8030000 -l 0x002C0000 -e 0x00000000 rootfs


load -r -v -b 0x80041000 vmlinux.bin.l7
fis create -r 0x80041000 -e 0x80041000 -l 0x000E0000 vmlinux.bin.l7
fis create -f 0xA83D0000 -l 0x00010000 -n nvram
reset


펌웨어 flashing이 완료되었다. reset이 완료되고 브라우저를 통해 192.168.1.1로 접속하면dd-wrt web interface를 볼수 있다.

Part-2-2에서는 Legend Firmware 적용에 대해서 소개하겠다.

폰공유기 핵펌 Part 1 - ssh Enable & RedBoot Enable

라포네라의 펌웨어를 해킹하기 위해서는 먼저 ssh를 활성화 시키고 RedBoot에 접근가능하게 해야 한다.

Part 1 - ssh Enable & RedBoot Enable

공유기와 유선으로 연결한다. ip설정은 아래처럼

브라우저를 통해 169.264.255.1 으로 접속해서 Fon router의 버전을 확인한다.

버전이 0.7.1 r1 이면 ssh를 활성화 시킨다.
첨부의 sshenable.htm을 실행시키고 id:root pwd:admin을 입력한다.


ssh가 활성화 되었으면 redboot작업을 한다.
HFS.exe를 실행하고 서비스 ip를 169.254.255.2로 변경한다.
openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma와 out.hex 파일을 서버에 추가한다.

ssh client(putty)를 이용해 fon router로 접속한다.
Ip: 169.254.255.1 port : 22

잠재적 보안 위험이라는 alert가 드는데.. ssh로 처음 접속시에 나오는 메시지이므로 그냥 예를 누른다.


root/admin 을 입력하고 로그인한다.

로그인 후에는 아래와 같은 명령어를 순서대로 실행한다. 각 라인마다 따로따로 실행한다.

mv /etc/init.d/dropbear /etc/init.d/S50dropbear

주 : sshd서비스를 지속적으로 활성화하기 위한 명령어


cd /tmp
wget
http://169.254.255.2/openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma
mtd -e vmlinux.bin.l7 write openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma
vmlinux.bin.l7reboot





router가 reboot되면서 putty창이 종료될 것이다. 치명적에러가 나오더라도 ‘예’를 누르고 reboot이 완료될때까지 1-2분정도 기다린다.
reboot이 완료되면 putty를 이용해 root/admin으로 접속하여 아래의 명령을 실행한다.

cd /tmp
wget
http://169.254.255.2/out.hex
mtd -e "RedBoot config" write out.hex "RedBoot config”
reboot



RedBoot작업이 끝났으므로 이제 우리는 bootloader에 접근할수 있으므로, 이제 펌웨어를 업데이트 할수 있다.

part2에서는 DD-WRT와 Legend 펌웨어를 적용하는 방법을 소개한다.