🏅SmartDNS + AdGuard Home完整实战:防DNS泄露、自动更新规则和定时任务配置

💡
导语:这是自建 DNS 三件套之实践完结篇。建议先看 #76 理论篇 搞懂拓扑与分流原理,并完成 #75 环境篇(VPS / SSH / Docker Compose)后再跟做。本集完成 SmartDNS + AdGuard Home 部署、域名列表自动更新、防 DNS 泄露与 crontab 定时任务。

🏅SmartDNS + AdGuard Home完整实战:防DNS泄露、自动更新规则和定时任务配置

开场 — 实践完结篇 + 三件套前置

开场 — 实践完结篇 + 三件套前置

1. 三件套前置与 script 脚本概览

视频是 SmartDNS 系列的最后一集,假设你已完成理论篇和环境搭建篇。所有运维脚本集中在 script/ 目录(可向 MMH 志愿者索取源码):

文件 作用
cleancache.sh 重启 SmartDNS 前清除缓存
docker-compose.yml AdGuard Home + SmartDNS 容器定义
restart_adguardhome.sh 定时重启 AdGuard(如每天 3:22)
restart_smartdns.sh 定时重启 SmartDNS(如每天 3:20)
update_domestic_domainlist.sh 从 GitHub 拉取国内域名列表
update_oversea_domainlist.sh 从 GitHub 拉取被墙域名列表
smartdns.conf SmartDNS 分流与上游配置模板
script 文件夹 — 全套脚本概览

script 文件夹 — 全套脚本概览

2. smartdns 工作目录与域名列表脚本

media/ 下创建 smartdns/,拷贝 restart 与 update 脚本。两个 update 脚本逻辑相同:

  • 国内列表:GitHub 公开源 → 正则清洗 → domestic_domainlist.conf
  • 海外列表:GFW 被墙域名 → 清洗 → oversea_domainlist.conf
smartdns 工作目录与脚本拷贝

smartdns 工作目录与脚本拷贝

国内域名 update 脚本逻辑

国内域名 update 脚本逻辑

海外被墙域名 update 脚本

海外被墙域名 update 脚本

正确做法:列表每 2–3 天更新一次,配合 crontab 自动执行,无需手动维护。

3. restart 重启脚本

restart_smartdns.sh

执行顺序:更新国内 + 海外列表 → 重启 SmartDNS 容器 → 清除缓存 → 写日志。

restart_smartdns.sh 重启流程

restart_smartdns.sh 重启流程

restart_adguardhome.sh

与 SmartDNS 版类似,但只重启 AdGuard Home 容器,切换路径不同。

restart_adguardhome.sh

restart_adguardhome.sh

4. smartdns.conf 分流与上游配置

核心配置项:

配置 说明
监听端口 Docker 映射 1053(UDP/TCP),conf 中需一致
国内上游 阿里 ×3 + 腾讯 ×2 + ISP + 114 = 8 台
海外上游 Cloudflare + Google TLS 等 = 5 台
分流规则 domestic 标签 → 国内组;oversea → 海外组
默认策略 不在列表中的域名 → 走海外
日志 生产用 info;演示用 debug
smartdns.conf 分流策略配置

smartdns.conf 分流策略配置

docker-compose 端口 1053 映射

docker-compose 端口 1053 映射

国内 / 海外上游 DNS 服务器

国内 / 海外上游 DNS 服务器

domestic / oversea 分流规则

domestic / oversea 分流规则

⚠️

避坑指南:conf 文件需拷贝到 smartdns/config/ 后再启动容器,否则分流规则不生效。

5. Docker Compose 部署与 dig 测试

cd media/script
docker compose up -d
docker ps   # 确认 smartdns + adguardhome 运行中
docker compose up 启动双容器

docker compose up 启动双容器

SmartDNS 外部端口 1053,用 dig 验证分流:

# 国内域名 — 应走 domestic 组
dig @127.0.0.1 -p 1053 taobao.com

# 被墙域名 — 应走 oversea 组
dig @127.0.0.1 -p 1053 facebook.com

# 另开终端查看日志
docker logs smartdns
dig 测试淘宝 domestic 分流

dig 测试淘宝 domestic 分流

6. AdGuard Home 安装

  1. 云防火墙放行 3000 端口(演示用;家内网部署无需公网暴露)
  2. 浏览器访问 http://VPS_IP:3000
  3. 初始化向导 → 创建管理员 → 进入仪表盘
防火墙放行 AdGuard 3000 端口

防火墙放行 AdGuard 3000 端口

AdGuard Home 安装向导

AdGuard Home 安装向导

7. AdGuard DNS 设置 — 防 DNS 泄露

核心步骤

  1. 查 Docker 网络 IP:docker network inspect media_dns-net
  2. SmartDNS 通常为 172.19.0.2:1053
  3. AdGuard → 设置 → DNS 设置:上游填 SmartDNS 内网地址 + 端口 1053
  4. 删除所有默认后备 DNS(防泄露关键!)
  5. 后备 DNS 也指向 SmartDNS → 测试上游 → 应用
AdGuard DNS 上游 + 防泄露设置

AdGuard DNS 上游 + 防泄露设置

⚠️

避坑指南:保留 AdGuard 默认的 8.8.8.8 等后备 DNS = DNS 泄露。必须全部替换为 SmartDNS 上游。

8. 分流验证与 crontab 定时任务

在 AdGuard 查询日志搜索 facebook.com,应看到:AdGuard → SmartDNS → oversea 组 → 5 台海外上游 → 正确 IP

Facebook oversea 分流验证

Facebook oversea 分流验证

Linux 计划任务(crontab -e):

15 3 * * * /path/media/smartdns/update_domestic_domainlist.sh
15 3 * * * /path/media/smartdns/update_oversea_domainlist.sh
20 3 * * * /path/media/smartdns/restart_smartdns.sh
22 3 * * * /path/media/adguardhome/restart_adguardhome.sh

顺序:先更新列表 → 重启 SmartDNS → 重启 AdGuard。保存:ESCShift+ZZ

crontab 定时任务配置

crontab 定时任务配置

9. 生产环境调优

建议
平均响应时间 缓存充足后约 40–65ms
上游显示 仪表盘应只有 1 个 SmartDNS 上游
日志保留 常规设置 → 日志和统计 → 1 天
广告黑名单 推荐 半条命 + ANTI-AD 两个 DNS 黑名单

FAQ

Q1:没看理论篇可以直接跟做吗?
A:建议先看 #76 理论篇#75 环境篇,否则不理解「为什么要删后备 DNS」。

Q2:脚本源码哪里获取?
A:视频提到可向 MMH 志愿者索取完整 script/ 目录。

Q3:必须每天重启吗?
A:重启 + 更新列表可确保分流规则与缓存始终最新;时间可自定,建议凌晨低峰。

Q4:部署在家内网还是 VPS?
A:推荐家内网常开设备;视频用 VPS 演示,演示后会删除。

Q5:只搭 SmartDNS 不搭 AdGuard 行吗?
A:可以,但 AdGuard 提供广告过滤 + 图形界面;组合方案更完整。

Q6:如何确认没有 DNS 泄露?
A:AdGuard 上游和后备 DNS 全部指向 SmartDNS,删除所有公共 DNS;用 dnsleaktest.com 验证。

结语

完整链路:AdGuard Home(过滤 + 入口)→ SmartDNS(测速分流)→ 国内/海外上游 DNS。配合 crontab 自动更新域名列表,系统可长期稳定运行。

📺 完整视频: YouTube 实战篇(41 分钟)

📚 系列: #76 理论篇 · #75 环境篇 · 致新同学信


留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注