Unbound + AdGuard Home + SmartDNS 三剑客部署指南

前言

在企业内网环境中,DNS服务面临着多重挑战:DNS劫持与污染、广告与恶意域名泛滥、国内外访问速度不均衡等。单一的DNS解决方案往往难以兼顾安全、体验与可管理性。

本文将介绍一套三合一的企业级DNS部署方案——Unbound + AdGuard Home + SmartDNS,通过三个开源组件的有机组合,打造一个兼具安全验证、广告过滤、智能分流能力的DNS基础设施。

方案概述

这套方案的核心思想是“各司其职,链路协作”。三个组件各自承担明确的职责,形成一条完整的DNS处理链:

组件

角色定位

核心职责

AdGuard Home

门卫

广告过滤、恶意域名拦截、查询日志与可视化

SmartDNS

智能导航

国内外分流、多上游测速优选

Unbound

安检员

DNSSEC安全验证、递归解析

数据流向

标准的企业部署位置

在企业内网中,理想的部署架构如下(以典型的三层架构为例)

为什么选择这个组合?

对比维度

Unbound方案

AH+SmartDNS方案

三合一方案

DNSSEC安全验证

✅ 核心能力

❌ 不支持

✅ 完整支持

广告/恶意域名过滤

❌ 不支持

✅ 核心能力

✅ 完整支持

智能测速与分流

❌ 不支持

✅ 核心能力

✅ 完整支持

可视化查询日志

❌ 弱

✅ 丰富

✅ 丰富

架构设计与端口规划

为了避免端口冲突,所有组件部署在同一台Linux服务器上,采用非标准端口错开服务:

服务

监听端口

说明

AdGuard Home

53 (UDP/TCP)

标准DNS端口,作为内网DNS入口

AdGuard Home Web

3000 (TCP)

Web管理界面

SmartDNS

6053 (UDP/TCP)

接收AGH转发请求

Unbound

5335 (UDP/TCP)

接收SmartDNS转发请求

环境要求

  • 操作系统:Ubuntu 22.04 / Debian 11+ / CentOS 7+

  • 硬件建议:2核CPU / 2GB内存 / 20GB磁盘(视内网规模调整)

  • 网络:静态内网IP,防火墙放行相应端口

第一步:部署 Unbound

Unbound 是一个高性能的递归DNS解析器,支持DNSSEC验证,是本方案的安全基石(安全验证层)。

1.1更换系统apt源(以debain为例)

编辑sources.list文件

nano /etc/apt/sources.list

注释掉或删除CD-ROM行

#deb cdrom:[Debian GNU/Linux 12.6.0 Bookworm ...] bookworm main

添加Debian网络源(国内镜像/清华或阿里源)

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware

deb https://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware

#

deb https://mirrors.aliyun.com/debian/ bookworm main contrib non-free non-free-firmware

deb https://mirrors.aliyun.com/debian/ bookworm-updates main contrib non-free non-free-firmware

deb https://mirrors.aliyun.com/debian/ bookworm-backports main contrib non-free non-free-firmware

deb https://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware

  • Ctrl+X

  • Y 确认保存

  • Enter 退出

1.2 安装 Unbound

Ubuntu/Debian:

sudo apt update

sudo apt install unbound -y

CentOS/RHEL:

sudo yum install epel-release -y

sudo yum install unbound -y

1.3 配置 Unbound

编辑配置文件 /etc/unbound/unbound.conf

server:

# 监听所有接口,端口设为 5335(避免与AGH抢占53端口)

interface: 0.0.0.0

port: 5335

# 访问控制:允许本机及内网网段查询

access-control: 127.0.0.0/8 allow

access-control: 192.168.0.0/16 allow # 根据实际网段修改

access-control: 10.0.0.0/8 allow

# 安全加固

hide-identity: yes

hide-version: yes

use-caps-for-id: yes

# 性能优化:缓存预取

prefetch: yes

prefetch-key: yes

# 开启DNSSEC验证(自动信任锚)

auto-trust-anchor-file: "/var/lib/unbound/root.key"

val-permissive-mode: no

# 缓存大小(单位:字节,4MB)

msg-cache-size: 4m

rrset-cache-size: 8m

# 递归超时设置

outgoing-range: 4096

num-threads: 2

# 转发区域配置(可选):

# 如果不希望Unbound做完整递归,可以配置转发到公共DNS

# forward-zone:

# name: "."

# forward-tls-upstream: yes

# forward-addr: 1.1.1.1@853

生成 DNSSEC 信任锚并启动

# 生成root.key(首次启动会自动生成,也可手动)

sudo unbound-anchor -a /var/lib/unbound/root.key

# 启动并设置开机自启

sudo systemctl enable unbound

sudo systemctl restart unbound

# 验证服务状态

sudo systemctl status unbound

1.4 验证 Unbound

# 本地测试查询

dig @127.0.0.1 -p 5335 www.baidu.com

*如返回正确的IP地址,说明Unbound部署成功。

第二步:部署 SmartDNS

*SmartDNS 是一个智能DNS转发器,支持测速优选和国内外分流。

*更加具体的详细的smartDNS安装配置可以跳转连接 >>>SmartDNS智能解析<<< 查看配置

2.1 安装 SmartDNS

Ubuntu/Debian:

sudo apt install smartdns -y

*注意:如果官方源没有,可以从 SmartDNS GitHub Releases 下载 .deb 包手动安装。

2.2 配置 SmartDNS

# ===== 基础监听配置 =====

# 监听端口,接收来自AGH的请求

bind :6053

# ===== 上游 DNS 服务器 =====

# 核心:指向本机的 Unbound 服务

server 127.0.0.1:5335

# 可选:添加备用上游(Unbound宕机时兜底)

# server 223.5.5.5 # 阿里DNS

# server 119.29.29.29 # 腾讯DNS

# ===== 性能优化 =====

# 缓存大小(条数)

cache-size 16384

# 测速模式:同时使用ping和TCP 80端口

speed-check-mode ping,tcp:80

# 域名预加载

prefetch-domain yes

# 响应超时(秒)

response-timeout 3

# ===== 日志(可选) =====

# 日志级别:info / debug

# log-level info

2.3 启动 SmartDNS

sudo systemctl enable smartdns

sudo systemctl restart smartdns

# 查看状态

sudo systemctl status smartdns

2.4 验证 SmartDNS

# 通过SmartDNS查询

dig @127.0.0.1 -p 6053 www.baidu.com

显示下图,即成功

第三步:部署 AdGuard Home

AdGuard Home 提供广告过滤、恶意域名拦截和可视化查询日志功能。

3.1 安装 AdGuard Home

使用官方一键脚本安装:

curl -s -S -L https://raw.githubusercontent.com/

AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v

3.2 释放系统 53 端口

系统默认的 systemd-resolved 会占用53端口,需要先停用:

sudo systemctl stop systemd-resolved

sudo systemctl disable systemd-resolved

# 修改系统DNS配置(让服务器自身能正常解析)

sudo rm /etc/resolv.conf

echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf

3.3 Web 初始化配置

通过浏览器访问 http://<你的服务器IP>:3000 进入初始化向导。并设置管理员用户名和密码。

设置Web管理端口3000(默认即可)。

设置DNS服务端口务必设置为 53

3.4 配置上游 DNS 服务器

登录 AGH 管理后台,进入 设置 → DNS 设置

配置项

填写内容

说明

上游DNS服务器

127.0.0.1:6053

指向SmartDNS

Bootstrap DNS服务器

223.5.5.5

用于解析上游域名(AGH自身解析用)

点击 测试上游 验证连通性,确认无误后保存。

3.5 添加广告拦截规则

过滤器 → DNS 拦截列表 中添加规则:

推荐规则源:

  • AdGuard 官方规则https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt

  • EasyList Chinahttps://easylist-downloads.adblockplus.org/easylistchina.txt

  • 乘风广告过滤https://gitee.com/xinggsf/Adblock-Rule/raw/master/rule.txt

3.6 启动 AdGuard Home

sudo systemctl enable AdGuardHome

sudo systemctl restart AdGuardHome

第四步:打通企业完整链路

逐层测试,确保每一级都能正常转发:

# 1. 测试 Unbound(最底层)

dig @127.0.0.1 -p 5335 www.baidu.com

# 2. 测试 SmartDNS(中间层)

dig @127.0.0.1 -p 6053 www.baidu.com

# 3. 测试 AdGuard Home(最外层)

dig @127.0.0.1 -p 53 www.baidu.com

注意:如果三层都返回正确的解析结果,说明整个DNS链已经打通。

4.2 检查 AGH 查询日志

登录 AGH Web 管理界面,进入 查询日志,应该能看到来自客户端的查询记录。

第五步:客户端接入配置

方案A:DHCP统一配置(推荐)

在公司路由器或核心交换机的DHCP服务中,将 首选 DNS 服务器 设置为部署了本方案的Linux服务器IP。

华为交换机示例:

dns-list <你的Linux服务器IP>

OpenWrt示例:

网络 → DHCP/DNS → 基本设置 → DNS转发:填写 <你的Linux服务器IP>#53

方案B:手动配置(测试/临时)

Windows:网络设置 → 手动DNS → 填入服务器IP

macOS:系统偏好设置 → 网络 → DNS → 添加服务器IP

Linux:修改 /etc/resolv.conf,添加 nameserver <服务器IP>

验证与测试

广告过滤测试

访问测试页面 AdBlock Test Page,页面会显示广告拦截率。

安全防护测试

尝试访问一个已知恶意域名(或使用 nslookup 查询),验证是否被拦截。

速度体验

分别使用公共DNS和本方案DNS访问国内外网站,感受速度差异。

常见问题与解决方案

问题1:53端口被占用

现象:AdGuard Home启动失败,提示端口被占用。

解决

# 查看占用端口的进程

sudo lsof -i :53

# 停止 systemd-resolved

sudo systemctl stop systemd-resolved

sudo systemctl disable systemd-resolved

问题2:内网域名无法解析

现象:公司内部域名(如 erp.company.local)解析失败。

解决:在 AdGuard Home 的 设置 → DNS 设置 → 私有反向 DNS 服务器 中,添加内网DNS服务器的转发规则。

问题3:防火墙拦截

现象:客户端无法查询,AGH日志无记录。

解决:确保Linux服务器防火墙放行相关端口:

# Ubuntu (ufw)

sudo ufw allow 53/udp

sudo ufw allow 53/tcp

sudo ufw allow 3000/tcp

# CentOS (firewalld)

sudo firewall-cmd --permanent --add-port=53/udp

sudo firewall-cmd --permanent --add-port=53/tcp

sudo firewall-cmd --permanent --add-port=3000/tcp

sudo firewall-cmd --reload

问题4:SmartDNS 无法启动

现象systemctl status smartdns 显示失败。

解决:查看日志定位具体错误:

sudo tail -f /var/log/smartdns/smartdns.log

总结

通过 Unbound + AdGuard Home + SmartDNS 三者的组合,实现了:

能力

实现组件

效果

✅ DNS劫持防护

Unbound (DNSSEC)

密码学验证应答真实性

✅ 广告与恶意域名拦截

AdGuard Home

海量黑名单实时更新

✅ 国内外访问加速

SmartDNS

多上游测速,智能优选

✅ 可视化运维管理

AdGuard Home

查询日志、拦截统计、Top域名

✅ 高可用可扩展

三层独立

任一层可独立升级或替换

这套方案不仅提升了企业内网的DNS安全水位,还显著改善了用户的访问体验,同时提供了友好的管理界面,是中小型企业DNS基础设施建设的优秀实践。


本文档为技术实践分享,具体配置请根据实际网络环境调整。

0%