前言
家里智能设备越来越多,每台设备都装广告拦截软件确实麻烦。不如换个思路:直接部署一个 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。
端口说明
| 端口 | 用途 | 是否必须 |
|---|---|---|
| 53 | DNS 服务 | ✅ 必须 |
| 80 | 管理面板(HTTP) | 可选(可改) |
| 3000 | 初始化向导 | ✅ 首次需要 |
| 443 | HTTPS | 可选 |
| 853 | DNS-over-TLS | 可选 |
| 6060 | pprof 调试 | 不推荐 |
用 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:
- 设置管理员账号密码
- DNS 监听端口保持 53
- 管理面板端口改为 8080(避免跟 nginx 冲突)
- 完成向导
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 Filter | AdGuard 自带 | 基础广告过滤 |
| AdAway Default Blocklist | AdGuard 自带 | Android 去广告软件 AdAway 的默认列表 |
| anti-AD | https://anti-ad.net/easylist.txt | 中文区命中率最高的广告过滤 |
| 乘风规则 | https://raw.githubusercontent.com/xinggsf/adblock-plus-rule/master/rule.txt | 视频广告过滤 |
| EasyList | https://easylist.to/easylist/easylist.txt | 国际广告过滤 |
| EasyPrivacy | https://easylist.to/easylist/easyprivacy.txt | 隐私追踪过滤 |
添加步骤
- 进入「过滤器」→「DNS 黑名单」
- 点击「添加黑名单」
- 粘贴规则列表地址
- 启用规则
验证效果
# 测试广告域名
nslookup ad.doubleclick.net NAS内网IP
nslookup adsmind.gdtimg.com NAS内网IP
返回 NXDOMAIN 或 0.0.0.0 就说明生效了。
路由器配置
把家里路由器的 DNS 指向 NAS IP:
- 登录路由器管理界面
- 找到 DNS 设置
- 主 DNS 填入 NAS 内网 IP
- 保存并重启路由器
所有连 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。
总结
几个关键点:
- 网络模式:host 模式,客户端 IP 真实显示
- DNS 缓存:上游 TTL + 乐观缓存,省心
- 过滤规则:anti-AD + AdAway + 乘风 + EasyList + EasyPrivacy,国内外广告和隐私追踪都覆盖了
- 管理面板:改用非 80 端口,别跟 NAS 其他服务打架
部署完,全家设备自动去广告,不用每台设备单独折腾了。
本文记录于 2026-07-19,基于 AdGuard Home v0.107.78 版本。