Thursday, June 2, 2011

使用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

至此,店主妹妹学徒毕业,正式接任。

7 comments:

  1. 挺有意思的想法,以前只知道它和tor可以搭配使用,没想到还可以这么用。

    ReplyDelete
  2. hi.
    这句话“Privoxy的好处是它支持HTTP和SOCKS的上游代理”,博主的意思是说:它除了可把socks代理转换为http代理之外,还可把http代理转换为socks代理吗?

    ReplyDelete
  3. 不是的。Privoxy只作HTTP(S)代理,所以只可以说“可把socks代理转换为http代理”,从而为不懂得SOCKS代理而懂得HTTP代理的软件使用。如果上游是HTTP代理,Privoxy只是进行过滤,而不进行协议的转换。

    ReplyDelete
  4. 谢谢你的文章,有两个地方似乎有错误。
    1.actionfiles gfw.action 正确应该是actionsfile gfw.action
    2.在windows下应该是不需要重新启动privoxy的。Linux应该也是吧。

    ReplyDelete
  5. @iBeyond
    1. 笔误已经修正, 多谢指正 :)
    2. 确实不需要重启privoxy,文章里说的启动是假定privoxy还未启动。
    谢谢!

    ReplyDelete
  6. 感谢作者维护的action文件,十分方便。在此基础上写了这个:http://specterux.blogspot.com/2011/07/privoxy_05.html 请指正

    ReplyDelete
  7. 很有帮助,按照AutoProxy2Pac的README成功配置了自动切换的代理。
    其中也碰到一个问题,就是需要在代理切换软件中选择一下对所有协议使用相同代理这个选项,否则DNS请求可能还是发送到了本地,只有HTTP的流量被代理了。
    另外对“所有协议使用相同代理这个选项”有些疑问,我使用rawcap抓包看了进入代理端口的流量,却并没有看到有DNS请求。有点奇怪,不知道是怎么回事?

    ReplyDelete