autoddvpn—DD-WRT自動翻牆解決方案
autoddvpn是從chnroutes啟發而來的解決方案。它讓DD-WRT路由器可以達成類似chnroutes的效果,讓路由器下面的所有上網設備包括Windows, Mac, iPhone, iPad都可以透明翻牆,不需要任何安裝或設置。換句話說,您所需要做的,就是裝上路由器,打開電源,然後所有電腦就仿佛在牆外一般,完全感覺不到牆的存在。
為什麼要用這個解決方案呢?
- 你想直接在無線路由器翻牆,只要一打開就全家翻牆,什麼都不用安裝設定,一勞永逸
- 你不是技術geek, 你沒時間去研究翻牆技術,你只想按下電源開關,然後統統搞定,就像喝水一樣簡單
我已經有SSH翻牆方案了,為什麼我還要autoddvpn?
這裡有一份推薦使用chnroutes取代SSH翻牆的介紹文章請點這裡, autoddvpn繼承了chnroutes的設計概念,達到chnroutes同樣的效果。
需要環境:
- 支持PPTP或OpenVPN client的DD-WRT路由器
- 一個PPTP或OpenVPN帳號
- ADSL或DHCP上網環境
- 不需要安裝任何軟件
注意:
- 目前只支持DD-WRT
了解更多
项目地址:http://code.google.com/p/autoddvpn/
http://code.google.com/p/autoddvpn/downloads/list
“autoddvpn_update.png update script for graceMode+OpenVPN 44 hours ago 44 hours ago 53.0 KB ”
(你好)
感谢支持呀。
-HOWTO – autoddvpn – DD-WRT自動翻牆解決方案 – Google Project Hosting
https://code.google.com/p/autoddvpn/wiki/HOWTO
“HOWTO
Updated Nov 2, 2010 by pahud…@gmail.com
Introduction
這份文件說明如何設置 autoddvpn 環境
Details
autoddvpn目前有三種運行模式,各有不同的優缺點,大家可以選擇適合的模式來運行:
wget遠程腳本模式
jffs模式
custom firmware自制韌體模式
wget遠程腳本模式
autoddvpn開機之後,藉由rc_firewall腳本來執行wget取得遠程腳本來運行,這是最早期autoddvpn開發的模式
優點:只需要在ddwrt的web界面設定即可,技術門檻最低。
缺點:存在一些已知的問題,可能會有不穩定的情況。
jffs模式
將所需要執行的腳本放入/jffs/可寫入的filesystem裡面,並且定義rc_startup使其一開機就能自動執行
優點:同時具備升級的彈性以及執行的獨立性,完全不需要依賴網路就能執行腳本。 這是目前最推薦的方式
缺點:用戶需要具備ssh以及基本linux操作經驗,每次升級都需要ssh進入ddwrt裡面操作。
custom firmware自制韌體模式
自己制作具備autoddvpn功能的DDWRT韌體,經由韌體升級之後使其韌體本身就具備autoddvpn功能
優點:非常適合大批同一款路由器的升級,開發人員只要准備好.bin韌體,所有用戶只要透過web來升級韌體即可,對用戶來說是最簡單的方式。
缺點:對開發者來說比較麻煩,每一次腳本升級都需要重新包裝韌體。
在選擇使用哪一種模式之前,請先進行下面的基本設置:
設置PPTP client
如下圖 “(im)
“說明:
PPTP主機請用IP設置, 不要設置FQDN,否則之後會斷線
MPPE Encryption裡面輸入 mppe required,no40,no56,stateless
Remote Subnet 與Remote Subnet Mask是你PPTP撥上之後的VPN子網路與遮罩,請依據自己的環境設置,必要的話可以先用電腦嘗試連上PPTP, 觀察取得的VPN IP/Netmask是多少,假如是取得192.168.199.3, 則通常設置成Remote Subnet 192.168.199.0 Remote Subnet Mask 255.255.255.0即可,以此類推。(注意:這兩個參數不用設定也是可以連上PPTP, 但是無法調整正確的路由表,造成無法順利運作,請務必弄清楚這兩個數值,如果設定錯的話會運行失敗的)
如果實在不知道怎麼找出這兩個數值,請參考這裡的教學
Username Password是你的PPTP撥號的帳戶密碼
設置DNS
DD-WRT使用dnsmasq來做簡易的name cache服務,因為dnsmasq只會forward到上游DNS以及cache查詢結果,並不會跟bind9一樣從Root DNS一路查詢下來,因此如果上游DNS資料被污染的話,dnsmasq的資料也會被污染。
這裡我們關閉了dnsmasq服務,強迫使用Google DNS與OpenDNS, 因為建立VPN之後DD-WRT跟境外DNS之間就走加密VPN了,因此不用擔心被污染的問題,請注意,DDWRT提供的三台靜態DNS全部都要設置上去,分別設置為:
8.8.8.8
8.8.4.4
208.67.222.222
注意: # 必須三台都設置,如果設置少於三台,DDWRT會使用ISP動態發放的國內DNS來補上,這會造成風險
設定方式如下: ”
(im)
“這樣的設置的優缺點是:
優點
建立VPN之後,將完全不會有DNS劫持問題
缺點
DD-WRT下面的所有電腦的DNS都會被設置為Google DNS
DD-WRT本身不做name cache, 因此所有查詢都會經由VPN到Google去,相對的會比較慢
國內一些CDN加速的網站,例如www.qq.com, 很可能Google查詢的結果並不會是最優化的結果,可能訪問會比較慢一點,實際要看每個人的感受。
然而可以透過DNSMasq自定域名國內查詢的方式來解決以上缺點,但建議第一次使用autoddvpn的用戶先不要理會這部分,等autoddvpn正常運行之後再來看這份文件。
接著請選擇三種模式其中一種來操作即可
wget模式
jffs模式
custom firmware自制韌體模式”
-Wiki Pages – autoddvpn – DD-WRT自動翻牆解決方案 – Google Project Hosting
https://code.google.com/p/autoddvpn/w/list
graceMode – autoddvpn – DD-WRT自動翻牆解決方案 – Google Project Hosting
https://code.google.com/p/autoddvpn/wiki/graceMode
“graceMode
Updated Mar 15, 2011 by pahud…@gmail.com
Introduction
這份文件說明autoddvpn的graceMode運作原理。
Details
緣起
面臨的問題
解決之道
設置方式
測試
其他議題
緣起
autoddvpn最早是從chnroutes的設計所啟蒙而來的,這個國內國外分流的概念後來在國內有很多人開始實做,包括tomato路由器、openwrt路由器甚至商業的威眾路由器,然而國內國外分流這個概念雖然方便,但也面臨了很多問題,autoddvpn不得不思考因應新的網路環境該如何找出更好更舒服的解決方式,graceMode就是在這樣的背景下誕生的想法。
面臨的問題
國內國外分流面臨的問題很多,例如:
不需要翻牆的國外網站也被迫走VPN了,這樣會嚴重依賴VPN的穩定性,同時浪費了VPN的流量。
所有DNS查詢為了避免被劫持,必須使用8.8.8.8 Google DNS或OpenDNS, 這樣一來跟Google DNS之間必須依賴可靠穩定的VPN連線,所有DNS UDP query封包走了很遠的路到DNS查詢使得網頁開啟變慢,萬一VPN斷線則所有查詢都沒有回應連國內網站也上不去,再來就是國內網站的CDN效果完全失效,上海電信的用戶可能會連到北京聯通的服務器,結果一切都亂了
p2p無法使用,或者必須封鎖國外的p2p traffic或者server節點
國內到美西的國際帶寬越來越不穩定,夜間尖峰時段掉包率可以到20-30%, 使得VPN tunnel非常不穩定,一旦VPN不穩定,所有依賴VPN的解析或傳輸全部受到影響。
解決之道
找出真正需要翻牆的網站所使用的IP網段,只有這些IP網段才走VPN
使用本地DNS(ISP提供的DNS或local DNS), 讓DNS查詢可以非常快速穩定,同時具有CDN加速的優勢,然而對於有劫持風險的域名例如twitter, youtube, facebook等則強迫使用Google DNS, 這樣一來如果VPN不穩導致DNS解析不穩,頂多也只是影響twitter, youtube, facebook等有劫持風險的網站,其他網站完全不用擔心解析問題。(注:事實上本文最後的dnsmasq_options設置方式完全可以避免twitter facebook等劫持風險)
p2p可以正常使用,因為你的p2p節點不會在facebook, twitter, youtube這些公司的IDC機房裡面,因此所有p2p流量全部都是直連,包括國外節點,你只需要擔心你的DDWRT路由器CPU內存等硬件配備是否足以支撐即可。
盡量不依賴VPN穩定度,萬一VPN不穩頂多需要翻牆的網站連不上,其余國內網站例如douban或國外網站例如gmail必須訪問正常,不能有任何影響。
設置方式(以OpenVPN為例)
DDWRT必須啟動JFFS,參考這裡
設置DDWRT使其可以正常連上WAN
DDWRT setup裡面的 Static DNS 1~3 請保持0.0.0.0 不要設定Google DNS或任何DNS,讓DDWRT預設使用ISP或DHCP提供的DNS。如果你不是DHCP環境而是static IP環境,那就手動指定所在環境的DNS IP。
Services->DNSMasq裡面DNSMasq Local DNS No DNS Rebind 全部都 Enable
Additional DNSMasq Options 請參考本文最後的備注填入。
說明:DNSMasq是DDWRT裡面的一個name cache server, 它可以定義static A RR或者定義某些域名強迫從某個DNS來做解析,上面這個設置范例是先定義好www.facebook.com http://www.youtube.com 等域名解析結果,對於經常上facebook, youtube and twitter的人會有很大的幫助,同時指定某些容易被DNS劫持的域名例如facebook.com fbcdn.net twitter.com youtube.com等泛域名一律由Google DNS 8.8.8.8來做解析,因為8.8.8.8之後會強迫走VPN,因此不用擔心DNS劫持,除非VPN斷線路由表被清空,這時DNSMasq才有短暫機會可能被污染。
# 接著參考這份文件,准備好你的OpenVPN設置,使其能手動啟動,設置文件放在 /jffs/openvpn/openvpn.conf ,必須注意的是,設置文件裡面不要設置 redirect-gateway def1 , 否則會失效。
# 接著ssh進入DDWRT:
# mkdir /jffs/openvpn
# cd /jffs/openvpn
# wget http://autoddvpn.googlecode.com/svn/trunk/grace.d/vpnup.sh
# wget http://autoddvpn.googlecode.com/svn/trunk/grace.d/vpndown.sh
# chmod a+x *.sh
# nvram set rc_startup=’date 20100729; openvpn –config /jffs/openvpn/openvpn.conf –daemon’
# nvram commit
注意:如果你的OpenVPN不是手動啟動,而是透過DDWRT web UI來設置,則你需要再下載run.sh,並且使用不同的rc_startup:
# cd /jffs/openvpn/
# wget http://autoddvpn.googlecode.com/svn/trunk/openvpn/jffs/run.sh
# nvram set rc_startup=’/jffs/openvpn/run.sh’
建議你使用手動方式啟動OpenVPN比較好。
最後重新啟動DDWRT即可,啟動之後會產生兩個log
/tmp/autoddvpn.log 這是autoddvpn的log
/tmp/openvpn.log 這是openvpn的log
設置方式(以PPTP為例)
# DDWRT必須啟動JFFS,參考這裡
設置DDWRT使其可以正常連上WAN
DDWRT setup裡面的 Static DNS 1~3 請保持0.0.0.0 不要設定Google DNS或任何DNS,讓DDWRT預設使用ISP或DHCP提供的DNS
Services->DNSMasq裡面DNSMasq Local DNS No DNS Rebind 全部都 Enable
Additional DNSMasq Options 請參考本文最後的備注填入。
說明:DNSMasq是DDWRT裡面的一個name cache server, 它可以定義static A RR或者定義某些域名強迫從某個DNS來做解析,上面這個設置范例是先定義好www.facebook.com http://www.youtube.com 等域名解析結果,對於經常上facebook, youtube and twitter的人會有很大的幫助,同時指定某些容易被DNS劫持的域名例如facebook.com fbcdn.net twitter.com youtube.com等泛域名一律由Google DNS 8.8.8.8來做解析,因為8.8.8.8之後會強迫走VPN,因此不用擔心DNS劫持,除非VPN斷線路由表被清空,這時DNSMasq才有短暫機會可能被污染。
接著ssh進入DDWRT:
# mkdir /jffs/pptp
# cd /jffs/pptp
# wget http://autoddvpn.googlecode.com/svn/trunk/grace.d/vpnup.sh
# wget http://autoddvpn.googlecode.com/svn/trunk/grace.d/vpndown.sh
# wget http://autoddvpn.googlecode.com/svn/trunk/pptp/jffs/run.sh
# chmod a+x *.sh
# nvram set rc_startup=’/jffs/pptp/run.sh’
# nvram commit
# 接著參考這份文件 設置PPTP client 的部分,准備好你的PPTP client設置
最後重新啟動DDWRT即可,啟動之後會產生一個log
/tmp/autoddvpn.log 這是autoddvpn的log
測試
在DDWRT shell裡面 traceroute http://www.facebook.com 看看第一個節點是不是你的VPN private IP節點,也就是你的VPN gateway。同時再測試 traceroute http://www.apple.com 看看第一個節點是不是你的WAN gateway,如果都沒錯那就是成功了!
其他議題
如果有些網站確實被牆了,但是graceMode連不上,我該怎麼辦?
graceMode裡面所有需要翻牆的IP網段定義在vpnup.sh裡面,這個腳本是我透過gfwList的內容分析自動產生而來的,但仍然有可能會有不盡全面之處,目前唯一能做的是自行定義vpnup_custom內容,先將被牆的網站域名透過nslookup找出實際的IP,然後再用traceroute測試是否這個IP沒有走VPN,最後在DDWRT裡面手動執行
route add -host xxx.xxx.xxx.xxx gw
然後再測試是否可以訪問網站,如果成功了就可以編輯custom_vpnup文件,依據自己到情況放到/jffs/openvpn/或/jffs/pptp/下,這樣下次重開機之後就依然可以訪問這個網站了。vpnup_custom設置范例如下:
# this script will be executed after loading the routing rules in vpnup.sh
# Example:
# route add -host 208.67.222.222 gw $VPNGW
# route add -net 74.125.0.0/16 gw $VPNGW
route add -host 96.16.157.15 gw $VPNGW
DDWRT能如同gfwList自動更新IP網段嗎?
我正在研究這個部分,不過因為DDWRT裡面沒有svn 沒有curl ,只有自帶一個非常精簡的wget command, 因此要比對SVN上面的版本號再決定是否更新vpnup.sh內容並不容易,如果大家有好的方法歡迎告訴我,目前恐怕只能手動更新了。
我可以不直接修改vpnup.sh而是修改自定義的文件嗎?
可以的,如同前面所說的,編輯vpnup_custom文件,依據自己到情況放到/jffs/openvpn/或/jffs/pptp/下, 裡面定義自己的route add/del內容, vpnup.sh會先載入本身的規則再載入vpnup_custom,這樣就如同gfwList一樣可以優先以自己定義的為主了(後面定義的會override前面定義的規則)。
有些網站雖然不需要翻牆,但是走VPN比較快,可以強迫走VPN嗎?
可以的,如同前面所說的,定義vpnup_custom文件即可。
我可以放心使用P2P嗎?
可以的,graceMode完全可以放心使用p2p, 所有p2p流量都不會走VPN,除非你要翻牆的網站本身使用的IP網段也跑p2p了,不過這個機會非常小。
dnsmasq options無法涵蓋所有被污染的域名?
是的,沒有人知道GFW到底污染了多少域名,如果要維護一個很大的 dnsmasq options清單是很困難的,目前也無法提供很好的自動更新機制。不過有些域名雖然被污染了,但是可能你一年卻碰不到一次。graceMode的缺點是沒辦法全面,只能透過客制化修改dnsmasq options以及vpnup_custom來盡量趨於滿足自己的需求,但優點卻是非常明顯的。如果你非常需要解決DNS污染問題,只能在DDWRT裡面的static DNS設置好google DNS與OpenDNS, 然後如同這份文件最後所描述的,將國內大網站的域名指定本地ISP DNS來解析。也就是整個方式反過來思考,這樣好處是解析內容肯定不會被污染,不管GFW污染了多少域名,然而缺點就是DNS解析會非常依賴VPN穩定,如果VPN暫時斷了或不穩,可能很多不需要翻牆的網站也訪問不了了。
graceMode的設計在於彈性、客制化以及連線速度,缺點是沒辦法全面,同時沒辦法提供很好的自動更新機制,因此自己可以決定怎樣的DNS配置方式最適合自己。
我如何知道googlecode上面的vpnup.sh有新版本了?
在自動更新機制出來之前,其實你不需要知道,只要你每日上的網站都能正常訪問,這樣你不更新vpnup.sh也沒問題,萬一有網站無法訪問而你確定是被牆了,這時候你才需要更新vpnup.sh來試試看。
我有其他graceMode設計上的想法或疑問,我該如何回報?
請到這裡來回報
我發現有某個網站的IP沒有被vpnup.sh收錄,我該如何回報?
如果網址是www開頭打不開,建議您提交到gfwList,gfwList一旦收入之後,autoddvpn這邊會在短時間內做相應的更新, 如果網址不是www開頭而打不開,請到這裡回報給我,我會確認之後寫入vpnup.sh裡面。
備注
dnsmasq_options內容
address=/www.facebook.com/66.220.149.25
address=/www.youtube.com/72.14.213.190
address=/twitter.com/199.59.148.83
address=/www.twitter.com/199.59.148.83
address=/api.twitter.com/199.59.148.87
address=/encrypted.google.com/72.14.213.100
server=/google.com/8.8.8.8
server=/facebook.com/8.8.8.8
server=/fbcdn.net/8.8.8.8
server=/twitter.com/8.8.8.8
server=/youtube.com/8.8.8.8
server=/ytimg.com/8.8.8.8
server=/imageshack.us/8.8.8.8
server=/books.com.tw/8.8.8.8
server=/book.com.tw/8.8.8.8″
OpenVPNManualStartUP – autoddvpn – DD-WRT自動翻牆解決方案 – Google Project Hosting
https://code.google.com/p/autoddvpn/wiki/OpenVPNManualStartUP
“OpenVPNManualStartUP
Updated Mar 31, 2011 by pahud…@gmail.com
Introduction
這份文件說明如何更進階地在autoddvpn裡面啟動OpenVPN,以獲得更多的功能支持。
Details
手動啟動OpenVPN的目的
設置方式
手動啟動OpenVPN的目的
如果你的openvpn server在啟動的時候需要指定user/pass, 也就是 auth-user-pass這樣的參數
如果需要openvpn client可以ping server,必要的時候進行自動重啟
你有多個openvpn server,需要進行remote-random的隨機連線配置
你可以設定更多openvpn的進階選項,而不必受限於DDWRT web UI所能提供的
設置方式
在/jffs/openvpn/下編輯一個 openvpn.conf ,內容范例如下
up ‘iptables -A POSTROUTING -t nat -o tun0 -j MASQUERADE; /jffs/openvpn/vpnup.sh openvpn’
down ‘iptables -D POSTROUTING -t nat -o tun0 -j MASQUERADE; /jffs/openvpn/vpndown.sh openvpn’
client
dev tun
ca /jffs/openvpn/ca.crt
cert /jffs/openvpn/client.crt
key /jffs/openvpn/client.key
remote 443 udp
remote 53 tcp
remote-random
resolv-retry infinite
nobind
float
persist-key
persist-tun
comp-lzo
verb 3
remote-cert-tls server
ping 10
ping-restart 60
redirect-gateway def1
auth-user-pass /jffs/openvpn/password.txt
log /tmp/openvpn.log
注意:
如果你只有一個openvpn server可以用,則只需要寫一個即可,同時不需要 remote-random
如果你的openvpn server不需要user authentication, 則auth-user-pass不用寫
ping 10 ping-restart 60表示每10秒client ping一次server, 如果60秒都沒有回應就重啟client,如果你對連線比較敏感的話,可以設為ping 5 ping-restart 20
如果openvpn server沒有啟動lzo壓縮傳輸,則comp-lzo不用寫
如果你是是使用graceMode, 請務必把 redirect-gateway def1 這行移除,這很重要。此外建議加上 route-nopull, 這樣可以拒絕服務端push過來的路由信息,自己維護default gw。(see #14)
最後一行log寫入/tmp/下,每次重開機會被清空,如果你完全不需要看log,這行可以不用。
修改rc_startup
nvram set rc_startup=’date -s “2010-07-29 12:00:00”; openvpn –config /jffs/openvpn/openvpn.conf –daemon’
注意:rc_startup修改了時間是為了修正這個issue, 否則TLS handshaking會fail。
開機時不啟動ddwrt自帶的openvpn client, 而是由rc_startup來啟動。
nvram set openvpncl_enable=0
nvram commit
重開機之前你可以先手動測試:
killall openvpn
openvpn –config /jffs/openvpn/openvpn.conf –verb 5
這是打開verbose模式,你可以看到很多執行的output, 來判斷是否運作正常,如果沒問題就可以重開讓它自動執行了。
最後感謝 @jkgtw @yegle 的測試以及回報。
Comment by cnye…@gmail.com, Oct 21, 2010
建议:启动前删除/jffs/openvpn/log 然后在openvpn的配置文件里加入log-append /jffs/openvpn/log
方便查看openvpn日志
另外,在重启前测试是必要的。因为ddwrt里内置的openvpn版本过低,如果使用的配置文件里使用了低版本不支持的选项(例如explicit-exit-notify),则启动失败
Comment by tianchao…@gmail.com, Mar 10, 2011″
感谢支持,这个以前发过了。
还是不太完美