2011年4月8日星期五

推薦使用chnroutes取代SSH翻牆

最近開始用chnroutes在Mac下搭配PPTP VPN了,用起來效果相當好。 
http://code.google.com/p/chnroutes/

原理: 
它是透過APNIC公開的資料庫找出所有大陸地區的IP網段,然後透過ip-up ip-down腳本,在連上VPN之後自動將這些大陸IP網段設置走預設路由(例如電信ADSL網關或公司網關), 而其余的IP網段則走VPN網關,在VPN斷線之後這些路由調整又會自動改回來,一切非常自動化。 

優點: 
不 需要使用SSH翻牆了。SSH翻牆使用socks5 proxy容易產生一些問題,例如有些軟件對socks5 proxy支持不好(例如iTunes跟Mailplane),或有bug, 就會經常出現一些怪毛病,或者需要維護gfwList或pac文檔,相當痛苦。此外SSH tunnel預設只能有10個sessions(MaxSessions 10), 如果有10個TCP連線沒有完全關閉,新的連線就必須排隊等候了,著名的polipo軟件可以將socks5 proxy轉成http proxy, 但是偶爾會發現polipo對HTTP連線沒辦法完全close的問題,因此就會用盡MaxSessions造成卡住, 你只能乖乖重啟ssh tunnel或靠autossh監測到問題自動重啟,其實一切都很糟糕, 根本不需要這麼辛苦。

缺點: 
缺 點要分兩種來說,PPTP VPN的缺點是他是IP層的VPN, 需要router支持PPTP pass-through同時要打開IP port 1723的支持。很多老舊的分享器或是ISP router可能不允許PPTP的穿透,但是如果支持穿透的話,理論上並發的session數量以及效能會比SSH好。 

OpenVPN 則是使用TCP或UDP層來封裝,好處是可以把OpenVPN server listen在TCP:443, 一般網路幾乎不會阻擋TCP:443, 缺點是很多作業系統幾乎沒有原生支持OpenVPN, 換句話說OpenVPN是userland的VPN, 需要裝軟件,甚至OpenVPN服務器需要為每一個用戶產生key pair, 操作上會比較麻煩,但是穿透性會比PPTP VPN好。 

DNS劫持有解嗎?
Mac 上面預設都有安裝named(bind9), 開啟VPN之後只要把named跑起來,把DNS指向127.0.0.1, 就幾乎可以不用擔心DNS劫持了,同時還可以享受國內大網站的CDN加速功能。而SSH socks5 proxy有些軟件可能對remote socks5 DNS resolve支持不夠好,例如Chrome (see http://code.google.com/p/chromium/issues/detail?id=29914),或Safari根本也不支持remote socks proxy resolve, 所以用SSH proxy反而有可能會有DNS劫持的風險。 

需要經常更新國內IP列表嗎?
理論上是不需要的,可能幾個月APNIC才會更新一小部分,如果你是技術狂熱者,你可以每天check這個URL的HTTP ETag header, 一旦有變化的話就第一時間post到twitter, 我相信你的twitter會被一堆人RT的 :-)

可能存在的影響 :
1. 如果你是BT愛好者,使用這個方法之後可能對國外的peers做內容交換的時候會比較不順,因為等於是你under在VPN這個IP Masquerade NAT下面了,但是對國內peers做內容交換則沒有影響。 

經測試,開chnroutes狀態下,跑Mac的easymule使用VeryCD的ed2k資源,2M ADSL可以跑到180-200K/s下行,因為VeryCD peers都在國內,而國內連接就不會走VPN, 因此影響就很小。 

不過如果你是用BT第一時間追美劇的狂熱者,因為交換源很多都來自國外,所以可能會有影響,變成只能跟國內的peers交換(即使如此,還是有可能可以用盡所有下行帶寬的,所以其實不用太擔心)。 

2. VPN/VPS流量會比較高,loading也許會比較重,但我認為VPS loading變重之前,VPN link的payload太高可能早就斷線了,所以幾乎不用擔心造成server impact問題。

使用之後有什麼改變? 
1. 完全不用建立SSH proxy/tunnels了, autossh也bye-bye了。 
2. 丟掉gfwList以及switchy proxy這些東西了 
3. 不需要修改hosts了 
4. 不需要維護pac了 
5. dropbox完全恢復正常飛快運行了 
6. 各種twitter client都不用設置API proxy了 
7. 如果你过去在mac下面写python urllib需要用SocksiPy翻墙,现在可以comment off了。
8. deploy GAE上去却经常被GFW给TCP RESET,即使设定了pac也没用? 以后再也不会了!
9. 所有軟件都運行更穩了。 

Mac OS X下面怎麼運行named? 
OSX不知道從哪一個版本開始就一直有預裝named的,只是開機不會跑起來。如果你的OSX下面有 /etc/named.conf 那恭喜你你電腦已經有named了,你需要的就是把它跑起來: 

啟動指令: 
$ sudo launchctl load /System/Library/LaunchDaemons/org.isc.named.plist 
這樣就可以叫起named, 之後一開機也會跑起來了。 

測試: 
$ nslookup www.taobao.com 127.0.0.1 
如果會傳回結果,就表示named可以用了,接下來你需要的就是到OSX的VPN網路設置那邊,加上一個DNS叫127.0.0.1, 這樣一來只要播上VPN, 第一個首選的DNS就是127.0.0.1了。 

路由器可以直接運行chnroutes嗎?
可以的,請參考這個autoddvpn project


FAQ
Q: 我使用了VPN也自己跑了named, 但是還是被DNS劫持(污染)了,怎麼辦?
A: 先開VPN再開named就可以解決, 或是用這裡提供的方法清除一下DNS cache

Q:我使用SSH翻牆可以直接運行ip-up ip-down腳本打到同樣效果嗎?
A:不行, SSH提供的是socks5 proxy 不算是VPN, 而chnroutes是連上VPN之後修改OS路由表的方式達成

Q: 為什麼Dropbox搭配SSH翻牆效果很差?
A: 因為SSH翻牆是socks5 proxy, 對於Dropbox需要大量使用HTTP操作的,socks5 proxy的效能會很差,而且容易反復失敗重連,浪費效能。改用chnroutes或autoddvpn這樣的解決方案就沒問題了。

Q:我覺得翻牆好煩,給我一個最一勞永逸的完美方法,我不想折騰了!
A:直接弄一台autoddvpn路由器吧,裝上就搞定!

没有评论:

发表评论

WorldTimeServer Clock

New York

Blog Archive

搜索此博客