這篇文章介紹的方法基於aa65535的shadowsocks-spec for openwrt,介紹了如何在OpenWRT下配置自動翻牆,新版本支援在Luci下圖形化配置,大大簡化了配置過程。配置完成後,路由器本身獲得自動翻牆能力,所有連入該路由的裝置都可無障礙訪問被牆的網站。是運行於路由器的透明代理。
方案根據IP判斷是否代理,國內IP不代理,國外IP走代理。代理通過shadowsocks所帶ss-redir做TCP轉寄實現,分國內外IP通過國內IP段列表檔案chnroute來區別,並通過iptables規則分別處理(這些功能已經全部整合到shadowsocks-spec裡了無需額外配置)。由於是基於IP的判定,故需要解決DNS汙染的問題,故搭配使用ChinaDNS來解決。
由於只要國外IP均走代理,而不是被牆才走代理,那麼本方案的優缺點也就很明顯了。
優點:基本不會有漏網之魚,保證所有被牆網站能訪問;能夠一定程度改善國內訪問一些國外網站緩慢的問題,如果你的伺服器速度很好,那麼甚至可以起到加速國外網站訪問的作用。
缺點:如果伺服器速度一般,訪問一些網站甚至會減速;對一些限制IP的網站和軟體應用可能會造成麻煩。總之,請酌情選擇。
一、shadowsocks 安裝
首次安裝的話,先安裝必要的包,確保路由器連網,先更新軟體包列表(下載有問題的請手動到openwrt.org下載所有需要的包並上傳到路由器上使用opkg install XXX.ipk命令安裝):
opkg update
shadowsocks有openssl(檔案名稱是shadowsocks-libev-spec-X.XX.ipk)和polarssl(檔案名稱是shadowsocks-libev-spec-polarssl-X.XX.ipk)兩個版本選擇,ROM空間吃緊的就選擇後者吧。
先安裝必要的包,如果要用polarssl版本的shadowsocks(polarssl體積更小):
opkg install ipset libpolarssl resolveip iptables-mod-tproxy
如果要用普通版本(openssl)的shadowsocks,那麼(openssl相容性更好):
opkg install ipset libopenssl resolveip iptables-mod-tproxy
期間可能會遇到類似以下的錯誤提示:
kmod: failed to insert /lib/modules/3.10.44/ip_set.ko
kmod: failed to insert /lib/modules/3.10.44/ip_set_bitmap_ip.ko
kmod: failed to insert /lib/modules/3.10.44/ip_set_bitmap_ipmac.ko
...
沒關係,這時因為安裝ipset包後需要重啟,我們此時先重啟一次路由器。
然後下載下面四個包,前兩個ipk包需要根據自己CPU型號選擇:
接著將下載的包通過WinSCP之類的工具上傳至路由器的/tmp目錄。
接著安裝shadowsocks和chinadns,一步步執行:
cd /tmp
opkg install shadowsocks-libev-spec_x.x.x-x_ar71xx.ipk
opkg install ChinaDNS_x.x.x-x_ar71xx.ipk
opkg install luci-app-chinadns_x.x.x-x_all.ipk
opkg install luci-app-shadowsocks-spec_x.x.x-x_all.ipk
特別提醒:2015.1.8,由於ChinaDNS-C更名為ChinaDNS,所以包名有變化,此前安裝過ChinaDNS-C的,需要手動卸載並重新安裝新版。
安裝完成後,shadowsocks和chinadns應該會被配置成開機啟動,如果發現沒有生效,運行:
/etc/init.d/shadowsocks enable
/etc/init.d/chinadns enable
二、shadowsocks 配置
我們登陸Luci,指向“服務”,此時應該能夠看到shadowsocks和chinadns了。
點擊shadowsocks,取消勾選“使用設定檔”,新的選項就出來了,我們把伺服器資訊填進去,代理方式選擇“忽略列表”,然後先把下面UDP轉寄功能關閉,然後儲存並應用(選項不要留空)。伺服器位址請盡量填入IP,否則容易出問題! 全部完成後,重新整理頁面,確保shadowsocks是已啟動狀態。否則請檢查配置。
當然,你可以繼續使用 config.json 進行配置,格式如下:
|
{
"server": "X.X.X.X",
"server_port": "443",
"password": "password",
"local_port": "1080",
"method": "rc4-md5"
}
|
最後記得在Luci裡面填把“使用設定檔”勾上,然後填寫設定檔位置(
不要留空):
然後看一下ChinaDNS的配置介面,此時可以先按照預設的配置來,確保ChinaDNS可以正常啟動,也可以參考下面:
做出說明:
然後,在Luci中切換至“網路”-“DHCP/DNS”設定,如下圖,在”DNS轉寄”中填入127.0.0.1#5353
其中,5353是ChinaDNS的連接埠,如果你在之前設定介面裡改了,這裡記得別填錯。
然後切到HOSTS和解析檔案選項卡,勾中“忽略解析檔案”
接下來的步驟會有區別,通過ChinaDNS進行防DNS汙染及解析結果最佳化,方案有三:
1、對於shadowsocks是用自己伺服器搭建的,推薦方案一,在自己伺服器上搭建DNS服務;
2、如果沒有這個條件,但伺服器支援UDP轉寄(較新版本Shadowsocks均支援),那麼方案二;
3、如果伺服器Shadowsocks版本老,不支援UDP轉寄,那麼可用方案三,
要求版本>=1.2.0;
4、如果方案三不好用,可以考慮使用方式情節四:TCP 方式查詢解決 DNS 汙染問題
前兩種方案,目前來說是絕對沒有DNS汙染現象的,此時ChinaDNS的作用完全就是為國外網站做解析最佳化,因為DNS查詢由Proxy 伺服器轉寄,DNS查詢的發起者相當於Proxy 伺服器,獲得的解析結果都是就近於Proxy 伺服器的;而方案三則會直面DNS汙染,此時ChinaDNS的防汙染功能發揮作用,同時方案三無法做到國外網站解析結果最佳化,因為獲得的IP是就近於你的位置的。方案四則可以有效避免國外DNS的汙染,不過同樣也無法做到國外網站解析結果最佳化。
PS1:ignore.list的定期更新以匹配最新IP段分配,長時間不更新可能導致部分國內IP走代理或者國外不走代理,可以使用下面的命令:
wget -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > /etc/shadowsocks/ignore.list
或者:
curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > /etc/shadowsocks/ignore.list
當然你也可以重新下載新版的shadowsocks重新安裝。ChinaDNS的同樣也需要更新,長時間不更新可能導致解析某些地址時候失敗,預設位置是 /etc/chinadns_chnroute.txt
PS2:ChinaDNS的 chinadns_chnroute.txt 和shadowsocks的 ignore.list 其實是重複的,此時你只需把luci配置介面裡面ChinaDNS的chnroute改成 /etc/shadowsocks/ignore.list 就行了, chinadns_chnroute.txt 也就可以刪除了,這樣一來省點空間,而且免去要同時更新兩個檔案的麻煩。
PS3:如遇到別的被牆網站沒問題但YouTube, Facebook, Twitter打不開,應該是DNS汙染造成,請用dig命令排查,並嘗試更換DNS轉寄方案。方案一和方案二可以配合這個dnsmasq設定檔使用效果更佳:dnsmasq_list.conf ,具體用法我就不詳細說了,總之去掉ipset=/…/…的行,然後把127.0.0.1#5353改成你的相應地址。