unbound如何配置递归DNS解析

联启 网络工具 17

本文目录导读:

unbound如何配置递归DNS解析-第1张图片-电脑手机工具软件下载 - 免费实用工具合集 | 联启科技

  1. 安装 Unbound
  2. 核心配置文件:unbound.conf
  3. 配置根信任锚 (Root Trust Anchor) 用于 DNSSEC
  4. (可选) 配置转发模式 (Forwarding)
  5. 启动和测试
  6. 配置系统使用本地 Unbound
  7. 常见问题与调优

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. 测试递归解析是否生效

使用 dignslookup 直接查询本地 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 允许该网段访问。

常见问题与调优

  1. 高并发场景:需要调整 num-threads (默认 2),outgoing-range (传出端口数量),so-rcvbuf 等参数,CPU 核心数多时可以增加线程数。
  2. 内存占用:如果内存有限,减小 msg-cache-sizerrset-cache-size
  3. 日志过多:将 verbosity 设置为 01,关闭 logfile 使用 syslog。
  4. 无法解析
    • 检查防火墙是否开放 UDP/TCP 53 端口。
    • 检查 access-control 是否允许你的客户端 IP。
    • 检查系统网络是否能访问外网(特别是 53 端口没有被运营商封锁)。
    • 如果使用 DNSSEC,确保信任锚文件存在且有效。
  5. 性能优化
    • 增加 cache-min-ttl 以减少与上游服务器的交互,但会降低数据新鲜度。
    • 使用 prefetch 选项,在缓存即将过期时自动提前刷新(推荐)。
      prefetch: yes
      prefetch-key: yes

配置 Unbound 进行递归 DNS 解析的核心步骤是:

  1. 安装 Unbound。
  2. 编辑 /etc/unbound/unbound.conf:设置监听地址、访问控制、缓存大小、启用 DNSSEC。
  3. 下载根信任锚unbound-anchor)。
  4. 检查并启动服务unbound-checkconf && systemctl restart unbound)。
  5. dig 测试,确保解析正常且 DNSSEC 验证通过(如需要)。
  6. 配置系统或局域网设备使用该 DNS 服务器。

通过以上配置,你已经成功搭建了一个属于自己的、安全且高效的递归 DNS 解析器。

标签: unbound 配置

抱歉,评论功能暂时关闭!