侧边栏壁纸
博主头像
欧阳博客

行动起来,活在当下

  • 累计撰写 143 篇文章
  • 累计创建 127 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

利用 AdGuard Home 与 AdGuard Home Sync 打造内网分布式 DNS 服务架构

欧阳
2026-03-07 / 0 评论 / 0 点赞 / 3 阅读 / 0 字

构建高可用、统一管理的内网 DNS 过滤服务

在企业内网或家庭网络环境中,DNS 服务不仅是域名解析的基础设施,更是网络安全的第一道防线。随着网络威胁的日益复杂化,传统的 DNS 服务已无法满足现代网络对安全性、隐私保护和内容过滤的需求。

本文介绍如何利用两个优秀的开源项目——AdGuard HomeAdGuard 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 HomePi-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 格式的指标导出

典型部署架构

部署架构图

高可用设计

  1. 多节点部署:至少部署 2-3 个 AdGuard Home 节点
  2. DNS 轮询:在 DHCP 中配置多个 DNS 服务器地址(可选)
  3. 配置同步:通过 Sync 确保所有节点配置一致
  4. 健康检查:定期检查节点可用性,自动切换

环境要求

组件最低配置推荐配置
AdGuard Home1 核 CPU, 256MB 内存2 核 CPU, 512MB 内存
AdGuard Home Sync0.5 核 CPU, 128MB 内存1 核 CPU, 256MB 内存
存储1GB5GB+
操作系统Linux/macOS/WindowsLinux (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 Filterhttps://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt综合过滤
OISD Bighttps://big.oisd.nl/大型综合列表
StevenBlack Hostshttps://raw.githubusercontent.com/StevenBlack/hosts/master/hosts基础拦截
Anti-ADhttps://anti-ad.net/easylist.txt中文广告过滤
EasyList Chinahttps://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.accessListstrue同步 DNS 访问列表
features.dns.serverConfigtrue同步 DNS 服务器配置
features.dns.rewritestrue同步 DNS 重写规则
features.dhcp.serverConfigtrue同步 DHCP 服务器配置
features.dhcp.staticLeasestrue同步 DHCP 静态租约
features.generalSettingstrue同步通用设置
features.protectionStatustrue同步保护状态
features.filterstrue同步过滤规则
features.clientSettingstrue同步客户端设置
features.themetrue同步界面主题

监控与告警

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 服务架构。这套方案具有以下优势:

核心优势

  1. 统一管理:通过 Sync 实现配置集中管理,避免手动同步
  2. 高可用性:多节点部署,单点故障不影响服务
  3. 安全性:支持加密 DNS,拦截恶意域名
  4. 易维护:Docker 化部署,便于升级和备份
  5. 可扩展:支持横向扩展,轻松添加新节点
  6. 可视化:Web 界面直观展示统计和状态

适用场景

  • 🏢 企业内网 DNS 服务
  • 🏠 家庭网络广告拦截
  • 🏫 银行内部/分支机构网络管理
  • ☁️ 多地点分布式部署
  • 🔬 网络研究和分析

本文基于 AdGuard Home v0.107.x 和 AdGuard Home Sync v0.9.x 编写,配置可能随版本更新有所变化,请以官方文档为准。

0

评论区