TomatoUSb Shibby:OpenVPN client設定、及依IP來源或是目的地 來決定是否走VPN、或是一般網路

2010年買的RT-N16,至今仍舊在服役中,不過在現今的環境中,已經無法啟用QoS,一啟用QoS後,下載速度最大只能在60M左右,關掉後能達到100M;
在換掉RT-N16前,還是要對他做最大利用。
最近買了VPN服務,總共買了二個,皆標榜終身有效 (不過個人覺得能用二年就不錯了;畢竟要讓終身使用權無效的手段多得是) 分別是:





PureVPN:59 USD$,終身使用權(每5年要更新)網址:https://stacksocial.com/sales/lifetime-of-purevpn
VPN Unlimited:39 USD$, 終身使用權網址:https://stacksocial.com/sales/vpn-unlimited-lifetime-subscription

以上二個網頁可利用無痕式視窗,再取得10%折扣的優惠碼,亦即再打9折。
我先買了VPN Unlimited,它VPN到日本有點怪怪的,後來在朋友推荐下,又買了PureVPN,經測發現二者各有優缺點:




其中OpenVPN允許你將VPN設定在Tomato Firmware上,如此一來,家中的所有連線,皆會經由VPN出去。
但是家中的環境,畢竟不可能全部的連線皆經VPN出去,一來速度太慢,二來Router可能撐不住、另外如果要用P2P之類的protocol,VPN大部份是不支援的,故設想中的VPN使用方式如下:



Client 1 & 2使用一般的連線,而Client 3使用VPN

下面依序列出在RT-N16中,使用Tomato Shibby的Firmware的步驟:

1、此文章使用的Firmware 為132的版本 (2015年10月),另外,由於會使用到不少的NVRAM空間,故不能使用AIO的版本,我後來是使用「tomato-K26USB-1.28.RT-MIPSR2-132-VPN」這個版本,升級時清除NVRAM (注意:所有的設定皆要重設) 後,約有9K多的空間可用,光在這邊,因NVRAM空間不夠的問題,就花了不少時間。因為之前都是使用AIO版的,不過其實很多功能都用不到,降成這版本後,約可多出2K的空間,目前設完後約有3K空間可用,方便以後加rule使用。

簡單的來說,NVRAM就是TomatoUSB存設定的地方,你在設定界面中的任何設定或是Script、OpenVPN的Key,都是靠NVRAM在存,一旦空間不足,RT-N16就會怪怪的,這時整個RT-N16重設較快。

整個VPN設定約要用掉5.5K的NVRAM

2、設定PureVPN,並測試連線
要分流流量前,要先確定VPN網路是有通的!!

這部份有官方文件教你如何設:https://support.purevpn.com/setup-openvpn-on-tomato-router
But but but....設好後根本能用,VPN一連線後,整個外網就不通了。我還去問客服,對方叫我改伺服器位址,原本是:
jp1-ovpn-udp.purevpn.net

改成:
jp-tk1-ovpn-udp.pointtoserver.com

結果然是沒用,後來看了一下教學網址下的留言,測一測終於通了,白白又花了我二天!!

基本上的設定都如教學網頁,測試VPN時,我的設定頁面如下:
Firewall設Automatic
Create NAT on tunnel打開



Redirect Internet Traffic打開
自訂設定中輸入如下資料:

log /tmp/purevpnudp.log
comp-lzo
verb 4
persist-key
persist-tun
tls-client




教學文件中教你把client.crt整個複製貼上到Client Certificate,那是沒作用的,請從  -----BEGIN CERTIFICATE-----那段開始複製


如此的設定後終於通了,但是這並不是我要的結果,我想要特定的client才需要從VPN出去

3、設定DHCP配發固定IP給特定裝置
通常我們可以每台Client設定固定IP,然後在Router的Routing table中設定該IP的走向即可,但是我懶得每一台裝置設固定IP,所以我在TomatoUSB上動手腳,設定要走VPN的裝置,其DHCP要到的IP是固定的,設法如下:

在Device List中,找到要設為固定ip的裝置,點一下其 static 連結



設定要結的IP和要在TomatoUSB界面中要顯示的裝置名稱,按ADD,然後按Save存檔
以後該裝置的DHCP,一律會配設定的IP給它



4、DNS設定
不確定DNS這部份是不是有影響,不過我有設定就是了,在試著VPN連線時試了不少東西,這部份後來就沒拿掉了

設定DNS為8.8.8.8和8.8.4.4


關掉內部DNS



5、開始設定分流
PureVPN連線後,給的Routing感覺就是有問題,Routing這方面我不是很懂,不過如果一旦套用伺服器給的Routing後,外網連線就會出問題,完全出不去。
在第二項時測試連線成功後,基本上可以確定VPN是可用的,再來要改成可分流:設法如下;首先先更改OpenVPN設定:


Firewall用custom



Redirect Internet Traffic不勾
自訂參數改為如下:

log /tmp/purevpnudp.log
comp-lzo
verb 4
persist-key
persist-tun
tls-client
route-nopull




再來的設定是Google來的,先設定Firewall rule
如下圖的位置,填上:

iptables -I FORWARD -i br0 -o tun11 -j ACCEPT
iptables -I FORWARD -i tun11 -o br0 -j ACCEPT
iptables -I INPUT -i tun11 -j REJECT
iptables -t nat -A POSTROUTING -o tun11 -j MASQUERADE





接著切換到WAN那一頁,填入:
請注意192.168.1.60及192.168.1.64是我自己設定要走VPN的IP,請自行調整。
另外,原始的Script只有Sleep 30秒,我這改成60

sleep 60
ip route flush table 200
ip route flush cache
ip rule add from 192.168.1.60 lookup 200
ip rule add from 192.168.1.64 lookup 200
VPN_GW=`ifconfig tun11 | awk '/inet addr/ {split ($2,A,":"); print A[2]}'`
ip route add table 200 default via $VPN_GW dev tun11



如果要設定到哪個IP或是IP網段要走VPN,而不是看來源的話,指令如下:

到某個IP一律走VPN
ip rule add to 203.209.152.1 lookup 200

到某網段 (255.255.255.0) 一律走VPN
ip rule add to 203.209.152.1/24 lookup 200

這幾天設下來看,通常設定Rule為目的IP時,問題較多


下例為驗証設定目的IP的VPN正不正確:




這些設定全會佔用NVRAM,請注意不要把NVRAM塞爆了!!

設好後,在二個Client中看IP在哪區,下方表示設定是成功的:



鎖IP的網頁能正常開啟



如此一來大功告成!!系統會自行判斷要走一般路徑還是VPN出去

運作原理
我沒有全了解,不過基本上沒指定的話,會走一般路由:



另一張Routing table:




再來看一下IP Rule:
這邊就很清楚了,目前我設定了三筆規則,這三筆要看名為200的Routing Table;而從上圖中可看到,該Table中就一筆資料,所以直接從該Gateway出去了



如果Rule設錯,可用以下指令刪除:
ip rule del prio [number]
[number]就是前面的序號


至於Firewall中的四行:
iptables -I FORWARD -i br0 -o tun11 -j ACCEPT
iptables -I FORWARD -i tun11 -o br0 -j ACCEPT
iptables -I INPUT -i tun11 -j REJECT
iptables -t nat -A POSTROUTING -o tun11 -j MASQUERADE


1,2 --> br0和tun11可互通
3 --> 從tun11進來的主動流量Drop掉
4 --> 讓使用內部網段的裝置與外網連線,需設定防火牆IP偽裝 (IP masquerading),把來自內網的位址,換成防火牆的外部 IP 位址 (此為 tun11)




更好的方法:
請參考:http://www.linksysinfo.org/index.php?threads/route-only-specific-ports-through-vpn-openvpn.37240/#post-205781
不過我設不起來就是了....







留言

這個網誌中的熱門文章

Google瀏覽器發生「錯誤107 (net::ERR_SSL_PROTOCOL_ERROR): SSL 通訊協定錯誤」的解決方式

Cacti 簡單自製圖表詳解