1. 为什么我要折腾树莓派5加OMV7这套组合
家里联网设备一多,电视开机先看十几秒广告,手机App里各种开屏推广,连智能音箱都时不时推个会员提醒。最开始我在每台设备上装去广告插件,电视端装不了,手机端浏览器和App各管各的,维护起来太碎。后来想着干脆从网络入口统一处理,所有设备走同一个DNS,谁也别想偷偷塞广告进来。
选树莓派5是因为它性能够用、功耗低、常年开机不心疼电费。我实测过树莓派4跑AdGuard Home,家里十几台设备同时在线,查询量一上来偶尔会卡顿,树莓派5的CPU和内存带宽提升明显,处理DNS查询这种轻量但高频的任务更从容。OMV7(OpenMediaVault 7)是基于Debian 12的NAS系统,自带Docker管理界面,省得我手动敲一堆命令,而且它本身就能管硬盘、做共享,顺便把家里闲置的移动硬盘利用起来。
AdGuard Home是我最终选定的去广告方案,原因有三个:第一,它同时支持DNS层面的广告拦截和自定义过滤规则,覆盖电视、手机、电脑全平台;第二,它有Web管理界面,看查询日志、加白名单、调过滤规则都很直观;第三,它跑在Docker里,升级和迁移都方便,哪天树莓派坏了,把配置目录拷到新机器上就能恢复。
这套方案适合谁?如果你家里有树莓派或者类似的小主机,愿意花一个周末下午折腾一次,之后全家设备都能受益,那这篇内容就是写给你的。不需要你懂太多Linux,但基本的SSH操作和Docker概念得有一点,完全没有也没关系,我会把每一步都拆开讲。
注意:AdGuard Home做的是DNS层拦截,它能挡住大部分域名级别的广告请求,但挡不住和内容同域名的广告(比如某些视频网站把广告和正片放在同一个域名下)。这是DNS拦截的天然边界,心里要有预期。
2. 硬件与系统准备:树莓派5装OMV7的完整流程
2.1 硬件清单与选型理由
先列一下我实际用的东西,你照着买或者用手头现有的替代都行。
| 部件 | 我的选择 | 说明 |
|---|---|---|
| 主板 | 树莓派5 8GB | 4GB也够跑AdGuard Home,但OMV7加Docker加其他服务,8GB更从容 |
| 存储 | 三星EVO Plus 128GB microSD | 系统盘,OMV7本身占不了多少空间 |
| 电源 | 官方27W USB-C电源 | 树莓派5对供电要求比4代高,别用旧手机的充电头凑合 |
| 散热 | 官方主动散热器 | 常年开机,被动散热压不住,主动风扇噪音很小 |
| 网线 | 六类线 | 走有线,DNS服务对延迟敏感,WiFi不稳 |
| 数据盘 | 闲置2.5寸移动硬盘 | 用来存OMV的共享文件,和系统盘分开 |
树莓派5的供电是个坑。我一开始用某个65W氮化镓充电头,标称支持PD,但树莓派5开机就报低电压警告,外接硬盘一插直接重启。后来换官方27W电源才稳定。如果你要用移动硬盘,建议选带独立供电的硬盘盒,或者用SSD加硬盘盒,功耗更低。
2.2 系统安装:从烧录到首次启动
树莓派5装OMV7,我的做法是先装Raspberry Pi OS Lite 64位,再用官方脚本转成OMV。为什么不直接刷OMV的镜像?因为OMV官方对树莓派5的镜像支持还在完善中,用Raspberry Pi OS做底再装OMV,兼容性更稳,遇到问题也容易搜到解决方案。
具体步骤:
- 用Raspberry Pi Imager烧录Raspberry Pi OS Lite 64位到microSD卡。烧录前在Imager的高级设置里开启SSH、设置用户名密码、配置WiFi(虽然最终走有线,但首次启动用WiFi方便)。
- 插卡启动,等两分钟,用SSH连上去。第一次登录后先更新系统:
sudo apt update && sudo apt full-upgrade -y- 改主机名,方便后面在路由器里识别:
sudo raspi-config在System Options里改Hostname,我改成omv-nas。同时把时区改成Asia/Shanghai。 4. 安装OMV7。官方提供了一键脚本:
wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash这个脚本会跑十几分钟,中途会问你几次确认,一路回车就行。跑完后重启,用浏览器访问http://树莓派IP,默认账号admin,密码openmediavault。
注意:OMV7默认会占用80端口,如果你后面想用80端口跑别的服务,记得先在OMV的Web管理里改端口。我改成8080,避免和AdGuard Home的Web界面冲突。
2.3 OMV7初始化设置
首次登录OMV,系统会提示你改密码,顺手改掉。然后做几件事:
- 在“存储器”里挂载数据盘。如果硬盘之前有数据,OMV会提示你挂载而不是格式化,选挂载就行。
- 在“共享文件夹”里建一个目录,比如
media,后面Docker的配置目录可以放这里。 - 在“用户”里确认你的SSH用户有权限访问共享文件夹。
OMV7的Docker管理需要装openmediavault-compose插件。在“系统”-“插件”里搜索compose,安装它。装完后左侧菜单会多出“服务”-“Compose”,这就是我们后面部署AdGuard Home的地方。
3. Docker部署AdGuard Home:配置与参数详解
3.1 为什么用Docker而不是直接装
AdGuard Home官方提供二进制安装和Docker镜像两种方式。我选Docker的理由很实际:OMV7本身就在用Docker跑一些服务,统一管理方便;升级AdGuard Home时,直接拉新镜像重启容器就行,不用管依赖;配置和数据都在挂载目录里,迁移时拷贝目录即可。
Docker Compose方式比docker run更适合我,因为配置写在YAML文件里,改端口、改挂载路径一目了然,重装时直接复用文件。
3.2 Compose文件编写与参数计算
在OMV的Compose界面新建一个文件,或者SSH到树莓派上手动创建。我习惯在/srv/mergerfs/.../docker/adguardhome这样的路径下放配置,你根据自己硬盘挂载点调整。
version: "3" services: adguardhome: image: adguard/adguardhome:latest container_name: adguardhome restart: unless-stopped ports: - "53:53/tcp" - "53:53/udp" - "3000:3000/tcp" - "8081:80/tcp" volumes: - /srv/dev-disk-by-uuid-xxxx/docker/adguardhome/work:/opt/adguardhome/work - /srv/dev-disk-by-uuid-xxxx/docker/adguardhome/conf:/opt/adguardhome/conf environment: - TZ=Asia/Shanghai几个关键点解释一下:
- 53端口:DNS服务端口,TCP和UDP都要映射。UDP用于常规查询,TCP用于大响应和区域传送。两个都开,别只开UDP。
- 3000端口:AdGuard Home首次安装时的初始化Web端口。装完后管理界面默认走80,但80可能被OMV占用,所以我映射到8081。
- 挂载目录:
work存查询日志和统计,conf存配置和过滤规则。这两个目录必须持久化,否则容器重启后配置全丢。 - TZ环境变量:设置时区,否则日志时间对不上,排查问题时很麻烦。
提示:如果你的树莓派上已经有服务占用了53端口(比如systemd-resolved),需要先停掉它。执行
sudo systemctl stop systemd-resolved && sudo systemctl disable systemd-resolved,然后编辑/etc/resolv.conf把nameserver改成127.0.0.1。这一步不做,AdGuard Home起不来。
3.3 首次启动与初始化向导
Compose文件保存后,在OMV的Compose界面点“启动”,或者SSH执行docker compose up -d。等十几秒,浏览器访问http://树莓派IP:3000,进入AdGuard Home初始化向导。
向导会问你三件事:
- 管理界面端口:默认80,我改成8081,因为80被OMV占了。
- DNS服务端口:保持53。
- 用户名密码:设置一个强密码,别用默认的。
设置完成后,用http://树莓派IP:8081登录管理界面。这时候AdGuard Home已经在监听53端口了,但还没有设备用它。
4. 让全家设备走AdGuard Home:路由器与终端配置
4.1 路由器DHCP下发DNS
最省事的做法是在路由器里把DHCP下发的DNS服务器改成树莓派的IP。这样家里所有设备自动获取到的DNS就是AdGuard Home,不用一台台改。
不同路由器界面不一样,但逻辑相同:找到DHCP设置,把“主DNS”填树莓派IP,“备用DNS”留空或者填一个公共DNS(比如223.5.5.5)。为什么备用DNS要留空?因为如果填了公共DNS,设备在AdGuard Home响应慢时会直接走备用DNS,广告就漏过去了。留空的话,设备只能走AdGuard Home,拦截率最高。
我用的路由器支持自定义DHCP选项,直接把DNS指向树莓派。改完后,家里设备重新连WiFi或者重启网络,就会用新的DNS。
4.2 电视和手机的特殊处理
电视比较麻烦。有些电视系统会强制使用内置DNS,不理会路由器下发的设置。我遇到的情况是,电视连上WiFi后,DNS还是运营商的。解决办法有两个:
- 在电视的网络设置里手动指定静态IP和DNS,DNS填树莓派IP。
- 如果电视不允许改DNS,就在路由器里做端口转发,把电视的53端口请求强制转发到树莓派。这个操作因路由器而异,我的路由器支持“DNS重定向”功能,开启后所有53端口请求都走树莓派。
手机端相对简单。iOS和Android在WiFi设置里都能手动改DNS。但更彻底的做法是,如果家里有旁路由或者支持DNS重定向的路由器,直接全局劫持53端口,手机连上WiFi就自动生效,不用每台设备改。
注意:AdGuard Home的查询日志会记录每台设备的请求。如果你在意隐私,可以在设置里关闭日志记录,或者只保留统计不保留详细记录。我一般保留7天日志,方便排查哪个设备在疯狂请求广告域名。
4.3 验证是否生效
配置完后,用手机连WiFi,打开浏览器访问http://树莓派IP:8081,看“查询日志”里有没有这台手机的请求。如果有,说明DNS已经走AdGuard Home了。然后打开一个之前有广告的App,看广告是否消失。我实测下来,大部分App的开屏广告和横幅广告都能去掉,视频前贴片广告去不掉,因为那是同域名内容。
另一个验证方法是命令行查询:
nslookup doubleclick.net 树莓派IP如果返回0.0.0.0或者NXDOMAIN,说明拦截生效。
5. 过滤规则与性能调优:让拦截更精准
5.1 过滤规则的选择与组合
AdGuard Home自带一个“过滤器”菜单,里面可以添加各种规则列表。我常用的组合:
| 规则列表 | 用途 | 特点 |
|---|---|---|
| AdGuard DNS filter | 基础广告拦截 | 官方维护,误杀少 |
| AdAway | 移动端广告 | 对App内广告覆盖好 |
| EasyList China | 中文广告 | 针对国内网站优化 |
| 1Hosts (Lite) | 综合拦截 | 体积小,性能好 |
| Anti-AD | 国内广告 | 更新频繁,覆盖广 |
规则不是越多越好。我一开始加了十几条规则,结果有些正常网站被误杀,比如某些CDN域名被拦了,导致图片加载不出来。后来精简到5条,日常使用基本没遇到误杀。如果你发现某个网站打不开,先去“查询日志”里看是不是被规则拦了,然后加白名单。
5.2 性能调优与缓存设置
树莓派5跑AdGuard Home,默认配置下CPU占用很低,但查询量大时(比如家里有人刷短视频),可以调几个参数:
- 缓存大小:在“DNS设置”里把缓存大小调到
4194304(4MB),能缓存更多查询结果,减少上游查询。 - 上游DNS:我用
223.5.5.5和119.29.29.29,国内解析快。如果你有特殊需求,可以加tls://dns.pub这样的加密DNS,但会增加一点延迟。 - 并发查询:开启“并行查询”,让AdGuard Home同时问多个上游,取最快响应。实测能降低平均延迟。
提示:不要开启“DNSSEC”除非你确定所有上游都支持。我开过一次,结果部分网站解析失败,排查了半天才发现是DNSSEC验证不通过。家用环境,DNSSEC带来的收益有限,稳定性更重要。
5.3 客户端分组与差异化规则
AdGuard Home支持按客户端设置不同规则。比如我给孩子用的平板,额外加了一条“安全搜索”规则,强制开启搜索引擎的安全模式。给电视单独设一组,只拦广告不拦其他。这个功能在“客户端设置”里配置,先给设备命名,然后绑定IP,再指定规则。
6. 常见问题与排查技巧实录
6.1 设备无法上网或解析失败
这是最常见的问题。排查顺序:
- 确认树莓派本身能上网:
ping 223.5.5.5。 - 确认AdGuard Home在运行:
docker ps看容器状态。 - 确认53端口没被占用:
sudo netstat -tulpn | grep 53。 - 确认路由器DHCP下发的DNS是树莓派IP。
- 如果只有部分设备不行,检查那台设备的DNS设置是不是被手动改过。
我遇到过一次,手机能上网但电视不行。后来发现电视的WiFi设置里DNS是手动指定的运营商DNS,改成自动获取就好了。
6.2 广告拦截不生效
先看查询日志里有没有广告域名的请求。如果没有,说明DNS没走AdGuard Home。如果有请求但没被拦,检查规则是否启用、规则列表是否更新。AdGuard Home的规则需要手动点“更新”才会拉取最新版本,我设了每天自动更新。
还有一种情况:某些App用IP直连或者DoH(DNS over HTTPS)绕过DNS拦截。DoH在App内部加密发送DNS查询,AdGuard Home看不到。这种情况只能靠App自身的去广告版本,或者用更上层的拦截方案。
6.3 树莓派5温度与稳定性
树莓派5跑OMV7加Docker,待机温度大概45度,负载高时到60度。官方主动散热器能把温度压在70度以下,没问题。如果你用被动散热,夏天可能会降频。建议在OMV里装个温度监控,或者定期vcgencmd measure_temp看一下。
电源稳定性前面提过,再强调一次:别用杂牌充电头。我因为电源问题排查了一整个晚上,最后换官方电源解决。
6.4 常见问题速查表
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 容器起不来 | 53端口被占 | 停掉systemd-resolved |
| 设备无法上网 | DNS没指向树莓派 | 检查DHCP设置 |
| 广告漏拦 | 备用DNS没留空 | 路由器里清空备用DNS |
| 部分网站打不开 | 规则误杀 | 查询日志加白名单 |
| 查询延迟高 | 上游DNS慢 | 换国内DNS,开并行查询 |
| 配置丢失 | 目录没挂载 | 检查Compose挂载路径 |
7. 日常维护与扩展玩法
7.1 自动更新与备份
AdGuard Home的规则列表可以设自动更新,在“过滤器”-“自动更新”里开启,间隔设24小时。容器镜像的更新我用OMV的Compose界面手动拉取,因为自动更新偶尔会拉到不兼容的版本。更新前先备份conf目录,出问题能回滚。
备份很简单,把/srv/.../adguardhome/conf整个目录打包存到数据盘或者另一台机器上。恢复时解压回去,重启容器就行。
7.2 扩展:加个本地DNS记录
AdGuard Home支持自定义DNS记录。我在“DNS设置”-“DNS重写”里加了几条,把家里NAS的域名指向内网IP,这样在内网访问NAS不用记IP。比如nas.home指向192.168.1.100,手机和电脑都能直接用域名访问。
7.3 扩展:配合OMV做文件共享
OMV本身能做SMB共享,我把数据盘挂载后建了共享文件夹,电视和手机都能访问。这样树莓派5既是DNS服务器又是轻量NAS,一机两用。功耗实测待机5W左右,满载10W,一年电费可以忽略。
我在实际使用中发现,这套方案最大的价值不是省了多少钱,而是把全家网络入口统一管起来了。以前每台设备各自为战,现在改一条规则,所有设备生效。孩子平板上突然冒出来的广告,我在AdGuard Home里看一眼日志就能定位是哪个App在请求,然后加规则拦掉。这种掌控感是装单个去广告插件给不了的。
最后分享一个小技巧:如果你不确定某条规则会不会误杀,先在“查询日志”里找到那个域名,点“加入白名单”测试一天,确认没问题再决定是否保留规则。别一上来就加一堆规则,稳定比激进重要。