☰
基于树莓派5与OMV7部署AdGuard Home,实现家庭DNS去广告与提速实战
2026/9/28 19:31:54 网站建设 项目流程

家里智能设备一多,广告也跟着多起来。智能电视开机先放15秒广告,手机App打开弹窗“福利”,连个NAS下载都要忍受套娃推广。这些烦人东西其实有一个共同入口:DNS。我折腾了一套方案,用树莓派5跑OpenMediaVault 7(也就是常说的OMV7),在上面部署AdGuard Home,直接从DNS解析层面把广告域名掐掉,电视、手机、电脑,全家设备一起清静。这套方案不只是去掉广告,顺带把局域网域名解析速度也拉高了一截,打开网页明显更跟手。适合有一点Linux基础、手里有树莓派或者打算搞家庭服务器的人参考。

这套组合我用了大半年,中间换过思路、踩过不少坑,文章里会把完整过程和排查经验都写出来。技术原理不绕弯子,直接给可落地的操作方法,你照着做就能在自己家里把AdGuard Home跑起来。

1. 方案选型:为什么是树莓派5+OMV7+AdGuard Home

1.1 树莓派5做家庭服务器,性能够用且稳

先解决最重要的问题:用什么设备跑。树莓派5相比前代提升非常明显,四核Cortex-A76,主频最高能到2.4GHz,配上8GB内存版本,跑DNS解析服务完全是杀鸡用牛刀。AdGuard Home本身是Go语言写的,CPU和内存占用极低,实际跑起来内存占用也只有一两百MB,树莓派5这块CPU应付几千个查询日志绰绰有余。

更重要的一点是功耗。家里如果要7x24小时跑一个DNS过滤服务,设备功耗不能太高。树莓派5整机功耗也就几瓦到十几瓦之间,比一台旧电脑、软路由省电得多。而且树莓派5自带千兆网口,在DNS这类小包转发场景下,千兆和百兆差距不大,但也不是说没差别,至少后续你想在树莓派上挂别的服务,千兆网口不会成为瓶颈。

我建议买8GB版本,多出来的内存不是给AdGuard Home用的,是给你后续折腾其他服务留余地。毕竟树莓派5买回来一机多用是常态,光跑一个DNS过滤有点浪费。供电一定要用官方USB-C电源,树莓派5对电源质量比较敏感,劣质电源会导致瞬间电压跌落重启,DNS服务中断会让全家断网,这就很伤。

1.2 用OMV7做底座,省掉裸机配置的碎活

树莓派装完系统以后,直接跑Docker和AdGuard Home其实也行,命令敲完就完事。但问题是下次你还要装个Samba共享、挂个硬盘做轻NAS、给家里搞个相册备份,如果每次都是裸机命令行配置,前面配置的系统服务、挂载点、用户权限全部要重来一遍。OMV7(OpenMediaVault 7)这套基于Debian的开源NAS系统,实际上就是给树莓派加了一个Web管理面板和一套成熟的存储管理体系。

OMV7底层就是Debian,树莓派生态完全兼容。它的插件系统里自带omv-extras,装了之后可以很方便地启用Docker仓库,然后在Web界面管理Docker容器和镜像。比如AdGuard Home的容器,我可以直接在OMV7的Web UI里查看运行状态、看日志、重启,不用每次SSH进去敲docker命令。我配置的硬盘共享、SMB服务,也和家里的Windows、小米电视连接得非常好,一个系统把存储和DNS全干了。

选OMV7的另一个理由是不折腾系统。裸机用Debian的话,你还需要自己配置防火墙、管理用户、处理软件源、设置开机自启。OMV7这些全都帮你做好了,图形界面点两下就能完成大部分操作。我试过用树莓派5直接装Ubuntu Server来跑AdGuard Home,确实轻量,但后续给家人开共享文件夹、挂移动硬盘做备份时,就发现还是得有个Web面板才方便。

1.3 AdGuard Home比Pi-hole更契合国内家庭场景

做DNS过滤,很多人第一反应是Pi-hole。Pi-hole的老牌优势在生态,但有两个问题在国内家庭环境里比较头疼:一是国内魔改版的App和电视系统用了一些非标准解析链路,需要细细调,Pi-hole的规则生态更偏欧美网站;二是Pi-hole的配置和界面相对复杂,对非专业家庭用户不太友好。

AdGuard Home的优势在于它本身就是商业广告屏蔽软件AdGuard的开源核心项目,规则过滤的适配性做得很细,支持DNS、IPv6、DNSCrypt,面板中文支持也好,看拦截日志、添加白名单都是在网页上点选,学习成本低很多。而且AdGuard Home自带“DNS拦截清单”体系,可以直接订阅社区维护的规则列表,也支持自定义规则。

就家用场景而言,AdGuard Home的“查询日志”功能是真的能救命。谁家哪台设备在访问什么域名,一目了然。排查某些刁钻App不能播放的问题时,看日志就能定位到具体是哪个域名被拦了,比单纯加黑名单灵性很多。

2. 环境搭建:树莓派5从烧录到跑起OMV7

2.1 硬件清单与系统烧录

我实际用到的硬件和工具这里列一份完整清单,避免你卡在某一步:

  • 树莓派5(推荐8GB版)
  • 官方USB-C电源(5V/5A,别的电源容易掉电)
  • 64GB以上TF卡,或者建议直接用USB转SATA/SSD硬盘盒引出系统盘
  • 读卡器、另外准备一台电脑用于烧录系统
  • 一根网线,直接连接树莓派到路由器

TF卡在持续写入场景下寿命和速度都不太行,如果是长期7x24小时跑服务,我强烈建议你把系统直接装在USB固态硬盘上。树莓派5原生支持从USB启动,把PI OS Lite系统镜像烧录到SSD里,插上USB口,通电就能启动,容量和稳定性都好很多。

烧录系统用的是树莓派官方的Raspberry Pi Imager,也有跨平台版本。选择“Raspberry Pi OS Lite (64-bit)”这个不带桌面环境的版本,跑服务用纯命令行的Lite版最合适,桌面环境既占资源又没什么用处。烧录的时候注意,Imager里在配置阶段就能预设账号密码、开启SSH服务,直接填好,省得后续再用显示器键盘去操作。烧录完成后,把SSD插到树莓派上,网线接路由器,通电等待一两分钟,就可以从电脑SSH登录了。

2.2 安装OMV7的完整流程

树莓派开机后第一件事就是更新系统,保证后续软件源和内核一致:

sudo apt update && sudo apt upgrade -y sudo reboot

然后安装OMV7。官方脚本方式最省事,但需要从GitHub拉取安装脚本,网络畅通时执行一次就行。脚本会把Debian系统切成OMV7环境,中间会有一些交互提示,大部分时候按默认一路继续即可:

wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash

这个脚本执行时间取决于树莓派5性能和网络速度,我跑一次大约十几分钟。安装完之后,Web管理面板地址就是树莓派当前的IP,默认端口80,比如http://192.168.1.100,默认用户是admin,默认密码是openmediavault,登录后修改密码。

这里插一句,OMV7基于Debian 12,系统里自带的软件源可能在国内速度一般。你如果访问官方源很慢,可以自行换成国内镜像源,但注意不要同时启用多个不同类型源,容易包冲突。我用的是清华源,速度稳定,OMV的包也都能正常更新。

2.3 在OMV7里准备好Docker运行环境

OMV7本身不带Docker,需要通过插件装。具体路径是“系统”->“插件”->“omv-extras”,找到它并启用。启用之后在“系统”->“OMV-Extras”界面里勾选Docker仓库,然后保存和安装。这样一来,OMV的“服务”菜单里就会出现“Compose”和“Docker”两个子菜单,后续镜像拉取、容器启停都可以在Web界面操作。

如果你习惯命令行,也可以直接在SSH里安装Docker,用Docker官方脚本:

curl -fsSL https://get.docker.com | sudo bash sudo systemctl enable docker && sudo systemctl start docker

装好后顺手把当前用户加入docker组,免得每条命令都要加sudo:

sudo usermod -aG docker $USER

这一步别省。不加的话,每次docker compose都要sudo,日志权限、目录挂载的权限问题会让你后期很煎熬。装完Docker,后面部署AdGuard Home就顺畅了。

3. AdGuard Home核心部署与配置

3.1 用Docker Compose一次性拉起服务

树莓派上跑AdGuard Home,我推荐用Docker方式而不是直接apt安装。好处是后续升级、备份、迁移都方便,不会在系统里洒一地把控件。而且OMV7里自带Compose管理,整体流程非常顺。

先在OMV7的文件系统里给AdGuard Home建两个持久化目录,我用的是work放程序工作数据,conf放配置文件。这一步很关键,Docker容器是“一次性”的,如果数据不挂载到宿主机,容器重创后配置就全丢了:

mkdir -p /srv/omv/adguard/work mkdir -p /srv/omv/adguard/conf

然后写docker-compose.yml。AdGuard Home官方建议使用host网络模式,也就是让容器直接共享树莓派的网络,好处是不用做端口映射,DNS这种UDP服务在host模式下最稳,容器重启时端口占用和NAT问题都会被绕开。Compose文件如下:

services: adguardhome: image: adguard/adguardhome:latest container_name: adguardhome restart: unless-stopped network_mode: host volumes: - /srv/omv/adguard/work:/opt/adguardhome/work - /srv/omv/adguard/conf:/opt/adguardhome/conf

这个配置 traduzione 简单:镜像用adguard/adguardhome:latest,容器重启策略是unless-stopped,只要不是手动停止,服务器重启后容器也会自动跟着启动。host网络模式下,AdGuard Home会直接监听树莓派的53、3000端口,局域网其他设备访问树莓派IP就能用。

在OMV7的Web界面“服务”->“Compose”里上传这段YAML,点启动,或者直接在SSH里docker compose up -d,容器就起来了。第一次启动后,访问http://树莓派IP:3000,进入初始化页面。

3.2 首次初始化:管理密码与监听端口

第一次访问Web管理页面时,AdGuard Home会引导你配置。先设置管理界面端口,默认3000,但初始化完成后如果你想用80端口做管理,可以直接在页面上改成80。这里要注意,树莓派如果后面要装Nginx、web服务,80端口容易冲突,我在实际使用中把管理端口改到了8080,保留80给其他服务,端口冲突是后面排查麻烦最多的地方。

接着设置DNS监听端口,默认就是53,保持默认。如果需要加密DNS,可以选853或784,但家庭内网用53就够,内部网络不需要加密链路,加密解析主要留给外网场景。然后设置管理员用户名和密码,这一步自行设置即可。

初始化完成后,Web管理地址就变成你刚才设置的端口了。我用的是80端口以外的8080地址,比如http://192.168.1.100:8080。注:如果改了管理端口,访问的时候URL里必须带端口号。

3.3 设置上游DNS与去广告规则

进入AdGuard Home管理页后,第一件事就是配“设置”里的“DNS 设置”。上游DNS是AdGuard Home向外部DNS服务器发起域名解析请求时使用的服务器,这是整个过滤效果的源头,建议多填几个。我常用的上游DNS组合:

  • 223.5.5.5和223.6.6.6(阿里公共DNS)
  • 119.29.29.29(腾讯DNSPod)
  • 180.76.76.76(百度公共DNS)
  • 2400:3200::1(阿里IPv6,家里面有IPv6的一定要填)

然后在“DNS 设置”下方找到“Bootstrap DNS 服务器”,这个参数是为了解析上游DNS服务器自身域名用的,如果你上游写的是IP地址,Bootstrap就可以不填或填写其中一个IP。我用的是223.5.5.5。

再往下是“速度限制”和“缓存”。AdGuard Home自带DNS缓存,建议把缓存大小调到4MB或以上,再开启乐观缓存。这样局域网内大量重复查询会在本地直接命中,不反复发到上游,实际体感是网页打开变快。

去广告的关键是“过滤器”->“DNS 拦截清单”。点击“添加过滤器”,从社区规则仓库复制规则列表的URL填入即可。我实测下来对于国内家庭场景,下面这几个规则覆盖面和误杀率比较平衡:

  • AdGuard DNS 过滤器:https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt
  • anti-AD(国内App广告过滤):https://anti-ad.net/easylist.txt
  • 乘风广告规则:https://raw.githubusercontent.com/xinggsf/Adblock-Plus-Rule/master/rule.txt
  • 广告过滤器(AdGuard Simplified Domain Names):部分商业规则,可根据实际效果取舍

规则URL指向的网络来源都是各个社区维护的开源列表,网络畅通时添加后点“检查更新”就能拉取。我不建议盲目订阅十几个列表,规则太多会导致误杀率上升,而且AdGuard Home每次刷新规则、匹配域名时都会多一些CPU开销。我自己稳定使用的规则就三个,拦截率基本维持在15%到25%之间。

3.4 自定义规则与白名单管理

光靠内置规则和订阅列表还不够。家里总有一些App会用特殊域名,规则列表拿它没辙。或者反过来,规则列表把某个正常API域名给误杀了,导致视频加载失败、App登录白屏。这时候自定义规则就派上用场。

AdGuard Home规则语法和AdBlock基本一致。屏蔽格式是||example.com^,表示拦截 example.com 及其所有子域名;@@||example.com^则是白名单,放行该域名。你在“过滤器”->“自定义过滤规则”里直接添加即可。

我家里遇到过一个典型情况:某电视App开机需要连接广告SDK的域名,误杀后表现为“网络异常,无法启动”,但主视频流域名是另一个CDN地址,并不受影响。查日志后定位到被拦截的域名,加了白名单,问题立刻解决。白名单优先级高于黑名单,不用担心双重规则冲突。

4. 全家设备流量接入与效果验证

4.1 路由器DHCP统一指向树莓派

AdGuard Home配置完成只是第一步,真正让全家设备生效的是把局域网所有设备的DNS指向树莓派IP。最省事的做法是在路由器管理页面里,把DHCP服务器下发的DNS服务器地址改成树莓派的IP,这样所有通过DHCP获取IP的设备都会自动把解析请求发到AdGuard Home。

具体路径因路由器而异:大部分家用路由器在“网络”->“DHCP服务器”->“首选DNS服务器”里填写;有些光猫拨号环境,DNS是由光猫下发的,这时候要改光猫侧设置,或者把光猫改成桥接模式,由后级路由器拨号并下发DNS。我有朋友没注意这一点,在路由器上改了半天,结果底下设备拿到的是光猫下发的DNS,广告拦了个寂寞。

改完之后,重启一下家庭网络设备或者等待DHCP租约到期重新获取IP。验证方法是电脑上nslookup example.com,看返回的DNS Server是不是树莓派IP。如果显示的还是路由器IP或运营商DNS,说明没改成功,继续排查。

4.2 电视与手机的单独配置

有些设备不听话,比如智能电视有时候会内置固定的DNS,不随DHCP走,尤其是一些Android系统电视。这种情况下我建议在电视本身的网络设置里,把IP设置从自动改为静态IP或手动配置DNS,DNS1填树莓派IP,DNS2留空或不填。不同电视操作路径有差异,一般在“设置”->“网络”->“有线网络/无线网络”->“手动设置”里能找到。

手机端平时不用单独配置,只要路由器DHCP生效就行。如果你在外面想用AdGuard Home的过滤效果,那需要另外做公网暴露或加密DNS,这个不推荐新手折腾,安全风险高。我自己只在家庭局域网内用它,外面用手机流量时广告拦不拦无所谓。

如果某台设备强制使用它自己的DNS,你可以阶段性把这个设备断网重连一下,看看日志里能不能看到它的查询。看不到说明它没走你的AdGuard Home,需要手动指定。

4.3 通过查询日志分析拦截效果

AdGuard Home的“查询日志”是整个系统最有趣的部分。每台设备访问的每个域名都记录在案,包括时间、客户端IP、查询域名、处理动作(允许/过滤)。你在“查询日志”里输入关键词搜索,就能看到某个域名被哪条规则拦截了,处理方式会显示“已过滤”。点进去可以看到匹配到的过滤规则,方便决定是否加白名单。

我在查询日志里体验过很多次“破案”过程。有一次家里的小米电视突然能看网络视频但打不开应用商城,看了日志才发现商城的广告SDK域名被anti-AD规则拦了,加白之后立刻恢复。还有一次手机银行App闪退,查日志发现一行银行风控域名的子域名命中了某条广告规则,害我删掉了一条并不需要的规则列表。

拦截率怎么算?在“仪表盘”里能看到今日查询总数、过滤百分比等指标。我家10多台设备,日均查询量接近1万到2万条,过滤比例大概在18%上下。这个数字取决于家里的设备数量和App使用习惯,不用刻意追求高拦截率,正常够用就好。

4.4 IPv6环境下的DNS配置注意点

如果你的宽带和路由器开了IPv6,这里要特别留意。现在很多Android电视和手机会优先使用IPv6 DNS进行解析,如果IPv6的DNS还是运营商默认值,那广告拦截就不完整,表现为一部分广告还能弹出来。AdGuard Home可以监听IPv6地址,你需要在“DNS设置”里勾选IPv6监听,并给树莓派分配一个可用的IPv6地址。

路由器的DHCPv6下配置也和IPv4一样,把DNS服务器指向树莓派的IPv6地址。如果家里没有IPv6环境,那就不用管这一节。但以我自己的经验,国内IPv6普及率相当高,很多设备默认IPv6优先,家里宽带即使没启用IPv6,路由器后台也默认是开着的,你最好进路由器后台看一眼,IPv6开关关闭而无感的情况很常见。

如果IPv6这块实在不想折腾,也可以粗暴地在路由器里关闭IPv6功能,让所有设备回到IPv4 DNS统一解析。不过这个方案会牺牲一些IPv6带来的性能提升,我是建议把IPv6 DNS也配好,一劳永逸。

5. 常见问题与排查,都是我自己踩过的坑

5.1 端口53被systemd-resolved占用

树莓派基于Debian,系统里默认有个systemd-resolved服务,它会占用本地53端口。当你启动AdGuard Home时,容器报错“Permission denied”或者“listen tcp :53: bind: address already in use”,多半就是这个原因。解决办法是编辑/etc/systemd/resolved.conf,把DNSStubListener改为no:

[Resolve] DNSStubListener=no

然后重启服务:

sudo systemctl restart systemd-resolved sudo systemctl restart adguardhome

记得同时把系统自身的DNS指向文件/etc/resolv.conf里的内容处理好,否则系统解析会受影响。可以给resolv.conf重新建立软链指向/run/systemd/resolve/resolv.conf,或者手动改成公共DNS地址。我自己是把resolv.conf改成手动的,确保树莓派自身解析正常。

5.2 电视App播放异常该如何定位

智能电视的App偶发性播放失败,最大的可能就是某条广告规则把视频分发域名的某个子域名误杀了。处理流程我建议三步走:第一步,在AdGuard Home的查询日志里搜出报错时间点附近的域名,看看是不是有“已过滤”动作;第二步,点进详情确认命中的规则,是哪个过滤器导致的;第三步,把该域名加入自定义白名单。

需要注意的坑是:有些域名看着很像广告,但其实是视频App的核心接口,比如统计、账号、播放鉴权域名。直接加白可能让开屏广告复活,但至少能正常播放。稍微权衡一下,我一般把“播放相关”的白名单看得比广告拦截优先级高。识别方法就是看被过滤的域名在日志里出现的频率和访问时机,集中在启动阶段的是广告,集中在点击播放瞬间的是核心接口。

5.3 Docker重启后配置无故丢失

有段时间我的AdGuard Home容器每次系统重启后配置就重置,后来发现是Compose文件里没写完整挂载路径,配置保存在容器层,容器重创就没了。AdGuard Home的配置目录是/opt/adguardhome/conf,工作目录是/opt/adguardhome/work,两个都要挂出来。

另外一个习惯很重要:在OMV7或系统层面定期备份conf目录。AdGuard Home的规则订阅列表、白名单、自定义规则都存这里,丢了就要手动重配一遍,非常痛苦。我是每个月把adguard整个目录打包存到NAS共享盘里,恢复时只要把目录还原,重新起容器就行。

5.4 OMV7升级后AdGuard Home容器无法启动

OMV7自己会更新内核和相关依赖,有时候内核更新后Docker的网络栈会受影响,容器表现为启动瞬间退出。排查办法是docker logs adguardhome看日志,大多数提示是端口被占用或者镜像版本不对。AdGuard Homelatest标签更新很频繁,有时候新版本改变启动逻辑,而旧配置不兼容,解决办法是进目录把conf/AdGuardHome.yaml备份,然后启动一次全新容器让初始化重新生成配置,再把自己的上游DNS和规则重新设置。

为了避免这种麻烦,我倾向于固定镜像版本,比如adguard/adguardhome:v0.107.52,这样除非手动更新,否则不会因为自动拉取latest导致不可控变化。定期升级时我才会在周末手动改版本号,更新前备份好配置,实测下来稳定很多。

5.5 规则误杀,某个App不能登录

规则误杀在去广告方案里简直是家常便饭。特别是anti-AD这类大而全的列表,有时候会拦截到微信、支付宝等App的SDK统计域名,现象表现为“网络请求失败”“加载中旋转”。

我的排查习惯是:先把出问题的App对应的域名从日志里搜出来,区分是广告还是功能性域名。如果只是统计类域名被拦截,一般App还能正常用;但如果登录接口、支付确认、验证码接口被拦截,那就麻烦大了。解决办法跟上面说法一样,加白名单。另外一个更稳的做法是缩减订阅规则,把一个总的“verified”列表留下,其余容易误杀的列表去掉,我最终留下的列表就只有AdGuard官方和anti-AD两个,误杀率可控。

6. 实测效果与后续扩展

折腾完全套配置,我专门观察了一周,家里网络环境是光猫桥接 + 路由器拨号,树莓派5网线直连路由器。把DHCP首选DNS改成树莓派IP之后,所有设备的DNS查询都汇聚到AdGuard Home面板里,打开电视、手机刷视频、电脑挂网盘,整个网络感觉更干净了。智能电视开机广告基本消失,App内的开屏广告少了一大半,手机浏览网页时边缘的悬浮广告也没了,偶尔残留一点是在App自家应用内渲染的图片广告,这些不走DNS解析,只能靠应用内屏蔽。

再说网络速度。AdGuard Home本地缓存生效后,局域网内重复访问的域名走本地解析,体感上打开网页和App首屏的速度有一定提升。树莓派5的千兆网口和强悍CPU在这种场景下非常从容,即便同时有几十台设备在线查询,状态栏CPU占用也不到5%。内存占用基本稳定在200MB以内,对8GB版本来说毫无压力。

后续如果想继续把树莓派5榨出更多价值,AdGuard Home只是其中一个服务。我在同一台树莓派5上还跑着Samba共享、Docker里的其他几个小服务。它完全有能力胜任开发板和边缘计算的角色,比如部署轻量化的YOLOv5推理模型做目标检测实验,或者在树莓派5上交叉编译Qt应用,这些玩法跟AdGuard Home并不冲突,一个设备可以同时承担多个角色。

最后分享两个小技巧。一是AdGuard Home的“重写”→“DNS 重写”可以自定义域名解析,比如把某台NAS设备绑定一个好记的名字nas.lan,家里所有设备直接访问这个域名就行,不用记IP。二是OmV7的Smart Monitoring或者系统计划任务里加一个定时任务,定期执行docker compose pull和docker compose up -d,AdGuard Home的规则和镜像就能保持自动更新,省得手动维护。如果你的树莓派5已经落灰,这个项目是让它重新上岗的好理由。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询