autoddvpn—DD-WRT自動翻牆解決方案

2010年10月29日 | 分类: 翻墙相关 | 标签: , ,

autoddvpn是從chnroutes啟發而來的解決方案。它讓DD-WRT路由器可以達成類似chnroutes的效果,讓路由器下面的所有上網設備包括Windows, Mac, iPhone, iPad都可以透明翻牆,不需要任何安裝或設置。換句話說,您所需要做的,就是裝上路由器,打開電源,然後所有電腦就仿佛在牆外一般,完全感覺不到牆的存在。

為什麼要用這個解決方案呢?

  1. 你想直接在無線路由器翻牆,只要一打開就全家翻牆,什麼都不用安裝設定,一勞永逸
  2. 你不是技術geek, 你沒時間去研究翻牆技術,你只想按下電源開關,然後統統搞定,就像喝水一樣簡單

我已經有SSH翻牆方案了,為什麼我還要autoddvpn?

這裡有一份推薦使用chnroutes取代SSH翻牆的介紹文章請點這裡, autoddvpn繼承了chnroutes的設計概念,達到chnroutes同樣的效果。

需要環境:

  1. 支持PPTP或OpenVPN client的DD-WRT路由器
  2. 一個PPTP或OpenVPN帳號
  3. ADSL或DHCP上網環境
  4. 不需要安裝任何軟件

注意:

  1. 目前只支持DD-WRT

了解更多

项目地址http://code.google.com/p/autoddvpn/

使用说明http://code.google.com/p/autoddvpn/w/list

下载链接http://code.google.com/p/autoddvpn/downloads/list

  1. AS
    2011年7月17日18:43

    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 ”

    (你好)

  2. AS
    2011年5月22日12:14

    -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

  3. AS
    2011年5月22日11:55

    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″

  4. AS
    2011年5月22日11:39

    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″

    • iGFW
      2011年5月22日12:59

      感谢支持,这个以前发过了。

  5. 匿名
    2010年10月30日08:57

    还是不太完美