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 这一行,在前面加个 # 注释掉

浙公网安备 33010602011771号