开启 3 天免费试用
注册即可免费体验全部高级功能。
*仅限新用户;每位用户只能获得一次试用。


稳妥的 AdGuard Home 搭建方式,是把解析服务放在一台局域网主机上,只回答你列出的设备;指定域名交给各自的上游 DNS,其余查询统一走一个加密的默认上游。先在一台设备上试用,确认过滤生效、没有泄漏,并保留已验证的回退路径。
关键要点:
- 固定一个发行版本并校验哈希,改动前先记录主机原有的解析配置。
- 以可撤销的方式让 systemd-resolved 的 stub 监听让出 53 端口。
- 防火墙规则和允许客户端列表共同决定谁能得到应答,两者都要设置。
- 按域名指定上游,把本地名称和公司域名交给各自的服务器。
- 先恢复设备设置,再卸载服务并还原解析配置。
准备一台家庭局域网内的原生 Ubuntu 24.04 LTS x64 主机,或一台只能经私有网络访问的 VPS,再加一台由你控制的测试设备。本文对应 AdGuard Home v0.107.79,发布于 2026 年 8 月 18 日。[1] 本文依据下方列出的官方来源整理,未完成完整端到端实测。
AdGuard 官方说明了压缩包安装、服务命令和端口:首次运行向导使用 TCP 3000,网页界面默认使用 TCP 80,DNS 使用 UDP 53。[2] GitHub 上的旧 Wiki 已标注过时并指向 Knowledge Base,命令不一致时以 Knowledge Base 为准。[3]
长期运行的解析器意味着持续维护,可以先对照自建服务的维护责任总览评估。本文不同于 Pi-hole 单设备试用,也不同于自建 Unbound 递归解析器:AdGuard Home 负责转发查询,并允许你为每个域名选择上游。域名拦截本身也有任何解析器都无法消除的局限,参见 DNS 广告拦截的实际工作方式。
如果主机属于共享生产环境、由他人管理,或 53 端口可从互联网访问,请停止操作。不要把这个解析器公开到公网。
AdGuard Home 支持普通 DNS、DNS-over-TLS(tls://)、DNS-over-HTTPS(https://)、DNS-over-QUIC(quic://)和 DNS stamps 作为上游。形如 [/example.local/] 再接服务器地址的一行,会把该域名及其子域名发给这台服务器;# 表示“使用默认上游”。[4]
| 查询类型 | 建议上游 | 原因 |
|---|---|---|
| 公共域名 | 一个加密的默认上游 | 运营商不再看到明文查询 |
路由器本地名称,如 .lan | 路由器的局域网地址 | 只有路由器知道这些名称 |
| 公司或实验室域名 | 该网络的内部解析器 | 公共解析器无法回答 |
| 私有地址的反向查询 | Private reverse DNS servers 字段 | AdGuard 要求私有网段写在这里 |
先保存当前解析状态,便于日后原样恢复:
readlink -f /etc/resolv.conf
resolvectl status
sudo ss -lntup
在 Ubuntu 上,systemd-resolved 在 127.0.0.53 和 127.0.0.54 上运行 stub 监听,/etc/resolv.conf 通常指向 stub 文件。[5] 记下局域网网卡、主机局域网地址、测试设备地址和管理设备地址。
趁主机 DNS 还能用时下载发行包,并用官方公布的校验文件核对:
cd "$(mktemp -d)"
VER='v0.107.79'
BASE="https://github.com/AdguardTeam/AdGuardHome/releases/download/$VER"
curl -fLO "$BASE/AdGuardHome_linux_amd64.tar.gz"
curl -fLO "$BASE/checksums.txt"
sha256sum -c --ignore-missing checksums.txt
tar -xzf AdGuardHome_linux_amd64.tar.gz
sudo mv AdGuardHome /opt/AdGuardHome
只有校验结果显示 OK 时才继续。如果 /opt/AdGuardHome 已经存在,先停下来弄清是谁安装的。
首次运行时程序监听 0.0.0.0:3000,局域网内任何设备都能打开向导。[2] 在已经审核过、默认拒绝入站的 UFW 策略下,只放行本次试用所需的流量;请替换网卡名和地址:[6]
LAN_IF='enp1s0'
TEST_V4='192.168.1.25'
ADMIN_V4='192.168.1.10'
sudo ufw allow in on "$LAN_IF" from "$TEST_V4" to any port 53 proto udp
sudo ufw allow in on "$LAN_IF" from "$TEST_V4" to any port 53 proto tcp
sudo ufw allow in on "$LAN_IF" from "$ADMIN_V4" to any port 3000 proto tcp
sudo ufw status numbered
保留 SSH 规则和本地控制台。如果 UFW 尚未启用,应先建立默认拒绝策略,而不是跳过这一步。
DNSStubListener=no 会关闭 stub 监听,/etc/systemd/resolved.conf.d/ 下的片段文件会覆盖主配置。[7] AdGuard 的 FAQ 给出以下手动修复方法,并说明 DNS=127.0.0.1 这一行是必需的:[8]
sudo mkdir -p /etc/systemd/resolved.conf.d
printf '[Resolve]\nDNS=127.0.0.1\nDNSStubListener=no\n' | sudo tee /etc/systemd/resolved.conf.d/adguardhome.conf
sudo mv /etc/resolv.conf /etc/resolv.conf.backup
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
sudo systemctl reload-or-restart systemd-resolved
sudo ss -lntup | grep ':53 '
最后一条命令在 53 端口上应当没有输出。此时主机自身的域名查询会失败,直到 AdGuard Home 在 127.0.0.1 上应答,这就是要先下载的原因。向导里也有针对该冲突的 Fix 按钮;手动方式会留下一个日后可以直接删除的文件。[8]
cd /opt/AdGuardHome
sudo ./AdGuardHome -s install
sudo ./AdGuardHome -s status
在管理设备上打开 http://HOST_LAN_IP:3000。在向导中,把管理网页界面绑定到主机局域网地址的 3000 端口,把 DNS 服务器绑定到局域网地址的 53 端口,并创建一个使用长而唯一密码的管理员账户。[2]
只能在服务停止时编辑配置文件,因为运行中的实例会覆盖文件改动。[9] 只修改现有分节里的以下键:
sudo /opt/AdGuardHome/AdGuardHome -s stop
sudoedit /opt/AdGuardHome/AdGuardHome.yaml
http:
address: 192.168.1.53:3000
dns:
bind_hosts:
- 127.0.0.1
- 192.168.1.53
port: 53
allowed_clients:
- 127.0.0.1
- 192.168.1.25
querylog:
enabled: true
interval: 24h
statistics:
interval: 24h
bind_hosts 限定在哪些地址提供 DNS;allowed_clients 列表非空时,只有其中的地址能得到应答。[9] 保留回环地址,是因为主机自身现在通过 127.0.0.1 解析。查询日志轮换可设为 1h 到 8760h,试用期保留一天就够了。若不需要按客户端记录日志,可在 dns 下设置 anonymize_client_ip: true。[9]
sudo /opt/AdGuardHome/AdGuardHome --check-config --config /opt/AdGuardHome/AdGuardHome.yaml
sudo /opt/AdGuardHome/AdGuardHome -s start
getent hosts example.com
客户端数量已知时,AdGuard 建议使用 Settings → DNS settings → Access settings 中的 Allowed clients 字段,并提醒开放解析器容易被滥用。[10]
在测试设备上把 DNS 手动设为主机的局域网地址,只填这一项。不要保留公共备用解析器,并在测试用的浏览器配置文件中关闭安全 DNS,确保查询真正到达 AdGuard Home。然后在这台设备上执行:
nslookup example.com 192.168.1.53
nslookup example.com
两次查询都应带着测试设备的地址出现在 Query log 中。如果只看到显式指定服务器的那次,说明设备仍在使用其他解析器。
在 Settings → DNS settings → Upstream DNS servers 中每行填写一个上游;请替换路由器和公司的地址:
https://unfiltered.adguard-dns.com/dns-query
[/lan/]192.168.1.1
[/corp.example/]10.20.0.53
[/public.corp.example/]#
第一行是 AdGuard DNS 不过滤的 DNS-over-HTTPS 地址,过滤只在你自己的实例上进行。[11] DoH 上游以域名表示,因此要在 bootstrap DNS 字段(bootstrap_dns)里保留一个普通解析器,例如 94.140.14.140。[9][11] 最后一行把一个子域名交回默认上游;若写成 [/*.corp.example/],只会匹配子域名,不包括 corp.example 本身。[4]
把路由器地址填入 Private reverse DNS servers,因为 AdGuard 只把私有网段的反向查询发往那里。[4] 重复步骤 6 的查询,再查询一个 .lan 名称,并在日志里核对上游一栏。
在 Filters → Custom filtering rules 中添加 ||example.org^,它会拦截该域名及其子域名。再添加 @@||example.org^ 解除拦截;以 ! 或 # 开头的行是注释。[12]
| 检查方法 | 预期现象 | 失败时处理 |
|---|---|---|
只有拦截规则时执行 nslookup example.org | 日志标记为已拦截 | 确认设备使用该主机且规则已保存 |
| 加入例外后重复同一查询 | 日志重新标记为允许 | 删除覆盖例外的 $important 规则 |
查询一个 .lan 名称 | 由路由器作答 | 检查 [/lan/] 行和路由器地址 |
| 用一台未列入名单的自有设备查询 | 没有应答 | 修正 allowed_clients 或防火墙 |
| 在测试设备上做 DNS 泄漏测试 | 只出现默认上游的解析器 | 排查备用解析器、IPv6 DNS 或浏览器 DNS |
最后一行可按这份 DNS 泄漏检查方法操作。IPv6 DNS 是另一条路径:要么配置并限制 IPv6 监听,要么把本次试用明确标为仅 IPv4。检查结束后删除两条测试规则。
先恢复测试设备原来的 DNS 设置,确认新的查询能正常返回,再动主机。AdGuard 提醒先把设备改回其他 DNS,再运行卸载命令并删除目录。[8]
sudo /opt/AdGuardHome/AdGuardHome -s uninstall
sudo rm /etc/systemd/resolved.conf.d/adguardhome.conf
sudo rm /etc/resolv.conf
sudo mv /etc/resolv.conf.backup /etc/resolv.conf
sudo systemctl restart systemd-resolved
getent hosts example.com
把 readlink -f /etc/resolv.conf 和 resolvectl status 的输出与步骤 1 对照。按编号只删除本次试用添加的 UFW 规则。若以后还可能用到,先私下保存一份 AdGuardHome.yaml,再删除 /opt/AdGuardHome。
allowed_clients 限制应答对象。可以。只需用片段文件关闭它的 stub 监听;systemd-resolved 仍会运行,并把主机自身的查询转发到 127.0.0.1。
53 端口已被其他程序占用,通常是 systemd-resolved 的 stub 监听。按步骤 3 添加片段文件,或使用向导里的 Fix 按钮即可解决。
域名块后面的 # 表示该域名不使用特定服务器,而是交给默认上游处理,常用于把某个子域名排除在专用上游之外。
不是必须,但公共域名建议使用。明文上游查询会被网络路径上的设备和运营商看到,加密后能减少这类暴露。
不安全。开放解析器容易被滥用,DNS 服务应只留在局域网或私有网络内,并明确列出允许的客户端地址。
DNS 规则以整个域名为单位拦截。与正文同域名投放的广告、缓存页面以及浏览器自带 DNS 都可能绕过这些规则。
不会。要先恢复每台设备的 DNS 设置,再删除 resolved 片段文件,并把保存的 resolv.conf 链接放回原处。
免责声明:本文步骤依据官方文档整理,并非已完成测试的记录。只在获授权的主机和设备上操作,并保留可用的恢复路径。
来源:
Sources checked 2026 年 10 月 14 日。
延伸阅读:
注册即可免费体验全部高级功能。
*仅限新用户;每位用户只能获得一次试用。