linux - systemd-resolved 日志报错 DNSSEC validation failed for question

起因

安装软件,频繁失败,报错信息如下,很明显,说的是 DNS 超时(另外,我通过 ping baidu.com 有的时候特别慢)

示意图

问题排查

当前环境:Ubuntu 20.04.6 LTS

系统的 DNS 解析,依赖 /etc/resolv.conf,内容如下

示意图

很明显,DNS 服务器配置的是 127.0.0.53,并且我们已知的是,DNS 解析是 53 端口。因此我们检索哪个服务在监听 127.0.0.53 的 53 端口。如下

示意图

很明显,该端口由 systemd-resolve 服务监听。也就是 systemctl status systemd-resolved 启动的服务

因此,我们监视当前服务的日志,并且发送网络请求。发现如下报错(也就是本文名字提到的错误)

示意图

原因分析

背景知识:DNSSEC 是什么?

  • DNSSEC = DNS Security Extensions
  • 它为 DNS 响应提供数字签名,用来防止中间人攻击、DNS 投毒
  • 需要 DNS 服务器支持并配置得当,否则客户端会验证失败

总之,DNSSEC(DNS Security Extensions)主要目的就是:通过给 DNS 记录加数字签名,确保客户端收到的 DNS 响应是经过权威 DNS 服务器签名的,未被中间人篡改,从而避免被重定向到恶意服务器

说回之前的错误,这条错误常见于如下情况:

  • 【本地】你使用了支持 DNSSEC 的本地 resolver(如 systemd-resolved)
  • 【上游 DNS 服务器】没有启用或配置正确的 DNSSEC
  • 【目标域名(如 mirrors.ustc.edu.cn)】 SRV 记录本身没有签名,或者签名链不完整

因此,该功能好是好,但是大部分国内主流大网站像 baidu.comtaobao.commirrors.ustc.edu.cn 目前大多未启用 DNSSEC。因此,即使你用支持 DNSSEC 的 DNS 服务器查询,也拿不到 DNSKEY 记录,自然就无法做 DNSSEC 验证。并且会频繁报错且网络变慢(DNS 解析慢导致)

因此,经过上述分析,最终结论是:关闭 systemd-resolved 的 DNSSEC 功能

问题解决

通过命令 sudo vi /etc/systemd/resolved.conf 编辑配置文件,将 DNSSEC 改为 no(我改之前是 yes)。如下

示意图

保存退出后,重启服务

1
sudo systemctl restart systemd-resolved

检查效果

改完之后,无论是安装软件,还是 ping 命令速度都明显提示(这里的速度指的响应内容的速度(就是 64 bytes ... 第一条出现的速度,改之前很明显卡好几秒),而不是 time 那个字段)

示意图