前言

家里智能设备越来越多,每台设备都装广告拦截软件确实麻烦。不如换个思路:直接部署一个 DNS 服务器,在域名解析阶段就把广告干掉,全家设备自动生效。

本文记录了在绿联 DH4300 Plus NAS 上用 Docker 部署 AdGuard Home 的完整过程。

AdGuard Home 是什么

简单说就是个能过滤广告的 DNS 服务器。设备上网时先问它要域名对应的 IP,它觉得这个域名是广告就不告诉你,广告自然就加载不出来了。

主要能力:

  • DNS 广告过滤:拦截广告域名
  • 隐私保护:阻止跟踪器
  • 家长控制:可以过滤不良内容
  • 加密 DNS:支持 DNS-over-HTTPS/TLS
  • DHCP:可选的内置 DHCP 功能

环境准备

  • NAS:绿联 DH4300 Plus(Linux 系统)
  • Docker:已安装 Docker 和 Docker Compose
  • 网络:家庭局域网环境

Docker Compose 配置

完整配置

version: "3"

services:
  adguardhome:
    image: adguard/adguardhome:latest
    container_name: adguardhome
    network_mode: host
    restart: unless-stopped
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./work:/opt/adguardhome/work
      - ./conf:/opt/adguardhome/conf

volumes 路径说明./ 表示相对于 docker-compose.yml 文件所在目录的路径。比如 docker-compose.yml 放在 /volume1/docker/adguardhome/ 下,那 ./work 就对应 /volume1/docker/adguardhome/work

端口说明

端口用途是否必须
53DNS 服务✅ 必须
80管理面板(HTTP)可选(可改)
3000初始化向导✅ 首次需要
443HTTPS可选
853DNS-over-TLS可选
6060pprof 调试不推荐

用 host 模式还是 bridge?

模式优点缺点
bridge端口可自定义,不与宿主机冲突客户端 IP 显示为 Docker 网桥 IP
host客户端 IP 真实显示端口直接占用宿主机,可能冲突

建议用 host 模式。AdGuard Home 能按设备做精细化过滤和统计,bridge 模式下看不到真实 IP,这个功能就废了。

部署步骤

1. 创建目录

mkdir -p /volume1/docker/adguardhome/{work,conf}
cd /volume1/docker/adguardhome

2. 编写 docker-compose.yml

cat > docker-compose.yml << 'EOF'
version: "3"

services:
  adguardhome:
    image: adguard/adguardhome:latest
    container_name: adguardhome
    network_mode: host
    restart: unless-stopped
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./work:/opt/adguardhome/work
      - ./conf:/opt/adguardhome/conf
EOF

docker-compose.yml 文件放在 adguardhome 目录下。

3. 检查端口占用

ss -tlnp | grep :53

如果 53 端口被占用(比如 systemd-resolved),先关掉:

# 禁用 DNSStubListener
mkdir -p /etc/systemd/resolved.conf.d
cat > /etc/systemd/resolved.conf.d/adguardhome.conf << 'EOF'
[Resolve]
DNS=127.0.0.1
DNSStubListener=no
EOF

# 重启 systemd-resolved
systemctl restart systemd-resolved

4. 启动容器

# 在 docker-compose.yml 所在目录启动
docker compose up -d

# 或者指定文件路径(不需要在当前目录)
docker compose -f /volume1/docker/adguardhome/docker-compose.yml up -d

5. 初始化设置

浏览器访问 http://NAS内网IP:3000

  1. 设置管理员账号密码
  2. DNS 监听端口保持 53
  3. 管理面板端口改为 8080(避免跟 nginx 冲突)
  4. 完成向导

6. 访问管理面板

初始化完成后,通过 http://NAS内网IP:8080 访问。

DNS 服务配置

上游 DNS

国内用这两个就行,解析快:

223.5.5.5
119.29.29.29

DNS 缓存

缓存大小:4194304(4MB)
最小 TTL:0(禁用,用上游值)
最大 TTL:0(禁用,用上游值)
乐观缓存:开启

为什么用上游 TTL?

  • 上游 DNS 对不同记录类型有成熟的 TTL 策略
  • 配合乐观缓存可以提前刷新即将过期的缓存
  • 不用自己纠结该设多少合适

其他设置

监听端口:53
并发请求模式:负载均衡
EDNS:开启
DNSSEC:开启
查询日志:开启,保留 24 小时

过滤规则配置

推荐规则列表

规则列表地址说明
AdGuard DNS FilterAdGuard 自带基础广告过滤
AdAway Default BlocklistAdGuard 自带Android 去广告软件 AdAway 的默认列表
anti-ADhttps://anti-ad.net/easylist.txt中文区命中率最高的广告过滤
乘风规则https://raw.githubusercontent.com/xinggsf/adblock-plus-rule/master/rule.txt视频广告过滤
EasyListhttps://easylist.to/easylist/easylist.txt国际广告过滤
EasyPrivacyhttps://easylist.to/easylist/easyprivacy.txt隐私追踪过滤

添加步骤

  1. 进入「过滤器」→「DNS 黑名单」
  2. 点击「添加黑名单」
  3. 粘贴规则列表地址
  4. 启用规则

验证效果

# 测试广告域名
nslookup ad.doubleclick.net NAS内网IP
nslookup adsmind.gdtimg.com NAS内网IP

返回 NXDOMAIN0.0.0.0 就说明生效了。

路由器配置

把家里路由器的 DNS 指向 NAS IP:

  1. 登录路由器管理界面
  2. 找到 DNS 设置
  3. 主 DNS 填入 NAS 内网 IP
  4. 保存并重启路由器

所有连 WiFi 的设备都会自动用 AdGuard Home 做 DNS。

常见问题

1. 管理面板访问不了

80 端口被其他服务占了(比如 nginx)。初始化时把管理面板端口改成 8080 或其他空闲端口。

2. 客户端 IP 显示为 172.17.x.x

用了 bridge 网络模式。改用 network_mode: host 就行。

3. 某些域名解析失败

DNSSEC 验证失败或者规则误杀。可以临时关掉 DNSSEC 排查,或者在「白名单」里加被误杀的域名。

4. DNS 查询速度慢

规则列表太多或者上游 DNS 响应慢。精简规则列表,或者换个更快的上游 DNS。

总结

几个关键点:

  1. 网络模式:host 模式,客户端 IP 真实显示
  2. DNS 缓存:上游 TTL + 乐观缓存,省心
  3. 过滤规则:anti-AD + AdAway + 乘风 + EasyList + EasyPrivacy,国内外广告和隐私追踪都覆盖了
  4. 管理面板:改用非 80 端口,别跟 NAS 其他服务打架

部署完,全家设备自动去广告,不用每台设备单独折腾了。


本文记录于 2026-07-19,基于 AdGuard Home v0.107.78 版本。