unbound安装

unbound安装

背景

dns递归查询未加密,可以被运营商或者其他人看到我们的上网记录。DNS递归查询加密之后,我们的上网记录不容易被其他人窥探。


基础环境

操作系统:ubuntu 22.04

时区设置

# 注意时钟不同步可能会导致DNS解析失败,务必保证时钟同步
sudo timedatectl set-timezone Asia/Shanghai


安装unbound

# 安装unbound
sudo apt update
sudo apt install unbound -y

# 查看unbound版本
unbound -V

修改配置

unbound配置文件都存放在/etc/unbound/unbound.conf.d/目录

注意:当开启递归查询加密功能时,dnssec会失败

server:
    # 监听所有网络接口,以便为局域网其他设备提供服务
    interface: 0.0.0.0
    # 允许所有客户端访问(生产环境建议限制为你的局域网段,例如 192.168.1.0/24)
    access-control: 10.0.0.0/8 allow
    # 可选:设置缓存大小等性能参数
    msg-cache-size: 32m
    rrset-cache-size: 64m
    # 指向系统自带的证书束
    tls-cert-bundle: "/etc/ssl/certs/ca-certificates.crt"
    # 允许在 DNSSEC 验证失败时仍然返回结果(用于排查阶段)
    #val-permissive-mode: yes
    # 增加这个配置,有时能解决因上游处理不当导致的验证失败
    #domain-insecure: "."

# 定义转发区域
forward-zone:
    # "." 代表转发所有域名查询
    name: "."
    # 关键配置:启用 TLS 加密转发,并指定上游 DoT 服务器
    forward-tls-upstream: yes
    # 格式:IP地址@端口#验证域名
    #forward-addr: 1.1.1.1@853#cloudflare-dns.com
    #forward-addr: 1.0.0.1@853#cloudflare-dns.com
    # 转发至 阿里 DoT
    forward-addr: 223.5.5.5@853#dns.alidns.com
    # 建议增加一个备份,防止阿里线路波动(比如腾讯或 360)
    #forward-addr: 120.53.53.53@853#dot.pub
    #forward-addr: 8.8.8.8@853#dns.google




检查配置并启动

# 检查unbound配置
sudo unbound-checkconf 

# Ubuntu 系统自带的 systemd-resolved 服务默认会占用 53 端口。你需要停止它并释放端口,Unbound 才能正常工作
sudo systemctl disable --now systemd-resolved

# 启动
sudo systemctl enable --now unbound

# 验证解析:

dig google.com @10.2.8.20

F&Q

1、/var/lib/unbound/root.key文件被配置了两次

报错信息如下:

Mar 17 06:13:20 sl-dns unbound[127701]: [127701:0] error: trust anchor presented twice
Mar 17 06:13:20 sl-dns unbound[127701]: [127701:0] error: could not parse auto-trust-anchor-file /var/lib/unbound/root.key line 2
Mar 17 06:13:20 sl-dns unbound[127701]: [127701:0] error: error reading auto-trust-anchor-file: /var/lib/unbound/root.key
Mar 17 06:13:20 sl-dns unbound[127701]: [127701:0] error: validator: error in trustanchors config
Mar 17 06:13:20 sl-dns unbound[127701]: [127701:0] error: validator: could not apply configuration settings.
Mar 17 06:13:20 sl-dns unbound[127701]: [127701:0] error: module init for module validator failed
Mar 17 06:13:20 sl-dns unbound[127701]: [127701:0] fatal error: failed to setup modules

原因分析:

系统自带的配置文件root-auto-trust-anchor-file.conf中,已经默认指定了/var/lib/unbound/root.key,在自定义的配置文件中不要再次指定auto-trust-anchor-file这个配置项。

2、与上游dns握手失败

报错信息如下:

Mar 17 06:39:36 sl-dns unbound[128425]: [128425:0] notice: ssl handshake failed 120.53.53.53 port 853
Mar 17 06:39:36 sl-dns unbound[128425]: [128425:0] error: ssl handshake failed crypto error:0A000086:SSL routines::certificate verify failed
Mar 17 06:39:36 sl-dns unbound[128425]: [128425:0] notice: ssl handshake failed 120.53.53.53 port 853
Mar 17 06:39:36 sl-dns unbound[128425]: [128425:0] error: ssl handshake failed crypto error:0A000086:SSL routines::certificate verify failed
Mar 17 06:39:36 sl-dns unbound[128425]: [128425:0] notice: ssl handshake failed 120.53.53.53 port 853
Mar 17 06:39:36 sl-dns unbound[128425]: [128425:0] error: ssl handshake failed crypto error:0A000086:SSL routines::certificate verify failed
Mar 17 06:39:36 sl-dns unbound[128425]: [128425:0] notice: ssl handshake failed 120.53.53.53 port 853

原因分析:

Unbound 虽然尝试通过 TLS 加密连接上游 DNS,但它不信任上游服务器(阿里)提供的 SSL 证书。Unbound 作为一个“验证者”,它手里必须有一份“信任名单”(根证书),才能去验证阿里(dns.alidns.com)的证书是不是真的。如果你的 Linux 系统是精简版或者没安装相关软件包,它就谁也不信。

解决办法:
# 首先安装根证书
# Ubuntu / Debian
sudo apt update && sudo apt install ca-certificates -y

# CentOS / RHEL
sudo yum install ca-certificates -y


# 即使系统安装了证书,Unbound 有时也找不到它们在哪。你需要在 server: 配置段落中明确告诉它去哪里找证书。
server:
    # ... 其他配置 ...
    # 指向系统自带的证书束
    tls-cert-bundle: "/etc/ssl/certs/ca-certificates.crt"

3、DNS请求不返回A记录地址

报错信息如下:

dig @10.2.8.20 www.baidu.com


; <<>> DiG 9.18.39-0ubuntu0.22.04.2-Ubuntu <<>> @10.2.8.20 www.baidu.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 46544
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;www.baidu.com. IN A

;; Query time: 0 msec
;; SERVER: 10.2.8.20#53(10.2.8.20) (UDP)
;; WHEN: Tue Mar 17 15:28:21 CST 2026

原因分析:

当 Unbound 开启了 DNSSEC 但无法建立信任链(Prime Trust Anchor 失败)时,为了安全,它会宁可不返回任何结果(SERVFAIL)。

解决办法:
禁用DNSSEC

找到 auto-trust-anchor-file 这一行,在前面加个 # 注释掉

posted @ 2026-03-18 11:27  李成敏  阅读(43)  评论(0)    收藏  举报