2013年4月28日

Tomato OpenVPN Server Connect By Android Phone

最近將分享器裝上Tomato firmware後,想讓它成為VPN Server方便在外面使用不安全的wifi上網時,可以連回家中的網路再出去,或是讓手機去撥VPN連回家中,Android手機預設有support PPTP、L2TP/IPSec的VPN撥號,但若要support SSL VPN的話,要另外裝OpenVPN for Android這個app才能連線,但對於VPN來說,SSL VPN的listen port可以改為TCP 443 port避過一些有限制的網路使用,使用上較有彈性,優缺點可以參考這裡有說明

下面為在Tomato(VPN Server)與Android Phone(VPN Client)使用OpenVPN的方法
(研究了三天才實作出來0rz....)
Step 1:先建立OpenVPN所需的Root CA、Server Key、Client Key、Diffie Hellman參數
這個部分需要一台有安裝OpenVPN軟體的電腦來建立這些東西,我是在Linux上建立這些東西,沒有Linux機器的人,也可以利用Windows電腦裝OpenVPN來建立這些東西
# apt-get install openvpn 安裝OpenVPN套件
#cd /usr/share/doc/openvpn/examples/easy-rsa/2.0 利用easy-rsa來建立相關的CA & KEY
#vi vars  修改CA範例檔部分參數
export KEY_COUNTRY="TW"
export KEY_PROVINCE="Taiwan"
export KEY_CITY="自行設定"
export KEY_ORG="自行設定"
export KEY_EMAIL="自行設定"

Step 2:Linux上執行vars來建立相關檔案
#Source ./vars
#./clean-all  先清空此台Linux上的所有key
#./build-ca   建立CA
#./build-key-server YourServer(名稱自訂)建立server憑證
#./build-key Yourclient(名稱自訂)建立Client憑證
#./build-dh(安全性愈高製作時間愈久)Diffie Hellman參數

Step 3:分享器Tamoto UI裡面,點選VPN Tunnelling-->OpenVPN Server
依順序設定如下,其中Advanced頁面中的Custom Configuration額外再輸入
script-security 3
auth-user-pass-verify /etc/verify.sh via-env






















key頁面中填入(Linux中可用cat ca.crt來查看內容)
Certificate Authority:貼入ca.crt裡面的內容
Server Certificate:貼入server.crt裡面的內容
Server Key: 貼入server.key裡面的內容
Diffie Hellman parameters:貼入dh1024.pem裡面的內容
設定好後,記得存檔後,將分享器給Reboot

Step 4:UI中打開 JFFS功能,要將Script寫入裡面JFFS磁碟裡
telnet先連入Tomato中,輸入以下Script
cd /etc
cat > /etc/generate.sh <#!/bin/sh
HASHPASS=\`echo -n "\$1\$2" | md5sum | sed s'/\  -//'\`
i=0
while [ \$i -lt 10 ]; do
  HASHPASS=\`echo -n \$HASHPASS\$HASHPASS | md5sum | sed s'/\  -//'\`
  i=\`expr \$i + 1\`
done
echo \$1:\$HASHPASS
exit 1
EOF

chmod 755 /etc/generate.sh
nvram setfile2nvram /etc/generate.sh

cat > /etc/verify.sh <#!/bin/sh
# echo "\${username}"
hash=\`/etc/generate.sh "\${username}" "\${password}"\`

USERS=\`cat /etc/vpnusers\`
for u in \$USERS; do
  test "\${hash}" == "\${u}" && exit 0
done
exit 1
EOF

chmod 755 /etc/verify.sh
nvram setfile2nvram /etc/verify.sh

測試建立VPN撥入帳號
/etc/generate.sh YourAccount YourPassword >> /etc/vpnusers
nvram setfile2nvram /etc/vpnusers
試Script是否OK可運作
export username=YourAccount
export password=
YourPassword
/etc/verify.sh
echo $?

若出現0是運作正常,若出現1則有問題
存檔後,再Reboot

Step 5:設定手機上面的VPN Client,點下面的 + 建立新連線





此部分要加入在先前Linux機器上產生的 Root CA、Client crt、Client key 與在Tomato上面建立的vpnusers帳密
用手重輸入的DNS 的方式來設定 Dns

這個勾選才才會將手機的流量全導到 Vpn來再出去


成功建立SSL VPN後會上面會有key鎖頭符號出現

測試一下VPN Link後的Traceroute
















Step 6:檢查分享器上已有成功VPN Client連入的上線記錄


參考資料
http://openvpn.net/index.php/open-source/documentation/howto.html#pki
http://todayguesswhat.blogspot.tw/2011/03/quick-simple-vpn-setup-guide-using.html
http://benjr.tw/node/725#vpn

2 回應:

林昭伶 提到...

請問TOMATO的VPN帳號密碼要在哪邊設定?

happylucky 提到...

Create account in Linux System when you make CA Client Key

Copyright © 2009 New Life in Taipei All rights reserved. Theme by Laptop Geek. | Bloggerized by FalconHive.