AdGuard Home:从后台到终端过滤验证
完成后你能确认什么
Section titled “完成后你能确认什么”- AdGuard Home 接管 OpenWrt 的
53,Web 后台在3000; dnsmasq退到5353,仍负责 DHCP;- DHCP 客户端拿到
192.168.2.1作为 DNS; - 自定义过滤规则生效,正常域名仍能解析;
- 重启后数据盘、AGH 配置和过滤规则仍然存在。
适用环境与拓扑
Section titled “适用环境与拓扑”- PVE 9.2.2 单网口;OpenWrt 25.12.6 x86_64 VM 201(1GB RAM,2GB 数据盘)。
- WAN
net0接vmbr0(DHCP);LANnet1接独立vmbr2(192.168.2.0/24)。 - AGH 版本 0.107.79;
apk源里有adguardhome包。 - 不要让两个 OpenWrt VM 的 DHCP 共享同一个 bridge:本实验 VM 200 在
vmbr1(192.168.1.0/24),VM 201 必须在vmbr2(192.168.2.0/24),否则客户端可能拿到另一个网段的租约。
| 物理口 | PVE bridge | 虚拟网卡 | OpenWrt 接口 | 职责 |
|---|---|---|---|---|
| nic0 | vmbr0 | net0 | wan DHCP | 上游 192.168.50.1 |
| — | vmbr2 | net1 | lan 192.168.2.1 | AGH + DHCP 客户端 |
| 端口 | 组件 | 作用 |
|---|---|---|
| 53 | AdGuard Home | 客户端 DNS、过滤、上游转发 |
| 3000 | AdGuard Home | Web 管理后台 |
| 5353 | dnsmasq | DHCP 与本地 DNS(不再对客户端提供 53) |
不要把 AGH 和 dnsmasq 同时绑在 53;也不要把 DHCP option 6 指向一个没有监听 53 的地址。
cp /etc/config/dhcp /etc/config/dhcp.bak.$(date +%F)cp /etc/config/adguardhome /etc/config/adguardhome.bak.$(date +%F) 2>/dev/null || truecat /etc/config/dhcp确认你能进 PVE 控制台或 OpenWrt LAN;不要把唯一管理入口建立在正在改的 DNS 上。
预期出问题时能恢复 dnsmasq/AGH 配置。

apk updateapk add adguardhome block-mount e2fsprogse2fsprogs 提供 mkfs.ext4;block-mount 提供 fstab 服务。国内网络慢时可换 OpenWrt 镜像源,但包必须通过签名校验。
预期adguardhome、block-mount、e2fsprogs 已安装。
只对确认无数据的实验室数据盘操作:
mkfs.ext4 -F /dev/sdbmkdir -p /opt/aghmount /dev/sdb /opt/aghblock info /dev/sdb用 block info 输出的 UUID,在 LuCI 的“挂载点”里把该磁盘目标设为 /opt/agh 并启用;或用 CLI 找到对应的 @mount[n]:
uci show fstab# 找到 uuid 为 <你的-UUID> 的 @mount[n]uci set fstab.@mount[n].target='/opt/agh'uci set fstab.@mount[n].enabled='1'uci commit fstab/etc/init.d/fstab enableblock mountmount | grep /opt/agh本实验用的是已自动检测出的 fstab.@mount[2](UUID 指向 2GB 数据盘),把 target 改为 /opt/agh、enabled 设为 1 后成功。不要照抄 [2],按你的 UUID 找对应 section。
预期/opt/agh 挂在独立磁盘上,重启后仍在。
uci set dhcp.@dnsmasq[0].port='5353'uci commit dhcp/etc/init.d/dnsmasq restartnetstat -lnp | grep -E ':53|:5353'此时客户端暂时无法用 53 解析;下一步启动 AGH。
预期53 端口空出来,DHCP 仍然正常。
uci set adguardhome.config.work_dir='/opt/agh/work'uci commit adguardhomemkdir -p /opt/agh/workchown -R adguardhome:adguardhome /opt/agh /etc/adguardhome/etc/init.d/adguardhome enable/etc/init.d/adguardhome startsleep 3netstat -lnp | grep -E ':3000|:53'浏览器打开 http://192.168.2.1:3000/,设置:
- Web 端口
3000; - DNS 端口
53; - 管理员账号/密码;
- Upstream DNS 填
192.168.50.1(本实验环境); - 如果上游不做 DNSSEC 验证,先关闭 DNSSEC,避免解析失败。
没有浏览器时可用 AGH 的 setup API;密码不要写进脚本或仓库。
预期Web 后台在 3000 可访问。
uci add_list dhcp.lan.dhcp_option='6,192.168.2.1'uci commit dhcp/etc/init.d/dnsmasq restartuci show dhcp.lan | grep dhcp_option只改 dnsmasq 端口而不加 option 6 时,部分客户端可能拿不到 DNS;本实验必须显式加。
预期客户端 DNS 是 192.168.2.1。
在 AGH 后台 Filters → Custom filtering rules 添加:
||blocked.example^这是测试用保留域名;真实使用再订阅维护中的过滤列表。不要用“拦截后网页打不开”来判断规则生效,先用 nslookup 看返回。
预期blocked.example 返回 0.0.0.0,正常域名不受影响。

netstat -lnp | grep -E ':53|:3000|:5353'nslookup blocked.example 192.168.2.1nslookup openwrt.org 192.168.2.1预期:blocked.example 返回 0.0.0.0(IPv6 可能同时显示 ::);openwrt.org 返回真实地址。
预期AGH 监听 53/3000,dnsmasq 监听 5353。
ip addr showip routecat /etc/resolv.confnslookup blocked.examplenslookup openwrt.org如果客户端 DNS 不是 192.168.2.1,回到 DHCP option 6 和 dnsmasq 端口检查。
预期客户端拿到 192.168.2.x 和 DNS 192.168.2.1,拦截/正常解析都正确。
reboot重启后:
mount | grep /opt/aghnetstat -lnp | grep -E ':53|:3000'nslookup blocked.example 192.168.2.1nslookup openwrt.org 192.168.2.1预期数据盘自动挂载,AGH 和过滤规则恢复。
失败分支与恢复
Section titled “失败分支与恢复”AGH 起不来 / 53 被占用
Section titled “AGH 起不来 / 53 被占用”logread | grep -i adguard | tail -50netstat -lnp | grep ':53'/usr/bin/AdGuardHome --check-config -c /etc/adguardhome/adguardhome.yaml如果 dnsmasq 还在 53,先确认 dhcp.@dnsmasq[0].port='5353';如果是配置错误,恢复备份:
cp /etc/adguardhome/adguardhome.bak.YYYY-MM-DD /etc/adguardhome/adguardhome.yaml/etc/init.d/adguardhome restart客户端完全无法解析
Section titled “客户端完全无法解析”临时把 DNS 还给 dnsmasq:
uci set dhcp.@dnsmasq[0].port='53'uci -q delete dhcp.lan.dhcp_optionuci commit dhcp/etc/init.d/dnsmasq restart/etc/init.d/adguardhome stop先恢复基础解析,再逐项排查 AGH。
数据盘没挂上
Section titled “数据盘没挂上”mount | grep /opt/aghblock info /dev/sdblogread | grep -i fstab检查 fstab 的 UUID、target、enabled;必要时手动 mount /dev/sdb /opt/agh 后重启 AGH。

- 确认 AGH 是客户端实际使用的 DNS;
- 确认规则在 Custom filtering rules,不是订阅列表;
- 用
nslookup blocked.example 192.168.2.1直接问 AGH; - 浏览器/系统 DoH 可能绕过 AGH。
E2 实测记录(2026-10-20)
Section titled “E2 实测记录(2026-10-20)”- 环境:PVE 9.2.2 单网口;OpenWrt 25.12.6 VM 201(1GB/2GB 数据盘);AGH 0.107.79。
- 端口:AGH
53+ Web3000;dnsmasq5353;DHCP option 6192.168.2.1。 - 客户端:DHCP
192.168.2.166/24,DNS192.168.2.1;blocked.example→0.0.0.0,openwrt.org→64.226.122.113。 - 重启:
/opt/agh通过 fstab 自动挂载;AGH、dnsmasq、过滤规则恢复;Web 返回 302。 - 未测:真实浏览器 UI 操作、外部订阅列表、物理 LAN 客户端、IPv6、长期稳定性。
- 本页是 E2 实验记录;未做独立复核,也未在真实物理 LAN 上验证。
- 复现配方:
tests/recipes/agh-25.12-vm201.md;环境记录:docs/agh-e2-run.md。 - AGH 版本/包名变化时更新
testedVersions;不要直接套用其他固件版本的 init 脚本。