在 VPS 上安装 AdGuard Home,查看和过滤 DNS 请求

文章目录

想知道某个程序反复请求哪些域名,或者为自己的设备过滤部分广告域名,可以先搭一个可控的 DNS 服务。AdGuard Home 提供解析、过滤规则和查询记录,排查时比盲目换一组 DNS 地址更直观。

本文先在 VPS 本机做验证,DNS 不对公网开放。家庭设备若要使用远程 VPS,需要另外建立 VPN 和访问控制;只把 53 端口开放到公网会产生一个可被其他人使用的解析器。

先完成 DNS 服务的初始化

以下命令在 Linux VPS 上执行,需要有 Docker 操作权限。先运行 docker version 和 docker compose version,确认引擎与 Compose v2 都能工作。没有安装 Docker 时,按 Docker 官方安装说明选择对应发行版;不要把其他发行版的仓库配置直接复制过来。

示例工作目录为 /opt/adguardhome,所有相对路径都以这个目录为基准。VPS_IP、SSH 用户和示例域名需要换成自己的值。端口 3080 若已被占用,只改映射左侧的宿主机端口,并同步修改访问地址。

sudo install -d -m 0750 -o "$(id -u)" -g "$(id -g)" /opt/adguardhome
cd /opt/adguardhome
umask 077
mkdir -p work conf

应用初次安装监听容器内 3000,向导结束后本例管理页面改用容器内 80。启动后先在自己的电脑建立初始化隧道:

ssh -N -L 3006:127.0.0.1:3006 your_ssh_user@VPS_IP

打开 http://127.0.0.1:3006,向导中设置管理监听 0.0.0.0:80、DNS 监听 0.0.0.0:53,创建自己的管理员密码。容器内监听所有接口与宿主机向公网发布端口是两件事;宿主机映射仍限于回环地址。之后关闭初始化隧道,改用下文 3080。

将下面内容保存为 compose.yaml:

services:
  adguardhome:
    image: adguard/adguardhome:latest
    restart: unless-stopped
    ports:
      - "127.0.0.1:3006:3000/tcp"
      - "127.0.0.1:3080:80/tcp"
      - "127.0.0.1:5353:53/tcp"
      - "127.0.0.1:5353:53/udp"
    volumes:
      - ./work:/opt/adguardhome/work
      - ./conf:/opt/adguardhome/conf

在工作目录启动并检查日志:

docker compose config --quiet
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=80

启动后按下面的步骤试用。遇到目录不可写的报错,先核对 UID 和挂载路径,不要直接改成 chmod 777。

用 SSH 隧道打开界面

示例仅把应用端口发布到 VPS 的 127.0.0.1。在自己的电脑上运行以下命令,保留终端窗口,再打开 http://127.0.0.1:3080:

ssh -N -L 3080:127.0.0.1:3080 your_ssh_user@VPS_IP

浏览器里的回环地址是自己的电脑,SSH 把请求转到 VPS。若本地同号端口被占用,可换隧道左侧端口;涉及应用外部 URL 的项目也要一起调整。管理界面无需因此开放公网端口。

用一个测试规则确认过滤生效

在 DNS 设置中选可访问的上游服务。VPS 安装提供 dig 的工具包后,执行:

dig @127.0.0.1 -p 5353 example.com A
dig @127.0.0.1 -p 5353 example.com A +tcp

UDP 与 TCP 都应得到响应。再添加一条临时规则 ||example.com^,重新查询并检查查询日志中的过滤原因,最后删掉测试规则恢复正常解析。这样能区分“请求没到服务”与“规则没有命中”。

本例使用 5353 是为了避免与宿主机现有 DNS 冲突,不直接修改 /etc/resolv.conf,也不关闭系统解析器。普通设备通常只会向 53 端口发 DNS 请求,不能把 VPS_IP:5353 随手填进路由器当作完成接入。

后续通过 VPN 提供解析时,只在 VPN 地址上发布 53,限制允许来源,再从不在 VPN 内的网络验证访问被拒绝。Docker 网络转发可能改变服务看到的客户端地址,按客户端设置规则前应核对查询日志。

DNS 过滤只针对域名,不能保证去掉与正常内容共用域名的所有广告。列表误拦截时先找具体域名和规则,再考虑例外。

保留规则、设置与查询数据

配置与工作数据分别位于两个目录。恢复后检查管理员、上游、规则和 UDP/TCP 查询,不只看管理页。查询记录可能包含使用习惯,备份也按私人资料保管。

在工作目录执行下面的停机备份,压缩包保存在应用目录之外。停止全部服务会带来短暂不可用;确认停止成功后再打包。

docker compose stop
sudo install -d -m 0700 /var/backups/docker-apps
backup_file="/var/backups/docker-apps/$(basename "$PWD")-$(date +%Y%m%d-%H%M%S).tar.gz"
sudo tar -czpf "$backup_file" compose.yaml work conf
sudo chmod 0600 "$backup_file"
sudo tar -tzf "$backup_file" | head
docker compose start

将压缩包复制到 VPS 之外。恢复时,在另一台测试机器的空目录解包,保留文件所有者和相对路径,用原镜像版本启动,检查前面提到的数据。不要直接覆盖正在使用的原数据目录。

升级前先记录镜像 ID 或摘要,并保存这份备份。阅读项目更新说明后再拉取镜像;涉及数据库迁移时,回滚需要恢复旧数据与旧镜像,不能只把标签改回去。

安装参数和数据路径可对照AdGuard Home Docker 文档。

继续阅读 · 自托管 返回顶部