手机上使用privoxy过滤广告

需求

需要在手机上过滤广告,并且还要能畅通访问互联网
过滤广告可以用Adguard,访问互联网可以用各种梯子。
但是不管是Adguard还是梯子都使用VpnService来实现,这样功能需求就互斥无法同时使用了。

原先的实现方案

后来经过一番摸索,发现Adguard可以设置出站代理,而ss的Android客户端可以仅提供socks5端口而不使用VpnSerive
那么整个流程就可以设置为 系统流量->Adgurad去广告->ss国内外分流->直连/梯子
整个方案确确实实解决了过滤广告和互联网访问的问题,已经使用了很长一段时间了。
但是一直存在一个问题,国内很多网站都会遇到dns无法解析的问题,如微信公帐号的内容,而把Adguard的出站代理去掉又是正常的。
另一方面,最近国际出口的qos做得太狠了,一直到半夜2点丢包还能达到40%,而延迟一直在50ms以内。因此需要想办法使用能够缓解qos问题的其他方案。

privoxy方案

由于Android有termux可以用,因此在Android手机上运行privoxy是个可行的方案。
具体思路为,将adb规则转换为privoxy的配置(action/filter)来提供广告过滤功能,并且将gfwlist转换为流量路由规则提供互联网访问功能。
最后的流程为 系统流量->http代理客户端->privoxy->直连/梯子客户端
其中privoxy和梯子客户端都可以运行在termux当中。
而http代理客户端目前只找到Clash for Android能够提供需要的功能(以VpnService形式将系统流量转发到http代理)。

配置梯子客户端(可选)

什么梯子都行,只要能提供privoxy能够转发的代理接口就行。
当然,如果只需要过滤广告,那么这步可以省掉直接将过滤广告后的流量放行即可。

配置gfwlist的privoxy规则(可选)

如果不需要互联网访问或者只需要全局,那么这步可以不做。
使用现成的脚本解决掉这一步。

广告过滤

使用adblock2privoxy生成广告规则。
在termux中无法安装ghc,所以选择了直接在下载页面下载可执行程序,在电脑上生成好规则后再放手机上用。
如果只使用easylist那几个规则,直接下载生成好的规则也行。我这里用的是uBlock的规则,还有一些国内的CJX列表Easylist China来针对国内广告。
我的目的在于过滤应用内广告,浏览器已经都第三方扩展处理广告了,所以不再开nginx服务器来提供css隐藏元素支持。需要css支持的话还需要在生成规则时指定nginx的端口.

http代理客户端

只有找到Clash for Android能用。将privoxy监听的ip:port通过api转换规则后导入clash客户端。
用的http代理,所以生成页面中客户端选择Clash,订阅链接使用tg形式tg://http?server=1.2.3.4&port=233&user=user&pass=pass&remark=Example
其中serverport为privoxy的ip(一般监听127.0.0.1就够了)和端口.userpass为空的情况下可以去掉。

Clash的设置中将termux设置黑名单,不将termux的流量进行过滤,否则会造成流量传输死循环。
运行Clash后将规则模式设置为全局,否则国内流量将直接发送不走广告过滤流程。

为什么不直接Adgurad+梯子或者Adgurad->privoxy呢

梯子本身没有国内外路由规则,单纯所有流量都走梯子。
国内外网站路由要靠privoxy来实现,而Adgurad->privoxy有个问题。
Adgurad对于出去的代理是不带原始网站信息的,也就是说所有网页访问Adguard都会自己做dns解析,然后流量都以ip:port形式去请求出口代理。
这样privoxy由于收到的请求没有携带原始信息而无法做任何路由规则,所有流量一样都走梯子了。
对于国内外分流gfwlist内容其实不太全,很多国外网站需要走梯子的情况覆盖不到,所以根据国内外ip分流是比较理想的路由规则。

跟原来一样Adguard->privoxy,以请求的ip判断是否国内流量理论上是可以实现的(根据AS号分配表生成匹配规则之类)。
但是这个表更新或许比gfwlist还频繁,处理也要另外程序处理。试了一下单纯表下载花了5分钟,过滤出国内分配的网段8521条。不太能行

update

用了个简单粗暴的方法解决了根据ip规则的问题。
privoxy规则设置2份,第一份只做广告过滤,第二份同时过滤广告和走梯子,不再用gfwlist了。分别监听2个端口,开2个privoxy进程。
修改clash配置,所有路由规则通过clash来做就好了。

@

Show Comments