Jul 10

转自:http://bbs.et8.net/bbs/showthread.php?t=1025323

在精品论坛看到这个帖子,写得很好。由于作者写的内容是我一直想做到的,所以觉得这个帖子很有参考的价值,就原文转载过来了。最后对作者辛勤的劳动表示感谢。

家里一直用的是一台linux,利用iptables做nat当网关,以前一直都是台式机或者笔记本上网,所以基本是firefox上面用adblock搞定广告,AutoProxy科学上网。自从买了ipad和谷歌三儿子后,很多看rss订阅或者微博等类似的事情就在平板和手机上看了。因为平板和手机的反广告和科学上网能力有限,折腾起来也麻烦,就想在网关上做个代理来解决。

目的:
广告过滤
科学上网
客户端软件零配置或者尽量少的配置

工作方式:
因为定位在家庭内部使用,所以安全和性能负载不做太多考虑,不引起使用中的不便即可。

使用的软件有:
privoxy 代理服务器
iptables nat,80端口转发(可选)
一个科学上学代理(这个代理因为特殊性就不做太多说明,架设好了就行,http或者socks都可以,我这里是http的,端口8087)

http或者https请求发向privoxy代理,如果属于广告等block内容,直接block;如果属于科学上网的地址,转发至科学上网代理;其他情况,直接访问。

我的网关IP:192.168.0.2
代理1 (HTTP):192.168.0.2:8087
代理2 (SSH):192.168.0.2:8088

其中代理1速度快,允许流量大,但是部分https站点访问有问题,做为主代理。代理2为SSH socks代理,代理1不支持的站点使用此代理。

参考:SSH Socks代理的架设方式
代码:

ssh -D 192.168.0.2:8088 user(at)remote-server -N

Privoxy的配置:
安装不说了,我用的是gentoo上的 net-proxy/privoxy-3.0.17 版本,记得需要打开 threads 的USE参数,以提高性能。

然后就是配置文件的调整,配置文件有详细的说明,建议修改前看一下。
在线版本 http://www.privoxy.org/user-manual/config.html

主配置文件 /etc/privoxy/config
需要修改 listen-address 一项,改成内网的IP地址,默认8118端口不变
代码:

listen-address  192.168.0.2:8118

修改下面这行,将默认值改为1,否则会出现个错误,
代码:

accept-intercepted-requests 1

打开日志输出,显示请求和Block的地址,以备查看输出调整参数(可选)
代码:

debug 1
debug 1024

打开从页面配置privoxy的功能,可以调试某个URL在当前配置的处理流程,调试方式是将浏览器代理设置为192.168.0.2:8118,然后访问 http://config.privoxy.org/ 或者 http://p.p ,实际是privoxy在网关所在服务器的本地页面,如果未经过代理,则会跑到privoxy官网,告诉你没配置好。(可选,这个我只是用来看某URL的处理流程,页面也可以直接修改规则,不应该在不可信的环境打开本功能)

另外在/etc/privoxy目录下建两个文件
block.action 用来配置广告过滤的地址
gfw.action 用来配置科学上网的地址

修改config文件,在 actionsfile user.action 这行后面引用这两个文件
代码:

actionsfile match-all.action # Actions that are applied to all sites and maybe overruled later on.
actionsfile default.action   # Main actions file
actionsfile user.action      # User customizations
actionsfile gfw.action
actionsfile block.action

/etc/privoxy/block.action 文件内容如下,privoxy本身就有不少过滤广告的条件了,你只需要把自定义的放在这里
代码:

{ +block{Nasty ads.} }
imgs.dapenti2.com:88/dapenti/BoRZvHNE/*
.feedsportal.com

/etc/privoxy/gfw.action 注意第一行,forward 192.168.0.2:8087是将符合条件的URL转发至端口8087的http代理,如果是socks代理,需要用forward-socks4, forward-socks4a, forward-socks5 命令,详见文档。

代码:

{+forward-override{forward-socks5 192.168.0.2:8088 .}}
.clients*.google.com

{+forward-override{forward 192.168.0.2:8087}}
.google.hk.com
.facebook.com
.google.com
.fbcdn.net
.gstatic.com
.gmail.com
.twitter.com
.youtube.com
.ytimg.com
.googleusercontent.com
.feedburner.com
.ggpht.com
.imdb.com

以上两个文件的内容我选择自行维护,网上也有工具将adblocks或者autoproxy的配置转换至privoxy,我看了下动不动就转成几千行的,巨复杂,就自己维护算了。
其中匹配原则我只了解了两点,暂时够用了,其它到时再看文档。
.domain.com 匹配 domain.com, *.domain.com 以及 *.*.domain.com 等所有域名。
domain.com/ads/* 则匹配此目录下的所有文件。

当然以上两个配置文件可以合成一个或者追加的user.action里面,看你喜好。

启动服务,将浏览器/手机/或者平板的代理设置到192.168.0.2:8118后,即可看到访问地址的请求,以及被block的地址情况。Firefox浏览器依然可以搭配AutoProxy,不支持的浏览器则可以直接固定代理。一般手机或者平板代理都是设置在无线网络连接里面的,设置好就不需要修改了。把需要block或者科学上网的地址补充到两个配置文件即可。

privoxy使用的时候偶尔会有直接访问的规则,但是页面打不开的情况,不经过privoxy时又正常,这时你要看下提示是否需要关闭配置中的keep-alive-timeout,我确实碰到过这种情况。

如果对URL的处理不知道是怎么匹配的,首先设置使用privox可以到 http://config.privoxy.org/ ,使用 Look up which actions apply to a URL and why 这个功能看看是怎么处理的。

iptables的透明转发(可选)
有些程序或者应用会忽视系统的代理设置,或者你想客户端零配置,这时可以利用iptables将80端口转发给privoxy的8118端口。
代码:

iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.0.0/24 --dport 80 -j REDIRECT --to-port 8118

这台机器必需是你的网关,我的情况是网关和代理是一台。

这样,没配置代理的程序通过网关访问80端口的服务器,也会被privoxy处理。SSL端口的转发目前无法实现,SSL访问必需指定一个代理地址,不能实现透明代理方式,所以透明代理仅能带来一点点便利,看需要是否采用,我还是打开了。

最后,大功告成,享受无广告的世界。

Leave a Reply