本文目录导读:

- 安装 Unbound
- 核心配置文件:
unbound.conf - 配置根信任锚 (Root Trust Anchor) 用于 DNSSEC
- (可选) 配置转发模式 (Forwarding)
- 启动和测试
- 配置系统使用本地 Unbound
- 常见问题与调优
Unbound 是一款功能强大、安全且高性能的递归 DNS 解析器,它不提供权威解析(即不托管域名),而是专门用于从根域名服务器开始,逐级查询,最终获得域名对应的 IP 地址。
以下是如何配置 Unbound 实现递归 DNS 解析的详细步骤。
安装 Unbound
需要在你的系统上安装 Unbound。
-
Debian / Ubuntu:
sudo apt update sudo apt install unbound
-
CentOS / RHEL / Fedora:
sudo yum install unbound # 或者 sudo dnf install unbound
-
macOS (使用 Homebrew):
brew install unbound
核心配置文件:unbound.conf
Unbound 的主要配置文件通常位于 /etc/unbound/unbound.conf 或 /usr/local/etc/unbound/unbound.conf,可以通过编辑此文件来配置递归解析行为。
最小递归配置示例
以下是一个最基本的配置,用于实现一个本地递归服务器,建议先用这个配置测试,之后再根据需求优化。
# /etc/unbound/unbound.conf
server:
# 监听地址和端口,默认监听 localhost,这很安全。
# 如果想让局域网内其他设备使用,可以添加局域网 IP。
# 注意:开放到公网是非常危险的。
interface: 127.0.0.1
interface: ::1
# interface: 192.168.1.100 # 举例:你的局域网 IP
# 监听端口,默认 53
port: 53
# 允许哪些 IP 地址使用本解析器
# 默认仅允许本地主机,将其设置为你的局域网段以允许内网设备
access-control: 127.0.0.0/8 allow
access-control: ::1 allow
# access-control: 192.168.1.0/24 allow # 允许 192.168.1.x 网段
# DNS 安全扩展 (DNSSEC):强烈建议启用,用于验证 DNS 数据完整性
# 这需要提前下载信任锚文件。
auto-trust-anchor-file: "/var/lib/unbound/root.key"
# 或者手动指定信任锚
# trust-anchor-file: /etc/unbound/root.key
# 验证 DNS 记录的真实性,若 DNSSEC 验证失败,会返回 SERVFAIL。
val-bailiwick: yes
val-clean-additional: yes
# 缓存设置
# 缓存大小,单位 bytes,默认 4MiB,可以根据内存调整。
# cache-min-ttl: 3600 # 缓存最小 TTL (秒)
# cache-max-ttl: 86400 # 缓存最大 TTL (秒)
msg-cache-size: 100m
rrset-cache-size: 200m
# 日志设置 (用于调试,生产环境可关闭)
verbosity: 1
# 0: 仅错误
# 1: 操作信息
# 2: 详细操作信息
# 3-5: 调试级别 (非常详细)
# 日志文件
# logfile: "/var/log/unbound/unbound.log"
# 如果留空,默认输出到 syslog
# 隐藏版本信息,提高安全性
hide-identity: yes
hide-version: yes
# 拒绝任何不包含查询 ID 的包 (防止某些攻击)
harden-short-bufsize: no
# 是否使用根区提示文件
# Unbound 通常内置了根服务器列表,如果需要配置自定义:
# root-hints: "/var/lib/unbound/root.hints"
# 远程控制设置 (用于 unbound-control 监控和刷新缓存)
# 生产环境不建议开启,除非你知道在做什么。
# remote-control:
# control-enable: yes
# control-interface: 127.0.0.1
# control-port: 8953
配置根信任锚 (Root Trust Anchor) 用于 DNSSEC
如果启用了 DNSSEC (推荐),需要下载根信任锚文件。
大多数 Linux 发行版包会帮你处理,如果文件不存在,可以手动生成:
# unbound-anchor 可用 sudo unbound-anchor -a "/var/lib/unbound/root.key" # 或者使用 wget/curl 从 IANA 下载 (不推荐,因无签名验证) # 但 unbound-anchor 是最安全的方式
如果文件路径与配置不同,请调整 auto-trust-anchor-file 的路径。
(可选) 配置转发模式 (Forwarding)
如果你不想让 Unbound 直接从根服务器开始递归(这可能比较慢或受网络限制),可以将其配置为转发模式,它会将查询请求发送给上游 DNS 服务器(如公司内部 DNS 或公共 DNS 如 8.8.8.8 或 1.1.1.1)。
注意: 转发模式不是真正的递归解析,如果上游 DNS 被污染,你的解析结果也会被污染,只有在需要绕过某些网络限制或利用特定内部 DNS 时才使用。
# 在 unbound.conf 的末尾添加
forward-zone:
name: "."
# 将 "." 区域(即所有域名)转发到以下地址
forward-addr: 8.8.8.8
forward-addr: 8.8.4.4
# forward-addr: 1.1.1.1
# forward-addr: 208.67.222.222 # OpenDNS
# 如果上游 DNS 不支持 DNSSEC,可以关闭
# forward-no-cache: no
forward-ssl-upstream: yes # 使用 DNS over TLS 进行安全转发
启动和测试
a. 检查配置是否正确
sudo unbound-checkconf
如果输出 unbound-checkconf: no errors in /etc/unbound/unbound.conf,则配置无误。
b. 启动 / 启用 / 重启服务
# 启动 sudo systemctl start unbound # 设置开机自启 sudo systemctl enable unbound # 重启 (修改配置后) sudo systemctl restart unbound
c. 测试递归解析是否生效
使用 dig 或 nslookup 直接查询本地 Unbound 服务器。
# 查询本地 Unbound dig @127.0.0.1 www.google.com # 查看响应,重点关注 "SERVER" 和 "Query time" 字段。 # SERVER: 127.0.0.1#53(LOCALHOST) <-- 说明是本地服务器 # Query time: 47 msec <-- 初始查询时间可能较长,后续应很快 # 查询一个不存在的域名,测试是否返回 NXDOMAIN dig @127.0.0.1 asdfghjkla.testdomain.123 # 应返回 status: NXDOMAIN
d. 测试 DNSSEC
# 查询一个使用 DNSSEC 签名的域名 dig @127.0.0.1 sigok.verteiltesysteme.net # 查询一个 DNSSEC 验证会失败的域名 dig @127.0.0.1 sigfail.verteiltesysteme.net # 在 dig 输出中,寻找 "ad" 标志 (Authenticated Data)。 # sigok 的响应头应包含 "ad";sigfail 应返回 SERVFAIL。
配置系统使用本地 Unbound
为了让整个系统使用你配置的 Unbound,需要修改系统的 DNS 设置。
-
Linux (传统方式 /etc/resolv.conf):
# 编辑 /etc/resolv.conf sudo nano /etc/resolv.conf # 将其内容替换为: nameserver 127.0.0.1 # 注意:某些系统 (如 Ubuntu 使用 netplan/systemd-resolved) 可能会自动覆盖此文件。
-
Ubuntu 18.04+ / Debian Buster+ (使用 systemd-resolved): 更好的方式是配置 systemd-resolved 将查询转发给本地 Unbound。
# 编辑 /etc/systemd/resolved.conf [Resolve] DNS=127.0.0.1 # 取消注释并设置为"no"或留空 (这会直接使用 Unbound) # 如果希望 systemd-resolved 作为 Unbound 的前端 (多一层缓存/处理),可以继续保持注释
-
修改路由器 / DHCP 设置: 如果你想局域网内所有设备都使用你的 Unbound,可以在路由器 DHCP 设置中将 DNS 服务器地址指向运行 Unbound 的机器的局域网 IP(
168.1.100)。务必确保 Unbound 的access-control允许该网段访问。
常见问题与调优
- 高并发场景:需要调整
num-threads(默认 2),outgoing-range(传出端口数量),so-rcvbuf等参数,CPU 核心数多时可以增加线程数。 - 内存占用:如果内存有限,减小
msg-cache-size和rrset-cache-size。 - 日志过多:将
verbosity设置为0或1,关闭logfile使用 syslog。 - 无法解析:
- 检查防火墙是否开放 UDP/TCP 53 端口。
- 检查
access-control是否允许你的客户端 IP。 - 检查系统网络是否能访问外网(特别是 53 端口没有被运营商封锁)。
- 如果使用 DNSSEC,确保信任锚文件存在且有效。
- 性能优化:
- 增加
cache-min-ttl以减少与上游服务器的交互,但会降低数据新鲜度。 - 使用
prefetch选项,在缓存即将过期时自动提前刷新(推荐)。prefetch: yes prefetch-key: yes
- 增加
配置 Unbound 进行递归 DNS 解析的核心步骤是:
- 安装 Unbound。
- 编辑
/etc/unbound/unbound.conf:设置监听地址、访问控制、缓存大小、启用 DNSSEC。 - 下载根信任锚(
unbound-anchor)。 - 检查并启动服务(
unbound-checkconf && systemctl restart unbound)。 - 用
dig测试,确保解析正常且 DNSSEC 验证通过(如需要)。 - 配置系统或局域网设备使用该 DNS 服务器。
通过以上配置,你已经成功搭建了一个属于自己的、安全且高效的递归 DNS 解析器。