Pages

Tuesday, 1 March 2016

Windows下搭建带有缓存与广告过滤功能的分流代理

折腾了一下软路由,把代理和DNS防污染查询都移到了上边。代理部分经过几天摸索踩了不少坑,包括Polipo莫名其妙的卡,adbyby和Privoxy过滤广告卡网等等。下边是已经使用了一段时间的解决方案。

首先,下载TcpRoute2- https://github.com/GameXG/TcpRoute2/releases

TcpRoute2是类似COW的分流代理,这里用它来完成核心的代理客户端及分流功能。

把配置文件末尾的example去掉,然后按照提示修改配置文件。

我的配置是:

addr="127.0.0.1:7070"
PreHttpPorts=[0,]
PreHttpsPorts=[0,]

[[UpStreams]]
Name="direct"
ProxyUrl="direct://0.0.0.0:0000"
DnsResolve=true
[[UpStreams.Whitelist]]
Path="https://raw.githubusercontent.com/GameXG/TcpRoute2/master/direct.txt"
UpdateInterval="24h"
Type="suffix"
[[UpStreams.Blacklist]]
Path="direct/blacklist.txt"
UpdateInterval="24h"
Type="suffix"

[[UpStreams]]
Name="SS-HK"
ProxyUrl="ss://aes-256-cfb:password@ip:port"
DnsResolve=false
Credit=0
Sleep=200
CorrectDelay=75
[[UpStreams.Whitelist]]
Path="ss-hk/whitelist.txt"
UpdateInterval="24h"
Type="suffix"
[[UpStreams.Blacklist]]
Path="ss-hk/blacklist.txt"
UpdateInterval="24h"
Type="suffix"

[[UpStreams]]
Name="SS-SG"
ProxyUrl="ss://aes-256-cfb:password@ip:port"
DnsResolve=false
Credit=0
Sleep=200
CorrectDelay=75
[[UpStreams.Whitelist]]
Path="ss-sg/whitelist.txt"
UpdateInterval="24h"
Type="suffix"
[[UpStreams.Blacklist]]
Path="ss-sg/blacklist.txt"
UpdateInterval="24h"
Type="suffix"

[[Hosts]]
Path="hosts.txt"
Type="base"

[[Hosts]]
Path="http://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext"
Type="base"
UpdateInterval="24h"

因为是5.0版的时候写的配置,可能会有一些缺少的新特性的参数。我为直连、SS-HK以及SS-SG各自建立了一个文件夹,方便在需要时对黑白名单进行配置。yoyo的这个hosts是在源头对一些广告服务器进行屏蔽,这样这些广告的请求压根不会产生网络流量。

配置完成之后启动TcpRoute2Windows.exe并把它设为开机自动启动,TcpRoute2就开始监听7777端口了。

TcpRoute2和SS一样提供socks5代理,不过一些程序,特别是OSX上对socks5支持没HTTP代理那么好。所以在下面可以用Privoxy来做一层转化。

下载Privoxy-http://sourceforge.net/projects/ijbswa/files/ ,安装。

修改配置文件为:

listen-address 127.0.0.1:8117
forward-socks5 / localhost:7070 .

保存。之后运行Privoxy,这样Privoxy就开始监听8117端口提供HTTP代理了。

Privoxy是一个轻量级的代理软件,虽然可以使用规则对代理内容进行过滤(比如adbyby就是它的延伸版本),但实际测试中会有很严重的性能问题。所以这里只是单纯将它作为协议转换来使用,更加复杂的功能交给squid来完成。

下载squid for windows-http://squid.acmeconsulting.it/Squid27.html(XP比较方便的就只有预编译的2.7了,Win7或以上64位的可以下3.5的安装包),同时下载SoftPerfect RAM Disk- https://www.softperfect.com/products/ramdisk/。因为要加缓存,会对储存介质造成比较频繁的读写。用SoftPerfect RAM Disk建立一个RAM Disk可以防止长期读写对硬盘造成伤害,如果觉得无所谓的可以就用硬盘来做缓存目录。。

将squid文件夹移到C盘下,进入etc目录去掉配置文件的后缀。编辑squid.ini,找到:

#Default:
http_access deny all

改完:

#Default:
acl ads dstdom_regex "C:\squid\share\ads.txt"
http_access deny ads
http_access allow all

然后在配置文件尾部加上

header_access Via deny all
header_access X-Forwarded-For deny all
http_port 8118
cache_peer 127.0.0.1 parent 8117 0 no-query default
never_direct allow all
cache_dir ufs r:\ 120 16 256

保存,下载 广告过滤规则- http://pgl.yoyo.org/adservers/serverlist.php?hostformat=squid-dstdom-regex&showintro=0&mimetype=plaintext,并存为C:\squid\share\ads.txt。

header_access的两条作用是阻止squid将你的内网IP放在HTTP头中发送出去,cache_peer是上级代理,也就是Privoxy的HTTP代理的地址和端口,cache_peer后面的r:\和120是缓存目录的路径与大小。

使用cmd运行 C:\squid\sbin\squid -i 来安装squid的服务。然后使用SoftPerfect RAM Disk新建一个开机自动挂载的RAM Disk,大小130M,盘符为r。

新建一个批处理,内容为:

C:\squid\sbin\squid.exe -z
sc start Squid

并在SoftPerfect RAM Disk的工具→应用程序中添加这个批处理。因为缓存目录是RAM Disk,squid必须在内存盘挂载之后才可以启动。这个批处理负责在SoftPerfect RAM Disk挂载r盘之后,对它进行初始化,并启动squid服务。

最后,将 127.0.0.1:8118 设为IE浏览器的代理,大部分支持HTTP代理的软件就会自动读取IE浏览器的代理设置来使用代理了。

TcpRoute2会选择所有线路中最快的一条(或者直连)来进行连接,可以是多台上级SS选择最优线路,也可以是亚洲的主代理和搬瓦工的应急备用代理做故障转移。默认的直连白名单中包含了大量使用海外IP无法正常访问的国内网站(比如网易云音乐),如果在使用中出现不需要走代理的网站被走了代理,只需要将它添加进直连的白名单中就可以了。

yoyo的squid规则比hosts范围要大很多,使用代理时包括大部分国内网站的广告都会被过滤掉。而squid强大的缓存功能在内网会压根感觉不到延迟,开过一次的网站再次打开时加载速度会非常的快。

广告过滤也可以使用Adguard来完成,它支持设置上级代理以及开启自身的HTTP代理,只需要在squid与Privoxy之前再加一层HTTP代理转发就可以了。理论上它应该是比yoyo的规则更好用,不过我那台x86的软路由实在装不下.NET,只能作罢。

在目标网页无法显示的时候,会显示Privoxy的错误页。和我一样强迫症感觉那个页面丑Privoxy\templates\no-server-data 改完自己喜欢的萌化错误页模版就可以了。