构建高可用、统一管理的内网 DNS 过滤服务
在企业内网或家庭网络环境中,DNS 服务不仅是域名解析的基础设施,更是网络安全的第一道防线。随着网络威胁的日益复杂化,传统的 DNS 服务已无法满足现代网络对安全性、隐私保护和内容过滤的需求。
本文介绍如何利用两个优秀的开源项目——AdGuard Home 和 AdGuard Home Sync,构建一套高可用、易管理、功能强大的内网分布式 DNS 服务架构。该方案能够实现:
- 🛡️ 全网广告拦截:覆盖所有设备,无需安装客户端
- 🔒 隐私保护:阻止追踪器,加密 DNS 查询
- 🏠 家长控制:过滤成人内容,强制安全搜索
- ⚡ 高可用性:多节点部署,自动故障转移
- 🔄 统一配置:一次配置,自动同步到所有节点
- 📊 可视化监控:实时查看 DNS 查询统计和网络活动
AdGuard Home
AdGuard Home 是一款开源的网络级广告和追踪拦截 DNS 服务器,由知名广告拦截软件厂商 AdGuard 开发。
核心特性
| 功能类别 | 具体功能 |
|---|---|
| 广告拦截 | 基于 DNS sinkhole 技术,拦截广告和追踪域名 |
| 加密 DNS | 支持 DoH (DNS-over-HTTPS)、DoT (DNS-over-TLS)、DNSCrypt |
| DHCP 服务 | 内置 DHCP 服务器,支持静态 IP 分配 |
| 访问控制 | 基于 IP/MAC 的客户端访问策略 |
| 内容过滤 | 家长控制、强制安全搜索、恶意域名拦截 |
| 监控统计 | 实时 DNS 查询日志和统计分析 |
| 跨平台 | Linux、macOS、Windows、Docker、OpenWrt 等 |
与 Pi-hole 对比
| 功能 | AdGuard Home | Pi-hole |
|---|---|---|
| 广告和追踪拦截 | ✅ | ✅ |
| 自定义拦截列表 | ✅ | ✅ |
| 内置 DHCP 服务器 | ✅ | ✅ |
| HTTPS 管理界面 | ✅ 原生支持 | ⚠️ 需手动配置 |
| 加密 DNS 上游 | ✅ 原生支持 | ❌ 需额外软件 |
| 跨平台 | ✅ 原生支持 | ❌ 仅 Docker |
| DoH/DoT 服务端 | ✅ | ❌ 需额外软件 |
| 恶意域名拦截 | ✅ | ⚠️ 需非默认列表 |
| 家长控制 | ✅ | ⚠️ 需非默认列表 |
| 强制安全搜索 | ✅ | ❌ |
| 免 Root 运行 | ✅ | ❌ |
AdGuard Home Sync
AdGuard Home Sync 是一个专门用于同步多个 AdGuard Home 实例配置的工具,由社区开发者 bakito 维护。
同步功能
- ✅ 通用设置(General Settings)
- ✅ 过滤规则(Filters)
- ✅ DNS 重写(Rewrites)
- ✅ 服务控制(Services)
- ✅ 客户端配置(Clients)
- ✅ DNS 配置(DNS Config)
- ✅ DHCP 配置(DHCP Config)
- ✅ 界面主题(Theme)
- ✅ TLS 配置(TLS Config)
部署特性
- 🕐 定时同步:支持 Cron 表达式配置同步频率
- 🚀 启动同步:支持服务启动时自动同步
- 📦 Docker 支持:官方 Docker 镜像,便于容器化部署
- 🔧 灵活配置:支持环境变量和 YAML 配置文件
- 🌐 API 接口:提供 REST API 和 Web 管理界面
- 📈 监控指标:支持 Prometheus 格式的指标导出
典型部署架构

高可用设计
- 多节点部署:至少部署 2-3 个 AdGuard Home 节点
- DNS 轮询:在 DHCP 中配置多个 DNS 服务器地址(可选)
- 配置同步:通过 Sync 确保所有节点配置一致
- 健康检查:定期检查节点可用性,自动切换
环境要求
| 组件 | 最低配置 | 推荐配置 |
|---|---|---|
| AdGuard Home | 1 核 CPU, 256MB 内存 | 2 核 CPU, 512MB 内存 |
| AdGuard Home Sync | 0.5 核 CPU, 128MB 内存 | 1 核 CPU, 256MB 内存 |
| 存储 | 1GB | 5GB+ |
| 操作系统 | Linux/macOS/Windows | Linux (Ubuntu 22.04+) |
方案一:Docker Compose 部署(推荐)
1. 创建目录结构
mkdir -p /opt/adguard/{node1,node2,node3,sync}
cd /opt/adguard
2. 部署 AdGuard Home 节点
创建 docker-compose.yml:
version: '3.8'
services:
# AdGuard Home 主节点
adguard-node1:
image: adguard/adguardhome:latest
container_name: adguard-node1
restart: unless-stopped
ports:
- "53:53/tcp"
- "53:53/udp"
- "853:853/tcp"
- "3000:3000/tcp"
- "443:443/tcp"
volumes:
- ./node1/work:/opt/adguardhome/work
- ./node1/conf:/opt/adguardhome/conf
networks:
adguard-net:
ipv4_address: 172.20.0.10
# AdGuard Home 副本节点 1
adguard-node2:
image: adguard/adguardhome:latest
container_name: adguard-node2
restart: unless-stopped
ports:
- "54:53/tcp"
- "54:53/udp"
- "854:853/tcp"
- "3001:3000/tcp"
volumes:
- ./node2/work:/opt/adguardhome/work
- ./node2/conf:/opt/adguardhome/conf
networks:
adguard-net:
ipv4_address: 172.20.0.11
# AdGuard Home 副本节点 2
adguard-node3:
image: adguard/adguardhome:latest
container_name: adguard-node3
restart: unless-stopped
ports:
- "55:53/tcp"
- "55:53/udp"
- "855:853/tcp"
- "3002:3000/tcp"
volumes:
- ./node3/work:/opt/adguardhome/work
- ./node3/conf:/opt/adguardhome/conf
networks:
adguard-net:
ipv4_address: 172.20.0.12
# AdGuard Home Sync 同步服务
adguard-sync:
image: ghcr.io/bakito/adguardhome-sync:latest
container_name: adguard-sync
restart: unless-stopped
ports:
- "8080:8080/tcp"
volumes:
- ./sync:/config
environment:
- TZ=Asia/Shanghai
- LOG_LEVEL=info
depends_on:
- adguard-node1
- adguard-node2
- adguard-node3
networks:
- adguard-net
networks:
adguard-net:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
3. 配置 Sync 服务
创建 sync/adguardhome-sync.yaml:
---
# 同步计划(Cron 表达式)
cron: "0 */2 * * *" # 每 2 小时同步一次
# 启动时立即同步
runOnStart: true
# 错误时继续同步
continueOnError: true
# 主节点配置
origin:
url: http://172.20.0.10:3000
webURL: http://192.168.1.10:3000
username: admin
password: your_secure_password
insecureSkipVerify: false
autoSetup: false
# 副本节点配置
replicas:
- url: http://172.20.0.11:3000
webURL: http://192.168.1.11:3000
username: admin
password: your_secure_password
insecureSkipVerify: false
autoSetup: false
- url: http://172.20.0.12:3000
webURL: http://192.168.1.12:3000
username: admin
password: your_secure_password
insecureSkipVerify: false
autoSetup: false
# API 配置(Web 管理界面)
api:
port: 8080
username: sync_admin
password: sync_secure_password
darkMode: true
metrics:
enabled: true
scrapeInterval: 60
queryLogLimit: 1000
# 功能开关
features:
dns:
accessLists: true
serverConfig: true
rewrites: true
dhcp:
serverConfig: true
staticLeases: true
generalSettings: true
protectionStatus: true
queryLogConfig: true
statsConfig: true
clientSettings: true
services: true
filters: true
theme: true
tlsConfig: true
4. 启动服务
docker compose up -d
方案二:Systemd 服务部署
1. 安装 AdGuard Home
# 下载并安装
curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
# 或使用 wget
wget --no-verbose -O - https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
2. 安装 AdGuard Home Sync
# 从 GitHub Releases 下载
wget https://github.com/bakito/adguardhome-sync/releases/latest/download/adguardhome-sync-linux-amd64 -O /opt/adguardhome-sync/adguardhome-sync
chmod +x /opt/adguardhome-sync/adguardhome-sync
3. 创建 Systemd 服务
创建 /etc/systemd/system/adguardhome-sync.service:
[Unit]
Description=AdGuardHome Sync Service
After=network.target adguardhome.service
Wants=adguardhome.service
[Service]
Type=simple
User=root
ExecStart=/opt/adguardhome-sync/adguardhome-sync --config /opt/adguardhome-sync/adguardhome-sync.yaml run
Restart=on-failure
RestartSec=10
Environment=LOG_LEVEL=info
[Install]
WantedBy=multi-user.target
4. 启动服务
sudo systemctl daemon-reload
sudo systemctl enable adguardhome-sync
sudo systemctl start adguardhome-sync
sudo systemctl status adguardhome-sync
AdGuard Home 核心配置
1. DNS 上游服务器配置
在 AdGuard Home Web 界面或配置文件中设置:
dns:
upstream_dns:
- tls://1.1.1.1
- tls://1.0.0.1
- https://dns.google/dns-query
- tls://dns.quad9.net
bootstrap_dns:
- 1.1.1.1
- 8.8.8.8
fallback_dns:
- tls://8.8.8.8
- tls://8.8.4.4
2. 过滤规则配置
推荐订阅的过滤列表:
| 列表名称 | URL | 用途 |
|---|---|---|
| AdGuard DNS Filter | https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt | 综合过滤 |
| OISD Big | https://big.oisd.nl/ | 大型综合列表 |
| StevenBlack Hosts | https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts | 基础拦截 |
| Anti-AD | https://anti-ad.net/easylist.txt | 中文广告过滤 |
| EasyList China | https://easylist-downloads.adblockplus.org/easylistchina.txt | 中文网站过滤 |
3. DHCP 配置
dhcp:
enabled: true
interface_name: eth0
v4:
gateway_ip: 192.168.1.1
subnet_mask: 255.255.255.0
range_start: 192.168.1.100
range_end: 192.168.1.200
lease_duration: 24h
v6:
range_start: 2001:db8::100
range_end: 2001:db8::200
AdGuard Home Sync 配置参数
环境变量配置
# 日志级别
export LOG_LEVEL=info
# 主节点配置
export ORIGIN_URL=http://192.168.1.10:3000
export ORIGIN_USERNAME=admin
export ORIGIN_PASSWORD=your_password
# 副本节点配置
export REPLICA1_URL=http://192.168.1.11:3000
export REPLICA1_USERNAME=admin
export REPLICA1_PASSWORD=your_password
export REPLICA2_URL=http://192.168.1.12:3000
export REPLICA2_USERNAME=admin
export REPLICA2_PASSWORD=your_password
# 同步计划
export CRON="0 */2 * * *"
# 启动时同步
export RUN_ON_START=true
# 运行同步
adguardhome-sync run
功能开关说明
| 配置项 | 默认值 | 说明 |
|---|---|---|
features.dns.accessLists | true | 同步 DNS 访问列表 |
features.dns.serverConfig | true | 同步 DNS 服务器配置 |
features.dns.rewrites | true | 同步 DNS 重写规则 |
features.dhcp.serverConfig | true | 同步 DHCP 服务器配置 |
features.dhcp.staticLeases | true | 同步 DHCP 静态租约 |
features.generalSettings | true | 同步通用设置 |
features.protectionStatus | true | 同步保护状态 |
features.filters | true | 同步过滤规则 |
features.clientSettings | true | 同步客户端设置 |
features.theme | true | 同步界面主题 |
监控与告警
1. 内置监控指标
AdGuard Home Sync 提供 Prometheus 格式的监控指标:
# 访问 metrics 端点
curl http://localhost:8080/metrics
关键指标包括:
adguardhome_sync_status- 同步状态adguardhome_sync_last_sync_timestamp- 最后同步时间戳adguardhome_sync_duration_seconds- 同步耗时adguardhome_sync_errors_total- 错误计数
2. Grafana 仪表板
导入以下指标创建监控面板:
# 同步状态
adguardhome_sync_status
# 同步延迟
time() - adguardhome_sync_last_sync_timestamp
# 错误率
rate(adguardhome_sync_errors_total[5m])
日志管理
日志级别
| 级别 | 说明 | 使用场景 |
|---|---|---|
debug | 调试信息 | 故障排查 |
info | 一般信息 | 日常运行(默认) |
warn | 警告信息 | 关注潜在问题 |
error | 错误信息 | 仅记录错误 |
日志格式
# 控制台格式(默认)
export LOG_FORMAT=console
# JSON 格式(便于日志收集)
export LOG_FORMAT=json
备份与恢复
配置备份脚本
#!/bin/bash
# backup-adguard.sh
BACKUP_DIR="/backup/adguard"
DATE=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份 AdGuard Home 配置
tar -czf $BACKUP_DIR/adguard_conf_$DATE.tar.gz \
/opt/adguard/node1/conf \
/opt/adguard/node2/conf \
/opt/adguard/node3/conf
# 备份 Sync 配置
cp /opt/adguard/sync/adguardhome-sync.yaml \
$BACKUP_DIR/sync_conf_$DATE.yaml
# 保留最近 30 天的备份
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete
find $BACKUP_DIR -name "*.yaml" -mtime +30 -delete
echo "Backup completed: $DATE"
定时备份
# 添加到 crontab
0 2 * * * /opt/adguard/backup-adguard.sh
1. 安全加固
TLS/SSL 配置
为 AdGuard Home 启用 HTTPS:
# 在 Sync 配置中
features:
tlsConfig: true
# 在 AdGuard Home 配置中
tls:
enabled: true
server_name: adguard.example.com
port_https: 443
port_dns_over_tls: 853
certificate_chain: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
private_key: |
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
访问控制
# 限制管理界面访问
clients:
- name: Admin-PC
ids:
- 192.168.1.100
use_global_settings: false
filtering_enabled: true
parental_enabled: true
safebrowsing_enabled: true
2. 性能优化
缓存配置
cache:
enabled: true
size: 131072 # 128K 条目
ttl_min: 60 # 最小 TTL(秒)
ttl_max: 86400 # 最大 TTL(秒)
查询日志
querylog:
enabled: true
interval: 90 # 保留 90 天
size_memory: 1000 # 内存中保留条目数
3. 网络配置建议
DHCP DNS 分配
在路由器或 DHCP 服务器中配置:
DNS Server 1: 192.168.1.10 # 主节点
DNS Server 2: 192.168.1.11 # 副本节点 1
DNS Server 3: 192.168.1.12 # 副本节点 2
上游 DNS 选择
推荐的上游 DNS 组合:
# 国内用户推荐
upstream_dns:
- tls://dns.alidns.com # 阿里 DNS
- tls://dot.pub # 腾讯 DNS
- tls://1.1.1.1 # Cloudflare(备用)
# 国际用户推荐
upstream_dns:
- tls://1.1.1.1 # Cloudflare
- tls://8.8.8.8 # Google
- tls://dns.quad9.net # Quad9(安全)
4. 故障排查
常见问题及解决方案
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 同步失败 | 网络不通 | 检查防火墙规则,确保端口可达 |
| 认证失败 | 密码错误 | 验证用户名密码,检查特殊字符 |
| 配置不一致 | 同步计划过长 | 缩短 Cron 间隔,启用启动同步 |
| DNS 解析慢 | 上游 DNS 延迟高 | 更换更近的上游 DNS 服务器 |
| 内存占用高 | 查询日志过大 | 减少日志保留时间,限制内存大小 |
诊断命令
# 检查服务状态
docker compose ps
systemctl status adguardhome-sync
# 查看日志
docker compose logs -f adguard-sync
journalctl -u adguardhome-sync -f
# 测试 DNS 解析
dig @192.168.1.10 example.com
nslookup example.com 192.168.1.10
# 检查同步状态
curl -u sync_admin:password http://localhost:8080/api/v1/status
通过结合 AdGuard Home 和 AdGuard Home Sync,我们成功构建了一套功能完善、高可用的内网分布式 DNS 服务架构。这套方案具有以下优势:
核心优势
- 统一管理:通过 Sync 实现配置集中管理,避免手动同步
- 高可用性:多节点部署,单点故障不影响服务
- 安全性:支持加密 DNS,拦截恶意域名
- 易维护:Docker 化部署,便于升级和备份
- 可扩展:支持横向扩展,轻松添加新节点
- 可视化:Web 界面直观展示统计和状态
适用场景
- 🏢 企业内网 DNS 服务
- 🏠 家庭网络广告拦截
- 🏫 银行内部/分支机构网络管理
- ☁️ 多地点分布式部署
- 🔬 网络研究和分析
本文基于 AdGuard Home v0.107.x 和 AdGuard Home Sync v0.9.x 编写,配置可能随版本更新有所变化,请以官方文档为准。
评论区