如何在 VPS 上设置 AdGuard Home
在 Ubuntu 上安装 AdGuard Home,完成首次运行向导,锁定 Web UI,启用 DNS-over-HTTPS 和 DNS-over-TLS,把设备指向你的解析器,并避免跑出一个全网都能滥用的开放 DNS 服务器。

AdGuard Home 是带 Web 界面的自托管 DNS 黑洞和偏递归式解析器。它可以为把它当作 DNS 的每台设备——手机、笔记本、智能电视,以及其他 VPS 项目——拦截广告、跟踪器和恶意软件域名。与浏览器扩展不同,它对忽略 hosts 文件的应用也有效。当你希望在路上也用同一套过滤,或不想在家庭网络上放一台 Raspberry Pi 时,把它跑在 VPS 上很有用。
你绝不能上线的危险默认是开放解析器:如果 UDP/TCP 53 从整个互联网可达且没有访问控制,陌生人会拿你的 VPS 做 DNS 放大,你会收到滥用投诉。本指南在 Ubuntu 上安装 AdGuard Home,除非你有意暴露加密 DNS,否则把 DNS 绑到 localhost 或私有 WireGuard 接口,把仪表盘放到 HTTPS 上,并说明笔记本和手机如何使用 DNS-over-HTTPS(DoH)或 DNS-over-TLS(DoT),而不把经典端口 53 向全世界打开。
AdGuard Home 擅长什么
常见对比对象是 Pi-hole。AdGuard Home 是带内置 Web UI 的单一二进制,可选加密 DNS 前端,以及按客户端的设置。你可以在 Docker 里跑,也可以作为 systemd 服务。在 Hiddence VPS 上,它和私有 VPN 很搭:设备加入 WireGuard,经隧道把 DNS 发到 VPS,从不公开端口 53。
- 全网拦截,不必在每台设备上装应用
- DoH(443)和 DoT(853),让公共 Wi-Fi 上的 DNS 不是明文
- 查询日志和统计,能看到哪台设备在访问哪个域名
- 自定义上游(Quad9、Cloudflare,或你自己的 Unbound)
- 占用很小——1 GB 的 VPS 就能过滤一个家庭外加几个额外客户端
要求
如果要为 DoH/DoT 和仪表盘要一张受信任的证书,你需要域名。可以先在 HTTP 和服务器 IP 上测试,但不要一直那样。如果 Ubuntu 上 systemd-resolved 已经占用端口 53,我们会在 AdGuard Home 绑定 DNS 之前把它腾出来。
- 带 root/sudo 的 Ubuntu 22.04 或 24.04 VPS
- 个人使用 1 GB RAM 就够
- 带指向 VPS 的 A 记录的域名或子域名(dns.example.com)
- SSH 访问;如果只想在隧道内提供 DNS,可选 WireGuard
步骤 1:腾出端口 53 并安装 AdGuard Home
Ubuntu Server 常常把 systemd-resolved 当作 127.0.0.53:53 上的存根。AdGuard Home 想在你选择的接口上占用 53。安装程序可以做这件事,但显式做可以避免 VPS 自身 DNS 半残(服务器仍然需要解析软件包)。
ssh root@YOUR_VPS_IP
apt update && apt -y upgrade
apt -y install curl ca-certificates
# See who owns port 53:
ss -tulpn | grep ':53'
# Typical Ubuntu fix: stop stub listener, point the OS at a temporary resolver
mkdir -p /etc/systemd/resolved.conf.d
cat >/etc/systemd/resolved.conf.d/adguardhome.conf <<'EOF'
[Resolve]
DNS=1.1.1.1
DNSStubListener=no
EOF
ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
systemctl restart systemd-resolved
curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v步骤 2:首次运行向导
安装程序会打印一个 URL,通常是 http://YOUR_IP:3000/。打开它,用长密码创建管理员用户,并选择监听地址。对公网 VPS,安全的首次设置是:Admin Web 在 127.0.0.1:3000(你将把 Caddy 放在前面)或 TLS 之后的 80/443;DNS 监听在 127.0.0.1:53 加上 VPN 接口,而不是 0.0.0.0:53。如果你真的需要给朋友局域网式 DNS,优先在 443/853 上带认证的 DoH/DoT,而不是开放的 53/udp。
选择你信任的上游 DNS 服务器。很多人使用 https://dns.quad9.net/dns-query 或 Cloudflare。如果想要更快的故障转移,启用并行请求。打开默认过滤列表,然后再加更多——第一天启用五十个列表,会让站点出问题时无法调试。
步骤 3:仪表盘的反向代理和 HTTPS
向导结束后,AdGuard Home 通常会把 UI 挪到端口 80。如果你也托管站点,这会和 Caddy 或 Nginx 冲突。干净的模式是:AdGuard Home Web 在 127.0.0.1:8080,DNS 在 127.0.0.1:53,Caddy 在 443 上同时承担仪表盘和 DoH。
# In AdGuard Home settings, bind the web UI to 127.0.0.1:8080
# Example Caddyfile:
dns.example.com {
reverse_proxy 127.0.0.1:8080
}
# After Caddy is up:
curl -I https://dns.example.com步骤 4:启用 DNS-over-HTTPS 和 DNS-over-TLS
在 Encryption 设置中启用加密,把服务器名设为 dns.example.com,并让 AdGuard Home 指向你的证书文件——可以是 Caddy 存储的,也可以是它在 443 上监听时自己获取的。DoH 通常是 https://dns.example.com/dns-query。DoT 是 dns.example.com:853。如果 Caddy 已经占用 443,让 Caddy 终止 TLS 并把 DoH 路径反向代理到 AdGuard Home 的明文 HTTP DoH 端口,或者让 AdGuard Home 监听 443 并把仪表盘放到另一个子域名。
在改每台设备之前,先用客户端验证。在带现代 curl 的笔记本上:
curl -H 'accept: application/dns-json' 'https://dns.example.com/dns-query?name=example.com&type=A'
# DoT test (kdig from knot-dnsutils, if installed):
# kdig @dns.example.com +tls-ca +tls-host=dns.example.com example.com步骤 5:把真实设备指向你的解析器
Windows 11 和较新的 Android 可以使用 DoH 模板。iOS 可以使用配置描述文件或支持 DoH 的客户端。Firefox 和 Chromium 也允许自定义 DoH URL。对于家用路由器,仅当路由器支持 DoT/DoH 时才设置 WAN DNS;否则跑 WireGuard,把 DNS 设成 VPS 的 VPN IP,这样经典 DNS 永远不会穿越互联网。
- Android 9+:私人 DNS(DoT)→ dns.example.com
- Firefox:设置 → 网络 → DNS over HTTPS → 自定义 URL https://dns.example.com/dns-query
- Apple 设备:已签名的 mobileconfig,或支持 DoH/DoT 的应用
- 其他 VPS:把 resolv.conf 或 systemd-resolved 设成这个 AdGuard 实例的 WireGuard IP
- 不要在没有加密的情况下,把这个 VPS IP 设成随机公共网络上的 DNS
步骤 6:防火墙——关掉开放递归 DNS
这一节能防止讨厌的意外。允许 SSH、HTTPS,以及可选的 DoT 用 853/tcp。除非你有非常具体、有速率限制、经过认证的设计,否则不要从 0.0.0.0/0 允许 53/udp——即便那样,你多半也不该这么做。
ufw allow OpenSSH
ufw allow 443/tcp comment 'dashboard + DoH'
ufw allow 853/tcp comment 'DoT'
# If DNS is only on WireGuard (example iface wg0, 10.8.0.1):
# ufw allow in on wg0 to any port 53 proto udp
ufw enable
ufw status verbose
# Confirm 53 is not public:
ss -tulpn | grep ':53'过滤器、允许列表和客户端
从 AdGuard 的默认 DNS 过滤器和一份恶意软件列表开始。站点行为异常时,查看查询日志,然后加一条具体的允许规则,而不是关掉所有拦截。使用客户端名称(按 IP,或 DoH URL 中的 ClientID),这样你可以对智能电视用更严的列表,对工作笔记本用更松的列表。只有在你真的想要时才启用安全搜索——它会让没要求改写 Google 结果的人吃惊。
- 查询日志:找到被拦截的域名,若是误报再白名单
- 客户端设置:每台设备不同的拦截列表
- 不允许的客户端:拦截你不拥有的网段
- 速率限制:一旦暴露给不止一小撮用户就打开
故障排除
如果 VPS 自己无法 apt update,你在腾出端口 53 时弄坏了本地 DNS——按上面所示在 resolved.conf 里放一个静态解析器。如果设备「有网」但广告仍在加载,它们在绕过你的 DNS(硬编码解析器、浏览器里的 DoH,或使用自有 DNS 的应用)。如果仪表盘是空的,你看的是错误实例,或向导把 UI 挪走之后仍在打端口 3000。
- apt 失败:检查 /etc/resolv.conf 和 systemd-resolved
- 端口 53 被占用:ss -tulpn,禁用存根监听器
- DoH 证书错误:主机名必须匹配证书 SAN
- 广告仍可见:浏览器 DoH 到另一家提供商覆盖了操作系统
- RAM 很高:查询日志 + 太多过滤列表——裁列表并缩短日志保留
安全清单
Web UI 是管理面板。唯一密码、仅 HTTPS,并且不要公开 URL。保持 AdGuard Home 更新;安装脚本和 UI 都提供更新路径。如果只有你的设备该用 DoH,就限制 443——DoH 路径上的 HTTP basic auth 或仅 WireGuard 访问,远比出名的开放解析器更安全。
- 没有公开的 53/udp
- 仪表盘使用 HTTPS
- 强管理员密码,存在密码管理器里
- 家庭设备优先 WireGuard + 内部 DNS
- 把 AdGuardHome.yaml 备份到服务器外
提示
- 每次升级前备份 /opt/AdGuardHome/AdGuardHome.yaml
- 使用专用子域名;不要和无关 CMS 共用
- 如果已经在跑 Caddy,让 Caddy 占用 443,AdGuard Home 留在 localhost
- 把设备用的 DoH URL 记下来——你会忘
- 搭配 SSH 加固和防火墙指南,让 VPS 不只是「DNS 安全」
VPS 上的 AdGuard Home 很直接:在本地腾出端口 53,跑安装程序,用强管理员密码完成向导,把 UI 放到 HTTPS 上,启用 DoH/DoT,并把经典 DNS 从公共互联网拿掉。把设备指向你的加密端点或 VPN IP,从一小套过滤器开始,出问题时用查询日志。那是你真正控制的私有解析器——不是会把你的 VPS 送进滥用数据库的公共开放 DNS。