uku / Unblock-Youku

A Chrome extension helping users access their web services while traveling outside mainland China
https://uku.im
GNU Affero General Public License v3.0
3.18k stars 651 forks source link

打造簡便unblock youku路由器(使用openwrt + privoxy) #106

Closed karlcheong closed 11 years ago

karlcheong commented 11 years ago

記得很久前有人就問過 在路由器如何設置Unblock Youku 後來更有一篇教程, 通過squid來達成Unblock Youku功能

對於一般家居用的路由器來說,都是基於MIPS LE(Boardcom)或MIPS BE(Atheros) unblock youku伺服器使用之Node.js對MIPS支援性很差, 很難用來運行轉發代理 而 squid 倒是可以在家用路由器運行, 不過一來squid設定複雜我不會設, 二來 我正好在 #80 中為了給Android也能解鎖, 用privoxy 運行轉發代理 可以直接把設定搬過來用, 所以這個教程使用的軟件為privoxy

要求: 已安裝OpenWRT系統的路由器

1 SSH進去路由, 然後輸入指令安裝 privoxy opkg update opkg install privoxy

2 把規則文件及basicsetting設定文件, 放到 /etc/privoxy

https://github.com/karlcheong/unblock_youku_privoxy_rules

3 輸入指令啟動 privoxy /etc/init.d/privoxy start

(可選:)輸入指令, 使路由啟動時自動運行 privoxy 代理 /etc/init.d/privoxy enable

4 把要解鎖的裝置設定代理為 路由區域網IP:8123

karlcheong commented 11 years ago

unblock youku路由器進階篇, 區域網絡下所有裝置全自動解鎖!

本文是 簡便unblock youku路由器 的進階應用 Dnsmasq DNS + privoxy 路由器反向代理

通過更改DNS返回的IP 把要解鎖url的域名指向privoxy架設的反向代理IP 反向代理再通過國內PROXY把結果回傳給用戶 區域網絡下所有裝置都不需任何設定就可以unblock youku

以下說明比較簡要, 但我想會一點*UNIX的都應該明白

要求: openwrt系統路由器 本人使用attitude adjustment 12.09

1 SSH進去路由, 然後輸入指令安裝 privoxy

opkg update
opkg install privoxy

2 把規則文件及reverseproxysetting設定文件放到 /etc/privoxy

https://github.com/karlcheong/unblock_youku_privoxy_rules

3 輸入指令啟動 privoxy

/etc/init.d/privoxy start

(可選:)輸入指令, 使路由啟動時自動運行 privoxy 代理

/etc/init.d/privoxy enable

4 修改/etc/init.d/dnsmasq Dnsmasq啟動腳本, 在 第518行 done 的下面加上以下2句 令路由系統不使用本機運行的Dnsmasq DNS伺服器

  rm -f /tmp/resolv.conf
  ln -s /tmp/resolv.conf.auto /tmp/resolv.conf

即是修改成這樣子:

service_start /usr/sbin/dnsmasq -C $CONFIGFILE && {
    rm -f /tmp/resolv.conf
    [ $ADD_LOCAL_DOMAIN -eq 1 ] && [ -n "$DOMAIN" ] && {
        echo "search $DOMAIN" >> /tmp/resolv.conf
    }
    DNS_SERVERS="$DNS_SERVERS 127.0.0.1"
    for DNS_SERVER in $DNS_SERVERS ; do
        echo "nameserver $DNS_SERVER" >> /tmp/resolv.conf
    done
  rm -f /tmp/resolv.conf
  ln -s /tmp/resolv.conf.auto /tmp/resolv.conf

5 打開 /etc/privoxy/basehosts, 把里面的IP 192... 全部替換成你路由器的區域網IP

6 修改 /etc/dnsmasq.conf Dnsmasq設定文件, 加入一行新的設定 令Dnsmasq 讀取basehosts 文件

addn-hosts=/etc/privoxy/basehosts

7 重啟Dnsmasq 即可

/etc/init.d/dnsmasq reload

PS: 如果想限制privoxy只能代理需要解鎖之域名, 不代理其他網站, 請打開 /etc/privoxy/config 把 trustfile trust 前的註釋去掉即可

PPS: 一個有大量使用者的DNS反向代理應該需要2個dnsmasq緩存運行 一個監聽區域網絡的, 用來把特定域名指向反向代理 另一個監聽本機介面, 用來連接特定域名下的其他資源 不然ISP 的DNS 可能會因你DNS請求太多而暫時封鎖你IP。 (除非把連接特定域名的所有流量導向代理) 當初我只運行1個dnsmasq是我認為因為這樣不用分別管理2個dnsmasq的設定, 對於路由器用戶不多的場合更方便也夠用了。

zhuzhuor commented 11 years ago

@karlcheong 我可以给你提供个 digitalocean 的 vps 如果可能的话你在这个 vps 上弄个 dns 怎么样?我们可以试试看,不过要注意安全问题

另外想到有一些域名下面内容并不是全部都通过代理的,而且代理服务器也有权限控制 不知道你这个是怎么处理的

karlcheong commented 11 years ago

@zhuzhuor

權限管制 privoxy可以把web設定介面所有設定開關全部關掉 也可以把設定檔的 templdir 改掉 使web設定介面完全失效 privoxy 沒有basic密碼驗證(but, who need it in a public proxy) 但可以設定acl,指定黑名單, 也可以設定trustfile列表(白名單)

我用privoxy 重點是因為它夠小巧簡單,沒有什么dependencies, 適合個人家庭使用 架在port80 即可當成正向代理也可當作反向代理

至於用在公共反向代理得好好想想會有什么問題 1 privoxy 的URL/trust列表, DNS紀錄得自行維護, 這個還算小事 2 privoxy 沒有cache功能, 要Cache的話得chain一個帶cache的proxy 3 "有一些域名下面内容并不是全部都通过代理的" 因為DNS的限制, 所以反向代理只能把域名下的所有域名都要代理 不然客戶端的web頁面就什么都看不到/error/顯示不完全了

這對VPS的網速/流量要求比pac正向代理的要求高得多 digitalocean 的vps 我看到流量是metered的.. US$5/只有1TB的樣子

ref: http://www.privoxy.org/user-manual/ Privoxy設定說明

karlcheong commented 11 years ago

Latest Update: zhuzhuor 跟我 在架一台DNS + 反向代理伺服器 即將完成...

simonleungs commented 11 years ago

请教一下,其实 /etc/privoxy 是那里?

karlcheong commented 11 years ago

openwrt的檔案系統中的/etc/privoxy, 放privoxy的設定文件的 linux類型的系統的各種設置文件都放在/etc/那里的

@simonleungs 如果你現在有更多問題問的話, 可以給你的即時通信工具/EMAIL地址/facebook/twitter ..等等

simonleungs commented 11 years ago

谢谢你~可以怎麽找你

karlcheong commented 11 years ago

@simonleungs 你有沒有Skype/Facebook/QQ之類的IM號, 有問題問的就給來我加你

simonleungs commented 11 years ago

skype : simonleungs

kevinyang9999 commented 11 years ago

你好 請問 在 /etc/privoxy 找不到basehosts的文件. 請問是在那裏

karlcheong commented 11 years ago

@kevinyang9999 basehosts文件在提供的reverseproxy.7z中 請自行解壓後放到路由中

kevinyang9999 commented 11 years ago

SORRY,現在看到了

再問一下config中 listen-address [::]:80 -->不需要改ip與port嗎 log中錯誤 2013-10-22 23:59:47.352 77d76000 Fatal error: can't bind to :::80: Address family not support 改成 listen-address 192.168.1.1:80 log中錯誤 2013-10-23 00:15:09.722 775b5000 Fatal error: can't bind to 192.168.1.1:80: There may be another Privoxy or some other proxy running on port 80 最後改成192.168.1.1:8123 -->對嗎? log就沒錯誤了 (把其它設定 proxy:192.168.1.1 port8123)-->對吧? 謝謝囉! (有把basehosts ip改成路由器ip:192.168.1.1)

karlcheong commented 11 years ago

@kevinyang9999 listen-address [::]:80 是同時監聽所有介面IPv4+v6 沒安裝v6的使用listen-address 0.0.0.0:80 監聽所有介面IPv4

而listen-address 192.168.1.1:80 log中錯誤 2013-10-23 00:15:09.722 775b5000 Fatal error: can't bind to 192.168.1.1:80: There may be another Privoxy or some other proxy running on port 80 原因是路由web管理介面預設佔用了port 80 你需要把web管理介面使用的port改掉 attitude adjustment 12.09 預設使用LUCI 去編輯 /etc/config/uhttpd 把list listen_http 0.0.0.0:80 , 80改掉為其他port

要做反向代理的話,有以下地方注意 1 一定要架在port 80, 不然就成了第一個post的正向代理 2 dnsmasq 有載入我付上的hosts文件 (第5步 addn-hosts) 3 DNSmasq的啟動腳本記得修改好 (第4步 令路由器上運行的privoxy不使用本機dnsmasq), 不然就會造成privoxy不斷連接自己的死循環

(最終反向代理效果= android免root免設定代理即可unblock)

xiozf commented 11 years ago

请问可以基于privoxy做一个替换优酷土豆奇艺播放器以达到去广告目的规则吗?目前使用替换方法的都是chrome插件或者油猴脚本,IE或不支持油猴脚本的没办法使用。

karlcheong commented 11 years ago

@xiozf
你也許可以通過privoxy 的redirect 規則來把swf, xml文件的位置轉向成你自己架設的伺服器 (沒有試過..或許你可以自己試試, 真的要去廣告在windows, linux, mac等桌面系統下還是直接安個firefox/chrome方便)

zhumingvictor commented 11 years ago

我用tomato, 没有/etc/init.d/ 怎么弄?

karlcheong commented 11 years ago

@zhumingvictor tomato沒玩過, 你只好自己研究下了

hihitoni commented 11 years ago

你好 第六步我不是很明白

6 修改 /etc/dnsmasq.conf Dnsmasq設定文件, 加入一行新的設定 令Dnsmasq 讀取basehosts 文件 addn-hosts=/etc/privoxy//basehosts

请问 addn-hosts=/etc/privoxy/basehosts 这一行加在dnsmasq.conf 哪一行 可否给个实例文件 谢谢

邮件:hihitonizhou@gmail.com

karlcheong commented 11 years ago

@hihitoni 加在最尾就可以了

hihitoni commented 11 years ago

谢谢! 因在国外,源于视频地区得限制而不能观看,太苦B了。支持。

tonizhou

在 2013-11-2,4:32,"karlcheong" notifications@github.com 写道:

@hihitoni 加在最尾就可以了

— Reply to this email directly or view it on GitHub.

shine12 commented 10 years ago

謝謝!

shine12 commented 10 years ago

請問"進階版"我再WIN7上騰訊的偶而會成功,優酷沒成功過一次,安卓上更慘,優酷APP的列表都看不到,想先問是規則太舊要更新嗎? 基礎版下,把路由IP與8123加到IE中當PROXY有錯誤嗎?因為我加進去就根本不能上網 每個步驟都再三確認了,應該不是都沒架起來吧?除了去看片,怎麼看有成功架起privoxy呢? 感謝回復!!!

whuhacker commented 10 years ago

@karlcheong 今天把路由器刷成 openwrt 試了下你的這個方法,遇到些麻煩,在重啓 DNS 服務的時候有問題,我的手機仍然不能看優酷。 deepinscrot-1814

最後加上的那句 addn-hosts=/etc/privoxy/basehosts 提示 not found,但是在 /etc/privoxy/basehosts 是存在的。不知何解……

karlcheong commented 10 years ago

@whuhacker 看樣子你把那句addn-hosts加在dnsmasq啟動腳本里了 那句是加在 /etc/dnsmasq.conf 里的

@shine12 這幾天dns代理出了點問題, 在調整中, 你急用的可以先找個國內代理放到cnforward.action那里 規則是新的沒問題

whuhacker commented 10 years ago

@karlcheong 確實搞錯了,我改回了重啓 DNS 沒問題了。不過又有新狀況

deepinscrot-3514 deepinscrot-3535

訪問其他頁面沒問題,只要是需要代理的頁面就會出現 No such file or directory……

另外我看到你在 cnforward.action 裏寫定了

{+forward-override{forward digito.wlmacao.tk:80}}

是因爲它死掉了嗎?我換成了上面的

{+forward-override{forward h0.edu.bj.ie.sogou.com:80} +sogou-header{Reason}}

也不行

karlcheong commented 10 years ago

這問題可能得把privoxy以--no-daemon運行 看看有沒有什么error出來

http://www.privoxy.org/user-manual/startup.html#CMDOPTIONS

whuhacker commented 10 years ago

我也出現了端口的問題

deepinscrot-1313

已經把 uhttpd 的端口改成別的了,怎麼還是不能用 80 呢?

vingoleong commented 10 years ago

我也出現 No such file or directory..是否 文件 权限 引起? 或 程式某处 拼写 错误? 笔误?

karlcheong commented 10 years ago

@vingoleong 你要把uhttpd的port改掉

@whuhacker 我看了下.. 應該是設置檔中我定義的listen address為ipv6的wildcard 地址 [::]:80 而openwrt沒有安裝ipv6 stack造成.. 把listen address 改為0.0.0.0:80或者安上ipv6就可以

hihitoni commented 10 years ago

安装了ipv6 stack ,修改了config文件 ,filterfile default.filter 这段放到logdir /var/log 下面 ,win7网页视频正常运行,各种app不能运行 。 android电视棒 各种app正常运行, youku没有出现端口错误 ,但不能播放 ,好像连接很慢 。iphone ios6下各种app 不能运行 ,其它没有测试 。

shine12 commented 10 years ago

沒裝ipv6 stack ,有改127.0.0.1:80 ,win7網頁youku無法看 ,最後播放時會有1.非中國用戶(有設ISP DNS時) 2.無法連接網頁(沒設ISP DNS時) 。android上youku app 1.沒有端口錯誤 但非中國用戶(有設ISP DNS時) 2.端口錯誤 沒列表(沒設ISP DNS時) 。用這是不是不能設DNS?

ipv6 stack該怎麼裝?http://wiki.openwrt.org/doc/howto/ipv6 跟這一樣嗎? 好難...

whuhacker commented 10 years ago

@shine12 我的測試結果和你一樣,應該還是 Privoxy 沒設好

DNS 解析 youku 等相關域名的時候,是根據 /etc/privoxy/basehosts 解析到路由器的局域網 IP 192.168.1.1,所以我猜測 /etc/privoxy/config 中的 listen-address [::]:80 應該改成

listen-address 192.168.1.1:80

而不是

listen-address 127.0.0.1:80

然後還是無法連接優酷的播放頁面(其他網站正常)。後來我的 privoxy 就被 kill 了,重啟都出現

There may be another Privoxy or some other proxy running on port 80

uhttp 確定不在 80 端口,已經殺掉了所有 privoxy 進程,可是我的 privoxy 都再也啟動不了了……

karlcheong commented 10 years ago

sorry, 應該是0.0.0.0或者路由網卡的IP才對

zhumingvictor commented 10 years ago

直接把配置写到DNSMASQ里不就得了么?弄这么费劲干什么?

whuhacker commented 10 years ago

@karlcheong 0.0.0.0 没问题了,之前没杀掉 privoxy 所以启动不了。 deepinscrot-3413

我在 --no-daemon 模式下运行,基本上几分钟之内就被系统自动 kill,难道是我的路由器硬件配置太低?我也怀疑是 privoxy 自己陷入了死循环,但是我在 dnsmasq 的启动脚本里面已经加上那两句了

rm -f /tmp/resolv.conf ln -s /tmp/resolv.conf.auto /tmp/resolv.conf

whuhacker commented 10 years ago

靠,因为写错一个字母…… 终于搞定了!

whuhacker commented 10 years ago

@karlcheong 我建议建立一个新的 repo,把你在 dropbox 里面的配置文件也进行版本控制,毕竟文件比较零散,也可能会频繁地改动。

vingoleong commented 10 years ago

@karlcheong sorry, 應該是0.0.0.0或者路由網卡的IP才對。指的是哪個文件??

whuhacker commented 10 years ago

@vingoleong /etc/privoxy/config 中的

listen-address [::]:80

改成

listen-address 0.0.0.0:80

vingoleong commented 10 years ago

搞了几天都失败,有谁搞几成功的?

vingoleong commented 10 years ago

@karlcheong 终于成功了。谢谢。 认真地看了下代码。 有些地方搞不懂: 为什么用 Dnsmasq addn-hosts=/etc/privoxy//basehosts, 而不用 iptables 把 port 80 引向 代理 ,再在proxy 做分流?

whuhacker commented 10 years ago

@vingoleong 如果验证 IP 的 URL 不是 80 端口呢?

vingoleong commented 10 years ago

@whuhacker 不太明白你想说什么。。。是说端口改变了要手工改动设置吗?

查了下网上 做成透明代理,大都是 用 IPTABLE --dport 80 -j REDIRECT --to-ports XXX。而 karlcheong 是 代理直接使用80 。 想知道这两种做法的分别。另外 /etc/privoxy//basehosts 起的是分流作用,不在 basehosts 內的 URL 不走代理。privoxy 惯常 是 用 direct=+forward-override{forward . 分流的。惊叹 karlcheong 的创意。

karlcheong commented 10 years ago

@whuhacker 不在PORT 80 的HTTP流量, 可以讓privoxyr 綁定在目標port, 情況跟port80是一樣的 (privoxy 可一次綁定多個port/IP)

@vingoleong
只做透明代理, 而不做反向和DNS 一來會加重router負擔(PC那就沒所謂了), 二來出了區域網, android就不好使了(除非你打算把所有流量都導回去家中的寬頻線)

再說privoxy做反向代理只需打開一個option就行了

shine12 commented 10 years ago

請問 這篇應用我成功在TOMATO實現第一部分 監聽192.168.11.1:80 想要自動解鎖 已把host文件轉成address=/v.youku.com/192.168.11.1放到Dnsmasq 無法成功解鎖 想問Dnsmasq這樣設是錯的嗎?是否一定要另外配 IPTABLE?

karlcheong commented 10 years ago

@shine12 我架privoxy 不需要 iptables dnsmasq你這樣設置address是可以, 但我會直接指定addn-host 附加host文件

無法成功解鎖 那是出什么問題呢?

privoxy 服務有沒有成功起動呢? 可在browser里先設定proxy 試試privoxy有沒有正常運作

privoxy監聽80接口需要root, 不然不能成功起動,

shine12 commented 10 years ago

我再PC上瀏覽器或安卓手機把192.168.11.1:80當PROXY都能成功解鎖 p.p也能看到enable 應該是有成功

你說 指定addn-host 附加host文件 是指把整個從basehosts轉成的address文件全部加進去嗎? 我有這樣做 但是不行解

另外address=/v.youku.com/192.168.11.1 這個192.168.11.1是網外IP 而非網內 是嗎?還有他是走哪個port呢? 是網外的話 感覺還要加個導回的設定 曾亂加個server=192.168.11.1到Dnsmasq 結果網路整個當了XD

karlcheong commented 10 years ago

第4步 令路由器上運行的privoxy不使用本機dnsmasq 這個你有做好嗎? 我給的是openwrt的例子 因為tomato我也沒用過, 方式可能有點差異

你看看你路由系統resolv.conf里使用的DNS伺服器是什么呢? 或者你使用dig 也能知道目前使用的DNS伺服器

keaniny commented 10 years ago

我剛剛根據 karlcheong 兄的文檔做了一遍,成功於 openwrt 上架好 privoxy + dnsmasq,測試過沒問題,特來謝謝! 希望這個 repos 可以持續更新,感激感激!

shine12 commented 10 years ago

原始的resolv.conf 只有nameserver 127.0.0.1 是不是要加個192.168.11.1進去?

dnsmasq[489]: reading /cifs2/optware/resolv.conf dnsmasq[489]: using nameserver 168.95.1.1#53 dnsmasq[489]: using nameserver 8.8.8.8#53 dnsmasq[489]: using nameserver 192.168.1.1#53 dnsmasq[489]: using nameserver 2001:b000:168::1#53 dnsmasq[489]: using nameserver 2001:4860:4860::8888#53 dnsmasq[489]: using nameserver 2001:470:1f04:c8b::2#53 dnsmasq[489]: ignoring nameserver 192.168.11.1 - local interface dnsmasq[489]: ignoring nameserver 127.0.0.1 - local interface dnsmasq[489]: read /etc/hosts - 2 addresses dnsmasq[489]: read /etc/dnsmasq/hosts/hosts - 26 addresses *dnsmasq[489]: read /cifs2/optware/basehosts - 64 addresses dnsmasq-dhcp[489]: read /etc/dnsmasq/dhcp/dhcp-hosts

*開頭的是修改resolv.conf後才多出來的log
ignoring nameserver就是指不能這樣改? 開啟basehosts裡的網址 tomato就卡死了

dig在tomato不知怎麼叫出來 -sh: dig: not found