Pages

Thursday, 21 May 2015

强大的代理调度器-Privoxy

大家都知道 Foxyproxy 和 Autoproxy 这两个扩展,根据不同网址让 Firefox 选择代理。那么其它浏览器呢?使用 pac 文件也可以达到类似的效果,但 Linux 下的 Chrome/Chromium 很怨念不支持。那么非浏览器程序呢?比如播放器,下载程序,它们没有 Javascript 引擎,只能单独使用某个代理,而不能根据地址智能切换。
那么有没有这样的代理,它本身内置类似 Foxyproxy 和 Autoproxy 的功能,根据不同网址再使用另外相应代理,这样任意程序都能实现智能代理切换了。答案是肯定的,就是Privoxy

轻量级代理比较

很多人都知道 Tor 套件曾经的组合是 Vidalia,Privoxy,后来用 Polipo 替换掉 Privoxy,Privoxy 效率真的不行?非也,这两个都算轻量级的代理,比较有名的还有一个 3proxy,我都用过,感觉他们的设计目标不同
  • Polipo 重点是缓存,配置超简单。
  • 3proxy 重点是权限管理,它的权限可以设置的很详细,还支持 SOCKS, FTP, POP3协议。
  • Privoxy 重点是过滤,保护隐私,无比强大,因此配置较复杂。
因为 Polipo 重点是缓存,配置又简单,普通用户又用不着过滤器的,拿 Polipo 替换 Privoxy 理所当然。它们都支持父代理(或者叫 forward,二级代理,反向代理),把数据转发给另一代理,比如 Tor 就是 SOCKS5 代理,某些程序不支持,开个 http 代理,相当于转发器,把 http 协议的数据转成 socks5 协议,再传给 Tor。
而 Privoxy 强大之处就是过滤,除了滤掉广告,屏蔽页面,它也可以根据相应条件转发给不同的代理。这就是我一直想找的程序,折腾一通才发现这样的工具其实是远在天边, 近在眼前,翻遍了它的手册终于发现我想要的功能。3proxy 虽然也支持多个父代理,但它的用途只是负载均衡而不能按条件转发。

配置方法

安装就不用说了,Ubuntu 用户就是安装 privoxy 这个包,它可以作为服务启动,配置在 /etc/privoxy/ 文件夹下,也可以指定配置文件独立运行,用普通用户帐号运行测试好配置后再 copy 过去,语法
privoxy --no-daemon configfile
还记得和 Tor 配合使用时,需要修改 /etc/priboxy/config 吧,需要手动加入如下一行
forward-socks5 / 127.0.0.1:9050 .
这一行的意思是
  • forward-socks5 表示使用父代理了,这个代理是 SOCKS5 代理。
  • / 表示转发地址开头是 / 的请求,因为 http 的 header 中地址肯定开头是 /,它是部分匹配,所以这个 / 就表示所有 http 数据了。
  • 127.0.0.1:9050 这个就是父代理的地址。
  • 最后那个点,意思是父代理直接处理数据了。如果不是点而是个代理地址,那么父代理要把数据再转发到这个代理地址,这样组成一个代理链,穿过N层,防跨省必修技术!
具体的用法可看手册,
不一定是 forward-socks5,如果父代理也是个 http 代理,比如 Gappproxy,关键字是 forward(注意最后不用那个点),可以写任意多行,协议可以不同,网址可以不同,代理也可以不同。新建一个名为 config 文件,加入
forward-socks5 .youtube.com 127.0.0.1:8080 .
forward-socks5 .ytimg.com 127.0.0.1:8080 .
forward .twitter.com 127.0.0.1:8000
forward .blogspot.com 127.0.0.1:8000
forward feedproxy.google.com 127.0.0.1:8000
很简单,发给 youtube.com 和 ytimg.com 的包转发给 127.0.0.1:8080 这个 SOCKS5 代理,Tor 或者 ssh,twitter.com 和 blogspot.com 发给 127.0.0.1:8000 这个 http 代理,Gappproxy 或其它。你可以写任意行,最后运行
privoxy --no-daemon config
设置 Chrome 代理为 127.0.0.1:8118 测试一下,其程序如 wget、curl、SMPlayer 也行,export 出 http_proxy 环境变量就行了。这样做任意程序都实现了 Foxyproxy 和 Autoproxy 功能了!

使用 action 文件

config 文件是 Privoxy 的主配置文件,但是修改代理地址是个问题,虽然可以用查找替换,还是比较麻烦,也不直观。我在 上一篇文章 说理想的设计是,一个规则包括一个代理对应一堆网址表达式,Privoxy 可不可以做到这样呢?答案也是肯定的,我就是看了 Privoxy 的用法后改写 pac 文件。
Privoxy 的方法就是使用 action 文件,都说 Privoxy 强在过滤,action 文件就是 Privoxy 的过滤规则文件,作用是满足某些条件执行相应动作。主配置文件中条件只能用网址,在 action 文件中可以设置更详细的条件,比如 User Agent,其实 Forwarding 也是个动作之一。
重新编辑 config 文件,替换成这一行
actionsfile proxy.action
表示使用 proxy.action 这个文件为 actionsfile。接着在同目录新建 proxy.action,加入下面代码
direct   = +forward-override{forward .}
ssh      = +forward-override{forward-socks5 localhost:8080 .}
gappproxy = +forward-override{forward localhost:8000}

{direct}
.google.com
.googleusercontent.com
.mozilla.com

{ssh}
.youtube.com
.ytimg.com

{gappproxy}
.twitter.com
.blogspot.com
feedproxy.google.com
语法一目了然吧,都不用多废话了,前面是定义 alias 动作,后面是 alias 名称跟对应的网址表达式,符合网址表达式就执行 alias 中的动作。
action 文件的语法可看 手册,而 forward-override 这个动作在 这里。至于可不可以把 gfwlist 转换成 Privoxy 的 action 文件,那个别人要做的事了。

from  http://qixinglu.com/post/powerful_filter_proxy_privoxy.html
------------------------------------------------------------

使用Privoxy实现通用选择性代理功能

所谓选择性代理,就是对特定的URL采取特定的代理方案。拿翻墙来说,如果是墙内的网站,我们当然不想翻出去再翻进来上了,太费劲,而且还未必翻得进来。
AutoProxy在Firefox用户中很流行,就是因为它提供了针对GFW的智能代理选择功能。这是一个伟大的扩展,而与扩展本身同样伟大的,是这个项目维护的GFWList。这个列表用一些简单的规则列出了无数当前被墙的网址。
但是AutoProxy的通用性是比较受限的,据我所知,除了Firefox以外,就只有Chrome是被支持的。于是就有人写了一个叫 AutoProxy2Pac的工具,将AutoProxy的GFWList规则转换成PAC。由于主流浏览器都支持PAC,GFWList的通用性大大提 升。
但是仍然有一个问题,就是除了浏览器之外呢?一般的软件支持HTTP代理一般不会有问题,但是给它一个PAC,它的反应最多就是:“虾米?”
解决的办法,就是把选择性代理的任务交给代理服务器。准确地说,这是一个二级代理。打个比方,这就像是网购,亲们向店主妹妹下单就是了,至于店主妹 妹从哪里进货亲们是不管的。但店主妹妹就要考虑了,这匹马国内有,又是特产,必须从国内进货;那只鸟却不一样,国内绝种,得找国外的朋友代买才行。
这个店主妹妹的名字叫Privoxy。
Privoxy的好处是它支持HTTP和SOCKS的上游代理,并且允许用户使用灵活的规则配置选择性地使用代理。另外非常棒的一点是,当上游代理 为SOCKS4a/SOCKS5的时候,它会要求上游代理进行DNS解析,从而有效避免DNS污染。这一点也是PAC本身无法实现的。
那么首先简单介绍一下Privoxy的使用。注意以下提到的文件路径适用于Linux,其他系统请参考Privoxy用户手册。一个简单的例子:
{+forward-override{forward-socks5 127.0.0.1:7127 .}}
.youtube.com
这段规则是说,对于youtube.com及其子域名使用位于127.0.0.1:7127的SOCKS5代理,比如SSH、Tor等。将上面这段代码写到/etc/privoxy/gfw.action,然后编辑配置文件/etc/privoxy/config,加上:
actionsfile gfw.action
现在启动privoxy服务:
# /etc/init.d/privoxy start
Privoxy的默认监听地址是127.0.0.1:8118,现在打开浏览器,把这个地址设置为HTTP代理的地址,接着访问YouTube试试。
不出意外的话,YouTube现在是通过代理访问的,而其他被墙网站是上不去的。很自然的,这个时候我们就想到了GFWList。
AutoProxy2Privoxy是一个将AutoProxy的规则转换成Privoxy规则的Shell脚本。即使你不能运行这个脚本,你仍然可以从这里下载成品gfw.action。记住修改第一行的代理地址,然后复制到/etc/privoxy/gfw.action

from  http://cckpg.blogspot.de/2011/06/privoxy.html
-----------------------
AutoProxy2Privoxy把AutoProxy规则转换成Privoxy格式-
 https://github.com/cckpg/autoproxy2privoxy