路由器广告过滤的几种实现方式 以及 利用DNS在Openwrt上实现广告过滤 您所在的位置:网站首页 怎么过滤电脑网页的广告软件 路由器广告过滤的几种实现方式 以及 利用DNS在Openwrt上实现广告过滤

路由器广告过滤的几种实现方式 以及 利用DNS在Openwrt上实现广告过滤

2024-07-04 18:50| 来源: 网络整理| 查看: 265

B站的编辑器太烂,如果有排版和显示异常,请移步隔壁知乎:

https://zhuanlan.zhihu.com/p/600302452

自很多年前运营商劫持HTTP,在网页右下角插入小广告开始,我就开始想着去除网页上的各种广告。如今,随着HTTPS等加密技术的出现,以及大多数用户逐渐从浏览器转向手机APP,去广告的方式也随之发生改变。

首先,吐槽一下现在的大学本科计算机课程,并非所有的学校都是这样,只是从我接触的身边人以及我自己的感受来看,很多大学本科计算机课程太水了,可以靠期末突击、背题、背代码的方式来及格。

我觉得作为计科的学生,不仅理论需要深入学习,还需要把理论运用到实际中,所以就写了这篇,但由于只是本科水平,所以写得就不太严谨了,就当是记录自己的想法吧。

去广告的常见方法的比较

总的来说,去广告实质上就是有一份广告资源的规则数据,发现有匹配的数据就阻断连接。本文不讨论过滤规则孰优孰劣,以下讨论均假设有一份理想的过滤规则被应用。

浏览器去广告插件

在浏览器上通过Adblock、油猴脚本等方式,发现有请求广告就直接阻断连接。

优点:方便安装,甚至有一些国产浏览器直接集成了插件

缺点:①只能过滤浏览器网页浏览的广告。②插件鱼龙混杂,有些插件会把一些异步加载的资源变成同步,导致在网络慢的情况下,网页要等一会才能加载,甚至有一些资源请求失败时整个页面都异常加载。

第三方去广告软件

安装该程序就类似于在本机127.0.0.1的某端口上打开代理,然后在系统里设置全局代理就可以让流量进入这类软件,这些软件根据IP、HTTP请求头、SNI阻断等方式匹配规则进行过滤。

优点:可以过滤非浏览器广告

缺点:①并非所有的程序都会走系统的全局代理,有的程序甚至没有代理设置选项。解决方案是使用wintun之类的虚拟网卡,配合调整路由表的方式,在驱动级别拦截流量,部署较为麻烦。②拦截粒度比较粗,可能会出现误拦、漏拦的情况,一方面,并非所有连接都能获取它请求的域名,另一方面,HTTPS只能通过SNI获取到域名,并不能获取到具体请求路径,有一种解决方案是在系统安装自己的证书来解密HTTPS流量,但这种方法的弊端是显而易见的,该广告过滤软件能监听你的所有流量。

在网关上利用DNS拦截广告

大多数软路由玩家,应该都是使用这种方式来拦截的。原理大概是DNS请求发送到网关DNS服务器,DNS服务器依据过滤规则发现请求的是广告域名,返回一个不可达的IP地址,如127.0.0.1等,进而达到广告请求失败的目的。

优点:无需在用网设备上配置

缺点:①需要一个可以配置的DNS服务器(可以是路由器),②拦截粒度比较粗,可能会出现误拦、漏拦的情况。

在Openwrt路由器上实现广告过滤

这教程太多了,因此我不想很具体讲每一种方式的部署,还是想从原理的角度来讲一讲认识,以及自己实践遇到的坑。

以下AdGuard也可以换成其它广告过滤插件,以DNS过滤广告的插件都适用。

AdGuard Home配合dnsmasq

AdGuard 也可以换成Adblock等其它插件,这是主流的方法,在dnsmasq中设置dns上游为adguard,由adguard插件识别出广告返回127.0.0.1给DNS请求。

过程:

广告的DNS请求→dnsmasq→AdGuard→返回空记录或127.0.0.1给dnsmasq→dnsmasq返回给广告程序→广告程序请求广告资源失败

我把它称为串行方式,感觉上效率是比较低的,但最容易部署。

AdGuard Home配合iptables

其实从上面的分析可以知道,dnsmasq所扮演的只是一个中间角色,那么是否可以绕过它直接将DNS请求发给AdGuard呢?答案是肯定的,假如你的广告过滤插件正在监听5353端口,只需要使用iptables重定向DNS请求即可

5353号UDP端口正在监听DNS请求,过程如下:

广告的DNS请求→iptables的PREROUTING链→目的端口53被修改为5353(实际上应该还会建立一个跟踪表项来跟踪该报文)→发送给AdGuard处理→返回的数据经过iptables被还原回源端口为53→广告程序请求广告资源失败

iptables背后的Netfilter是运行在内核态的,效率应该比上面的串行方式要好一些

AdGuard 单独使用

其实看到这里,可能读者会有这样疑惑,为什么不直接让AdGuard监听53端口,因为53端口会被dnsmasq占用。那直接给它kill掉吼不吼哇,今天实践踩坑就摔在这里了。

直接kill掉dnsmasq它还是会启动,因为它背后有一个服务,服务stop后,AdGuard则可以使用53号端口。坑的是,OpenWRT的DHCP服务也是和dnsmasq相关的,dnsmasq服务停止,DHCP也无了。解决方案有两种,一个是自己下个dhcpd等第三方程序来提供DHCP服务,彻底抛弃dnsmasq,这种方法感觉不够优雅,也会使得luci界面里一些设置看起来可用实际上不可用。

另一种方案是,在/etc/dnsmasq.conf 里写入port=0关闭DNS服务,但保留DHCP服务。

最后再说明一次,上面的AdGuard只是代指一类广告过滤软件,可以换成类似的软件。或者你有其它特殊需求的情况下,利用某软件的任意门功能也可以实现类似效果,贴个配置:

这里说明一下为什么使用127.0.0.1,理论上你使用任意未被宣告的IP地址都可以,比如19.19.8.10,只是会导致网络明显变慢。

使用19.19.8.10:

广告程序认为需要去到19.19.8.10获取广告,它向19.19.8.10发送SYN握手请求,该SYN请求在运营商的骨干路由器上,因为找不到路由而被丢弃。迟迟没有回应的情况下,广告程序多次重传SYN请求,直到一定次数失败它才肯放弃请求广告。

使用127.0.0.1:

广告程序认为需要去到127.0.0.1获取广告,它向127.0.0.1发送SYN握手请求,因为这个地址是回环地址,该SYN请求不会被发出主机,而是发给本机,因为本机没有程序在监听,系统会发出RST报文重置该连接,广告程序请求广告失败,即使它不甘心再请求,还是很快会受到RST报文,时间比上面短得多。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有