Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。
文章代表作者个人观点,少数派仅对标题和排版略作修改。
如果你有在多设备上对去除广告的需求,AdGuard Home 或许是一个不错的选择,它能够给你带来一个清爽的网络世界。
一个好产品,需要广而告之,才能活下去,一部好影片,需要广而告之,才有好的票房。因此便有了广告。从最初的口口相传发展到今日的「千人千面、猜你喜欢」,广告已从单向的传播形式发展成为基于个人喜好专门投放,用户的接受权由主动变为被动。
但当广告时时刻刻充斥在我们的生活,看新闻有贴片广告,刷朋友圈有欧巴的互动广告,看电视剧有 90 秒片头广告,小网站上还有 * 感荷官在线发牌,在《一千五百万个积点》1中,男主居住在一个被屏幕环绕的房子里,屏幕全天候地播放广告,想要屏蔽广告只能选择付费,甚至在你屏蔽广告后还会提醒用户「为了网站的持续发展,请关闭广告屏蔽插件」,为了正常浏览网页,用户也只能妥协。
并非所有广告都是侵入性、影响用户体验的广告,其中不乏制作精良、体验良好的广告,在由 The Coalition for Better Ads 提出的 Better Ads Standards 中,边栏广告、小型贴片广告、顶栏 / 底部广告对用户的浏览体验影响较小,浮窗广告、大型 / 全屏贴片广告、自动播放的视频广告则会影响用户心情。而用户只能选择全部屏蔽,广告商的收益会受到极大的影响。除了广告,一并被屏蔽掉的还有信息收集与分析工具,如 Google Analytics,此类工具可以在不过分侵犯用户隐私的前提下帮助网站主改善网站运营,提供更好的内容。
广告拦截插件的实现原理大致可分为三种 —— Url 匹配屏蔽、流量过滤、网页 DOM 过滤。前两者属于 Request Blocking,后者属于 Page Code Filtering & CSS Injection and JavaScript2。
广告联盟的广告资源通常会与网站站点分开放置,以百度联盟为例,百度联盟的广告域名为 https://cpro.baidustatic.com/
,因此我们可以单独屏蔽来自 https://cpro.baidustatic.com/
的内容,同时不会影响网站内容的正常加载。当网站域名与广告资源域名相同时,基于 Url 匹配的广告屏蔽方法如同「南橘北枳」。
DOM(Document Object Model,文件物件模型),在 W3C DOM 标准3下,网页中的任何一个标签、元素都是树状结构中的一个节点。网页 DOM 过滤广告弥补了基于匹配 Url 屏蔽广告的缺点,通过 CSS3 Selector 定位到广告 DOM 元素,使用 display=none!important
等语法隐藏广告。DOM 过滤过程发生在网页加载时,缺点是无法拦截通过 Ajax、Pjax 新加载的广告内容。
在实体网关 / 虚拟网关处设置过滤器,对具备广告特征的流量实施拦截,如网站使用了 Https 加密,则采取 MITM(Man-in-the-middle attack,中间人攻击)对 Https 加密流量进行解密,并对其中的广告流量进行拦截,这一功能在部分第三方路由器固件非常常见,如 KoolProxy、广告屏蔽大师 Plus。
在解密前,客户端上需要安装并信任由广告拦截软件生成的证书,如果网站采取了 Https 加密并需要验证证书,流量过滤的广告拦截功能则会影响网页的正常浏览。此外,如果设备性能偏低,这种拦截方式一定程度上会减慢网速。
以往我们习惯在电脑浏览器上使用 AdBlock Plus、AdGuard、Ghostery、uBlock Origin 之类的广告拦截与隐私防护插件,从而去除网页上扰人的广告。对于 Android 与 iOS,受限于系统权限(如 Root 权限、系统证书与用户证书)、过滤模式,想在手机上「找到一块净土」,需要花费一番功夫。
上述方法操作后只对单个设备生效,随着设备数量的增加,逐个逐个去设置十分麻烦,此外还会增加软件的订阅费用,面对智能电视、智能音箱,传统的广告拦截软件难以应付。而如果家中有使用软路由、NAS 甚至是树莓派,不妨试试在上面安装 DNS 广告拦截软件,实现网关级的广告拦截。
今天向大家介绍的 DNS 广告过滤软件是 AdGuard 团队开发的 AdGuard Home。
AdGuard Home 是一款全网广告拦截与反跟踪软件。在您将其安装完毕后,它将保护您所有家用设备,同时您不再需要安装任何客户端软件。随着物联网与连接设备的兴起,掌控您自己的整个网络环境变得越来越重要。
—— AdGuard Home
AdGuard Home 是 AdGuard 开源的一个私人 DNS 服务端,只需在网关部署,即可实现全局域网的广告拦截与隐私反追踪。在 DNS 解析的过程中,匹配规则库内的 Url 进行拦截,同时在客户端中,还可以通过自定义过滤规则实现网页 DOM 的拦截。
基于 Golang 编写的 AdGuard Home,官方支持 运行在 Linux 32 位 / 64 位 / ARM(v6 / v7)/ MIPS、FreeBSD、Windows、macOS、Docker 内,以及由第三方开发者维护的 OpenWrt 软件包 、Home Assistant 拓展 和 Arch Linux。
由于篇幅限制,下文将介绍如何 NAS(系统:Debian 10)以及 Windows 电脑(系统:Windows 10)上安装与配置 AdGuard Home,其它设备请查看 AdGuard Home - Wiki 中的介绍或网友们的教程。局域网中的 DNS 服务器推荐运行在软路由、NAS 或树莓派等长期保持开机的设备上,避免因设备关闭导致 DNS 无法正常解析。
本人不推荐在普通路由器上运行 AdGuard Home、Pi-Hole 等工具,路由器的性能对 AdGuard Home 的运行效率有着较大影响。根据本人测试,Pi-Hole 空载需占用 15MB 内存(不含缓存),AdGuard Home 空载需占用 20 MB 内存(不含缓存),AdGuard Home 带机 13 台、过滤规则 74000+ 条时占用 700MB 内存(含缓存)。
AdGuard Home 支持以二进制文件、Docker 容器两种方式安装、运行,可以根据个人喜好选择合适的方式安装。如果运行设备的系统涉及到重要业务的运行,如 NAS 文件存储、Web 服务器等,推荐使用 Docker 安装,不易受到业务应用的影响。
- 以下教程需要一定的计算机操作基础、路由器使用基础与服务器使用基础
- 下文的需要使用的信息如下所示,不同用户的设置有所差异,请自行更改
- NAS 局域网 IP:10.2.168.100
- AdGuard Home 后台地址:http://10.2.168.100:3000
- 私人 AdGuard Home DNS 地址:10.2.168.100:53
前往 AdGuard Home 官网 下载安装包。
下载二进制文件
使用浏览器 / 下载工具下载:https://static.adguard.com/adguardhome/edge/AdGuardHome_windows_amd64.zip
解压压缩包得到 AdGuardHome.exe
文件
将 AdGuardHome.exe
移动到 C:\Program Files\AdGuard_Home
文件夹中
以管理员身份打开命令提示符,执行以下命令
cd "C:\Program Files\AdGuard_Home"
.\AdGuardHome.exe --service install
当提示 AdGuard Home is successfully installed and will automatically start on boot.
即表示 AdGuard Home 在当前系统上安装成功。在命令行中会显示管理后台的地址与端口,默认为 http://IP:3000
。
Linux 用户需使用 root 用户登入 SSH,并执行对应系统版本的命令。
下载、解压、移动二进制文件
#Linux x64
wget https://static.adguard.com/adguardhome/edge/AdGuardHome_linux_amd64.tar.gz -O AdGuardHome.tar.gz
#Linux i386
wget https://static.adguard.com/adguardhome/edge/AdGuardHome_linux_386.tar.gz -O AdGuardHome.tar.gz
#Linux ARMv7
wget https://static.adguard.com/adguardhome/edge/AdGuardHome_linux_armv7.tar.gz -O AdGuardHome.tar.gz
#Linux ARMv6
wget https://static.adguard.com/adguardhome/edge/AdGuardHome_linux_armv6.tar.gz -O AdGuardHome.tar.gz
为了方便管理,我们将二进制文件移动到 /usr/local/AdGuard_Home/ 文件夹中。
#解压
tar xvf AdGuardHome.tar.gz
#移动文件
mkdir /usr/local/AdGuard_Home
mv AdGuardHome/AdGuardHome /usr/local/AdGuard_Home
安装 AdGuard Home 到系统中
cd /usr/local/AdGuard_Home
./AdGuardHome --service install
当提示 AdGuard Home is successfully installed and will automatically start on boot.
即表示 AdGuard Home 在当前系统上安装成功。在终端上会显示管理后台的地址与端口,默认为 http://IP:3000
。
除了直接安装到系统,我们还可以通过 Docker 来安装 AdGuard Home。安装 Docker、添加 Docker 镜像源的教程请自行搜寻。
部署准备
#拉取 AdGuard Home Docker镜像
docker pull adguard/adguardhome
#设置 AdGuard Home 的配置文件存储位置
mkdir /etc/AdGuard_Home/
创建容器
#创建 AdGuard Home 容器
docker run \
--name AdGuard_Home \
-v /etc/AdGuard_Home/:/opt/adguardhome/work \
-v /etc/AdGuard_Home/:/opt/adguardhome/conf \
-p 53:53/tcp -p 53:53/udp -p 67:67/udp -p 70:68/tcp -p 70:68/udp -p 3000:80/tcp -p 446:443/tcp -p 853:853/tcp -p 3000:3000/tcp \
--restart=always \
-d adguard/adguardhome
创建容器前务必检查端口是否会发生冲突,因为我的 NAS 使用了 OpenMediaVault,53(Debian / Ubuntu 系统中的本地 DNS 服务器)、68(DHCP 客户端)、80(OpenMediaVault 网页后台)、443(Https)端口会发生冲突,便将对应端口调整为 70、446、3000,53 端口冲突可通过关闭本地 DNS 服务器解决。如有端口被占用,可以通过 netstat -tunlp | grep 端口号
查询占用进程。
容器部署成功后,通过 http://IP:3000
成功打开安装界面即表示部署成功。
在浏览器中打开 AdGuard Home 的后台,进入安装向导,点击 “开始配置”。默认后台地址为:http://IP:3000/
将后台的访问端口更改为 3000,避免与 NAS 后台的 80 端口发生冲突,DNS 端口保持为 53 即可。
安装完成后,我们还需要进一步的设置,根据需要作出一定的优化。
不同地区连接至 DNS 服务器的速度各有差异,各位可以通过 Ping 测速的方式寻找当地连接延迟最低的 DNS 服务器。更多 DNS 服务器可以在 AdGuard 文档中找到。
DNS 提供商 | 类别 | 地址 |
阿里 | IPv4 DNS | 223.5.5.5 |
IPv6 DNS | 2400:3200:baba::1 | |
DNS-over-Https | https://dns.alidns.com/dns-query | |
DNSPod | IPv4 DNS | 119.29.29.29 |
DNS-over-Https | https://doh.pub/dns-query | |
114 | IPv4 DNS | 114.114.114.114 |
IPv4 DNS | 8.8.8.8 | |
IPv6 DNS | 2001:4860:4860::8888 | |
DNS-over-Https | https://dns.google/dns-query | |
Cloudflare | IPv4 DNS | 1.1.1.1 |
IPv6 DNS | 2606:4700:4700::1111 | |
DNS-over-Https | https://dns.cloudflare.com/dns-query |
为了更好地发挥 AdGuard Home 去广告的功能,仅依靠默认的过滤规则是不够的,但也不宜过多,过多的过滤规则会影响解析的速度,各位可以根据需要添加过滤规则。
名称 | 简介 | 地址 |
---|---|---|
AdGuard DNS Filter | AdGuard 官方维护的广告规则,涵盖多种过滤规则 | https://raw.githubusercontent.com/AdguardTeam/FiltersRegistry/master/filters/filter_15_DnsFilter/filter.txtv |
EasyList | Adblock Plus 官方维护的广告规则 | https://easylist-downloads.adblockplus.org/easylist.txt |
EasyList China | 面向中文用户的 EasyList 去广告规则 | https://easylist-downloads.adblockplus.org/easylistchina.txt |
EasyPrivacy | 反隐私跟踪、挖矿规则 | https://easylist-downloads.adblockplus.org/easyprivacy.txt |
Halflife 规则 | 涵盖了 EasyList China、EasyList Lite、CJX ’s Annoyance、乘风视频过滤规则,以及补充的其它规则 | https://gitee.com/halflife/list/raw/master/ad.txt |
Xinggsf 乘风过滤 | 国内网站广告过滤规则 | https://gitee.com/xinggsf/Adblock-Rule/raw/master/rule.txt |
Xinggsf 乘风视频过滤 | 视频网站广告过滤规则 | https://gitee.com/xinggsf/Adblock-Rule/raw/master/mv.txt |
MalwareDomainList | 恶意软件过滤规则 | https://www.malwaredomainlist.com/hostslist/hosts.txt |
Adblock Warning Removal List | 去除禁止广告拦截提示规则 | https://easylist-downloads.adblockplus.org/antiadblockfilters.txt |
Anti-AD | 命中率高、兼容性强 | https://anti-ad.net/easylist.txt |
Fanboy’s Annoyances List | 去除页面弹窗广告规则 | https://easylist-downloads.adblockplus.org/fanboy-annoyance.txt |
以浏览国内网站为主的用户可以使用 anti-AD + Halflife 过滤规则,如有浏览国外网站的需要,可以根据需要添加 AdGuard DNS Filter、Fanboy's Annoyances List 等规则。不同规则之间会存在重叠的情况,可以通过 AdGuard Home 的拦截日志分析哪些规则的使用频率最高,哪些规则拦截频率最低,再加以取舍。
完成 AdGuard Home 的设置后,便可将 AdGuard Home 的 DNS 地址部署到局域网设备上。
不同品牌路由器修改的方法各有差异,具体步骤可参照说明书或网上的教程(路由器型号 + 更改 DNS),下方以 Redmi AC2100 路由器为例。
打开并登录路由器的后台管理页面。
在局域网设置中找到 DNS 设置,将首选 DNS 服务器更改为 AdGuard Home 的 DNS 地址,可设置为其它的 DNS 服务商,避免因 AdGuard Home 服务器宕机而导致局域网无法访问互联网。更改完成后点击保存即可。在路由器更改 DNS 后,局域网内的所有设备的 DNS 解析都会通过 AdGuard Home DNS 完成,实现过滤广告与反隐私跟踪。
Android 设备
iOS 设备
macOS 设备
Windows 设备
使用 AdGuard Home 处理局域网中的 DNS 请求后(时长 12 小时),有 6% 的 DNS 请求被拦截下来。在客户端上,浏览网页时的浮窗广告、页面弹窗都能够被阻挡,一些隐私追踪服务同样也被 AdGuard 屏蔽。
当然,AdGuard Home 也不是万能的,在官方文档中说到,面对广告资源域名与网站域名相同、Twitch 广告、YouTube 视频广告、国外社交平台上的赞助推文,AdGuard Home 无能为力,只能借助 Adblock Plus、AdGuard、uBlock Origin 等内容拦截工具。
在 Linux 设备上运行 AdGuard Home,通常会出现 53(本地 DNS 服务器)、68(DHCP 客户端)、80(Http)、443(Https) 端口冲突的问题,可以通过 netstat -tunlp | grep 端口号 查询占用进程。有两种解决方案:使用不同端口、停用冲突进程。
如果是通过 Docker 方式运行 AdGuard Home,出现 listen udp 0.0.0.0:53: bind: address already in use
的提示,需要手动处理,方法如下:
#停止 DNSStubListener
systemctl stop systemd-resolved
#创建文件夹(如果不存在)
mkdir /etc/systemd/resolved.conf.d/
#使用 Nano 创建配置文件
nano /etc/systemd/resolved.conf.d/adguardhome.conf
在编辑器中粘贴以下内容:
[Resolve]
DNS=127.0.0.1
DNSStubListener=no
保存后执行以下命令。
#创建备份
sudo mv /etc/resolv.conf /etc/resolv.conf.backup
#将 /etc/resolv.conf 链接至 /run/systemd/resolve/resolv.conf
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
#重启 DNSStubListener
systemctl restart systemd-resolved
完成后使用 netstat -tunlp | grep 53
命令检查是否依旧有进程占用 53 端口,如无冲突,重启 AdGuard Home 容器即可。
以下几个因素会使 AdGuard Home 的处理时间过长:
完成以上步骤后使用体验比没有使用 AdGuard Home 还要糟糕,问题有亿点严重了。这个时候需要查找 AdGuard Home 的日志,寻找问题的原因。
如果一些网页被 AdGuard Home 误杀,可以在 AdGuard Home 的日志寻找是否被拦截。如果与规则发生冲突,需要将误杀网址通过自定义过滤规则添加至白名单中,或选择其它的过滤规则。常见的冲突有网站统计服务(Google Analytics)、广告联盟等。
AdGuard Home 的过滤规则兼容 Adblock 语法、Hosts 语法及 Domain-only 语法。
语法 | 作用 |
---|---|
| 拦截 example.org 域名及其所有子域名 |
| 放行 example.org 及其所有子域名 |
| 将 example.org 解析到 127.0.0.1 |
| 阻止访问与 example_regex_meaning 匹配的域 |
| 只是一条注释 |
| 只是一条注释 |
可以。Surge 与 Clash 分别提供了 dns-server
与 dns-nameserver
字段以供用户修改 DNS 解析服务器,在配置文件中填入 AdGuard Home 的 DNS 服务器地址即可。
如果你有在多设备上对去除广告的需求,恰巧手上有一台可以发光发热的树莓派、软路由、NAS 甚至是旧电脑,AdGuard Home 或许是一个不错的选择,它能够给你带来一个清爽的网络世界。同类的工具还有 Pi-Hole,升级到 5.0 版本后,除了缺乏多语言支持、内置的过滤器选择较少、兼容性弱于 AdGuard Home 的不足外,使用体验与 AdGuard Home 无太大差异。
> 下载少数派 客户端 、关注 少数派公众号 ,了解更妙的数字生活 🍃
> 想申请成为少数派作者?冲!