AdGuard Home 搭建教程:私有 DNS 过滤与按域名分流上游

AdGuard Home 搭建教程:私有 DNS 过滤与按域名分流上游

Marcus Reid
2026年10月14日· 7 分钟阅读

稳妥的 AdGuard Home 搭建方式,是把解析服务放在一台局域网主机上,只回答你列出的设备;指定域名交给各自的上游 DNS,其余查询统一走一个加密的默认上游。先在一台设备上试用,确认过滤生效、没有泄漏,并保留已验证的回退路径。

关键要点:

  • 固定一个发行版本并校验哈希,改动前先记录主机原有的解析配置。
  • 以可撤销的方式让 systemd-resolved 的 stub 监听让出 53 端口。
  • 防火墙规则和允许客户端列表共同决定谁能得到应答,两者都要设置。
  • 按域名指定上游,把本地名称和公司域名交给各自的服务器。
  • 先恢复设备设置,再卸载服务并还原解析配置。

AdGuard Home 搭建需要准备什么?

准备一台家庭局域网内的原生 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 要求私有网段写在这里

步骤 1:记录基线并下载固定版本

先保存当前解析状态,便于日后原样恢复:

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 已经存在,先停下来弄清是谁安装的。

步骤 2:首次启动前先收紧防火墙

首次运行时程序监听 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 尚未启用,应先建立默认拒绝策略,而不是跳过这一步。

步骤 3:解决 AdGuard Home 53 端口冲突

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]

步骤 4:安装服务并完成向导

cd /opt/AdGuardHome
sudo ./AdGuardHome -s install
sudo ./AdGuardHome -s status

在管理设备上打开 http://HOST_LAN_IP:3000。在向导中,把管理网页界面绑定到主机局域网地址的 3000 端口,把 DNS 服务器绑定到局域网地址的 53 端口,并创建一个使用长而唯一密码的管理员账户。[2]

步骤 5:收窄监听地址、客户端和日志

只能在服务停止时编辑配置文件,因为运行中的实例会覆盖文件改动。[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]

步骤 6:只改一台设备并确认查询到达

在测试设备上把 DNS 手动设为主机的局域网地址,只填这一项。不要保留公共备用解析器,并在测试用的浏览器配置文件中关闭安全 DNS,确保查询真正到达 AdGuard Home。然后在这台设备上执行:

nslookup example.com 192.168.1.53
nslookup example.com

两次查询都应带着测试设备的地址出现在 Query log 中。如果只看到显式指定服务器的那次,说明设备仍在使用其他解析器。

步骤 7:按域名配置 AdGuard Home 上游 DNS

在 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 名称,并在日志里核对上游一栏。

步骤 8:验证过滤、单项例外与泄漏

在 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。检查结束后删除两条测试规则。

步骤 9:撤销设备改动并卸载

先恢复测试设备原来的 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。

总结

  • 固定并校验发行版本,改动前记录解析配置。
  • 用可以删除的片段文件释放 53 端口,不要盲目停用解析服务。
  • 同时用防火墙规则和 allowed_clients 限制应答对象。
  • 本地和公司域名交给各自上游,公共域名保留一个加密默认上游。
  • 先恢复设备,再卸载服务并把主机还原到原来的解析配置。

常见问题

不停用 systemd-resolved 也能运行 AdGuard Home 吗?

可以。只需用片段文件关闭它的 stub 监听;systemd-resolved 仍会运行,并把主机自身的查询转发到 127.0.0.1。

向导为什么提示 address already in use?

53 端口已被其他程序占用,通常是 systemd-resolved 的 stub 监听。按步骤 3 添加片段文件,或使用向导里的 Fix 按钮即可解决。

上游配置里的井号是什么意思?

域名块后面的 # 表示该域名不使用特定服务器,而是交给默认上游处理,常用于把某个子域名排除在专用上游之外。

一定要使用加密上游吗?

不是必须,但公共域名建议使用。明文上游查询会被网络路径上的设备和运营商看到,加密后能减少这类暴露。

把 53 端口开放到互联网安全吗?

不安全。开放解析器容易被滥用,DNS 服务应只留在局域网或私有网络内,并明确列出允许的客户端地址。

拦截已经生效,为什么还能看到部分广告?

DNS 规则以整个域名为单位拦截。与正文同域名投放的广告、缓存页面以及浏览器自带 DNS 都可能绕过这些规则。

卸载 AdGuard Home 会自动恢复我的 DNS 吗?

不会。要先恢复每台设备的 DNS 设置,再删除 resolved 片段文件,并把保存的 resolv.conf 链接放回原处。

免责声明:本文步骤依据官方文档整理,并非已完成测试的记录。只在获授权的主机和设备上操作,并保留可用的恢复路径。

来源:

  1. AdGuard Home v0.107.79 release — https://github.com/AdguardTeam/AdGuardHome/releases/tag/v0.107.79
  2. AdGuard Home Getting Started — https://adguard-dns.io/kb/adguard-home/getting-started/
  3. AdGuard Home Wiki — https://github.com/AdguardTeam/AdGuardHome/wiki
  4. AdGuard Home Wiki: Configuration — https://github.com/AdguardTeam/AdGuardHome/wiki/Configuration
  5. Ubuntu Manpage: systemd-resolved.service — https://manpages.ubuntu.com/manpages/noble/man8/systemd-resolved.service.8.html
  6. Ubuntu Firewall — https://ubuntu.com/server/docs/how-to/security/firewalls/
  7. Ubuntu Manpage: resolved.conf — https://manpages.ubuntu.com/manpages/noble/man5/resolved.conf.5.html
  8. AdGuard Home FAQ — https://adguard-dns.io/kb/adguard-home/faq/
  9. AdGuard Home Configuration — https://adguard-dns.io/kb/adguard-home/configuration/
  10. AdGuard Home Running Securely — https://adguard-dns.io/kb/adguard-home/running-securely/
  11. AdGuard DNS Known DNS Providers — https://adguard-dns.io/kb/general/dns-providers/
  12. AdGuard DNS Filtering Rules Syntax — https://adguard-dns.io/kb/general/dns-filtering-syntax/

Sources checked 2026 年 10 月 14 日。


延伸阅读:

开启 3 天免费试用

注册即可免费体验全部高级功能。

*仅限新用户;每位用户只能获得一次试用。

AdGuard Home 搭建教程:私有 DNS 过滤与按域名分流上游 | AethoVPN