2011年7月5日星期二

在高校等复杂网络环境通过Privoxy实现自动全能代理

本文的写作目的:辛苦管理员一个人配置好代理服务器,方便大多数使用者只需记住一个代理地址。

高校(除去少数cernet节点)网络的特点:
  1. 和所有人面对的不便一样,你懂的。
  2. 受限于cernet和所在地区ISP的政策,除上述之外访问国外正常网站时有不便
  3. 多半用各种方式实现了cernet2亦即ipv6接入
类似的还有公司(除去少数提供高速出国VPN的外企)内网

那么很可能一个高校用户面对的现实是:
  1. 大部分国内网站(所谓cernet免费列表)可以访问
  2. 无论是否学术所需,各种国外网站能否打开要凭运气
  3. 配合ipv6的hosts或dns,可以访问google(包括youtube)、facebook等对ipv6支持较为完善的网站
这时候他有可能求助于管理员,于是管理员会发现无论开ssh tunnel,改ipv6 hosts都无法单独实现无障碍+不浪费访问所有网站的需求(比如用autoproxy会导致本可以用ipv6访问的google系列服务走慢速的ssh等),再加上gfwlist和ipv6 hosts的频繁变更,乘以需要处理的电脑数量,管理员觉得自己死定了。

死之前,他知道自己需要的理想的解决方案应该满足代理调度和维护的自动化,做到:
  1. 一处配置,多处使用
  2. 手动预设,自动更新
这时候google告诉他,只要用Privoxy配合一点点计划任务就可以搞定,不用着急走。这事就这样成了。

Privoxy曾经一度很流行,但多半是因为被作为Tor套装推荐的缘故。后来随着IE使用者的减少、Chrome+Proxy Switchy!的流行,加之本身配置的不够直观慢慢淡出了。但这其实是个很强大的软件。以下基于Windows版进行说明,Linux版没什么区别。

首先请看这两篇文章:

第一篇指出了多代理调度的原理,给出了简洁有序的配置文件;第二篇作者维护的autoproxy2privoxy项目解决了应该把哪些网站丢给ssh去处理的问题。

还需要处理:
  1. (可选)搞到一个相对稳定高速的普通用途代理(From学校网络中心或者公司网管)
  2. 将有人定期维护的ipv6 hosts文件中的网站写入privoxy的action文件,调用ipv6访问
  3. 实现autoproxy2privoxy和ipv6 hosts的定时自动更新
最终具体需要做的事情如下:
  1. 在要作为你对外服务的代理的机器上安装Privoxy,做好基本的设置,比如监听地址改为
    :8118
    按照你自己的需要决定是否储存log,debug信息级别等
  2. ipv6 hosts内容加入你自己的hosts文件
  3. 打开你的ssh tunnel
  4. 修改Privoxy安装目录下的user.action文件(软件主界面菜单options→Edit User Actions),首先清空,按照第一篇文章的范例,先定义各个代理的alias和默认走高速代理或直连:
    {{alias}}
    default = +forward-override{forward high_speed_proxy_ip:port}
    direct = +forward-override{forward .}
    ssh = +forward-override{forward-socks5 ssh_tunnel_ip:port .}
    ipv6 = +forward-override{forward .}
    #==========默认代理==========
    {default}
    #你没有或不需要上层代理则注释掉上一行,用下一行
    #{direct}
    /
  5. 输入
    #==========SSH==========
    {ssh}
    复制gfw.action的内容,去掉第一行,粘贴到此文件
  6. 输入
    #==========ipv6==========
    {ipv6}
    用支持正则表达式的文本编辑器打开ipv6 hosts内容,替换下列内容为空:
    ^2\S+\s
    (删去行首2开头的ipv6地址,得到支持ipv6访问的域名列表)
    粘贴处理过后的内容到此文件
  7. 保存。
  8. 然后能够访问到你机器的人将代理设为Privoxy中设定的your_ip:port就可以无障碍上网了
一些说明和疑问,希望读者能帮忙解答:
  1. 因为autoproxy2privoxy是基于gfwlist的,可能更新不会非常及时,遇到部分网站确实无法直接访问可以在{ssh}手动添加,比如最近的flipboard,加这一行即可:
    .flipboard.com
  2. 还有个遗留的问题就是action文件过滤是基于域名的,对于部分需要用内网ip直接访问的网站不知应该如何将规则写入直连的段落,在此求教
  3. 之所以将规则都写入user.action这同一个文件是因为要确保能走ipv6的就不要走ssh提高速度,而一个文件内能确认是后面覆盖前面的,省去手动调整这两份维护得很好的列表;分别写入多个文件可能逻辑上更清晰但我不知道Privoxy对于.action的执行顺序
  4. 实际上ipv6 hosts因为受原本设计用途所限(不支持泛解析)而显得很冗长,不知道是否可以自动归并同域名(如诸多blogspot站点、appspot应用等)并添加泛解析改写为action?
  5. 自动更新的话,可以用wget、curl下载在线规则再配合随便grep、sed之类处理之后重写hosts和user.action,想必powershell肯定也行,再加上任务计划或者crontab定时更新即可
  6. 上面一条虽说是这样,但是作为脚本苦手希望有读者能贡献具体的写法……
最后感谢@ccpkgipv6-hosts对于两份列表的维护,感谢Lainme的启发。

3 条评论:

  1. 你好,请问你现在还有使用privoxy吗?
    lainme分享配置文件已经下载不到了,他也没备份。不知道当时你有下载吗?可否分享学习下?

    回复删除
    回复
    1. 现在IPV6也已经处于被日的状态了啊……所以不需要复杂的的配置了啊?
      就按照我上面说的过程,把有关IPV6的全都略过,本地起一个socks代理就行啊,不管你是用SSH隧道还是shadowsocks都无所谓……
      另外上面提到的gfw.action只是个示例文件,你需要自己用https://github.com/cckpg/autoproxy2privoxy 提供的工具跑一份最新的

      删除
    2. 我要参考他的广告过滤规则。

      删除