systemd-resolved 支持但默认不启用 dns over tls(dot),需手动配置可信上游服务器(如 1.1.1.1#cloudflare-dns.com)、启用 dnssec 和 dnsovertls=yes,并确保 stub resolver(127.0.0.53)生效且 networkmanager 未接管 dns。

systemd-resolved 支持 DNS over TLS(DoT),但默认不启用;它内置的 stub resolver(监听 127.0.0.53:53)可配合 DoT 使用,但需手动配置上游加密 DNS 服务器并启用验证机制。
确认 systemd-resolved 已启用并运行
DoT 功能依赖 resolved 正常工作。先检查状态:
- systemctl is-active systemd-resolved — 应返回 active
- resolvectl status — 查看当前 DNS 配置,确认 Global 或接口下有有效 DNS 服务器,且 LLMNR / mDNS 状态不影响 DoT
- 若使用 NetworkManager,确保其未接管 DNS:检查 nmcli dev show | grep DNS,必要时在
/etc/NetworkManager/conf.d/99-dns.conf中设dns=none并重启 NetworkManager
配置可信 DoT 上游服务器
systemd-resolved 仅支持带完整证书链、使用标准端口(853)且域名与证书 Subject Alternative Name 匹配的 DoT 服务器。常用推荐如下:
-
Cloudflare:
1.1.1.1#cloudflare-dns.com(证书由 DigiCert 签发,系统信任库通常已包含) -
Quad9:
9.9.9.9#dns.quad9.net(需确保系统时间准确,证书有效期敏感) - 避免使用自签名或私有 DoT 服务 — resolved 不支持自定义 CA 或证书固定(pinning)
写入配置文件:/etc/systemd/resolved.conf.d/dot.conf:
[Resolve] DNS=1.1.1.1#cloudflare-dns.com 9.9.9.9#dns.quad9.net FallbackDNS=1.0.0.1 8.8.8.8 DNSSEC=yes DNSOverTLS=yes
保存后执行 sudo systemctl restart systemd-resolved。
验证 DoT 是否生效
不能只看 resolvectl status 中是否显示 DoT 地址 — 需确认实际查询走加密通道:
- resolvectl query example.com — 输出中若含 via 1.1.1.1#cloudflare-dns.com (DNS-over-TLS) 即成功
- sudo journalctl -u systemd-resolved -f — 查询时应出现 Using DNS server 1.1.1.1 for interface … (DNS-over-TLS)
- 抓包验证(可选):sudo tcpdump -i lo port 853,再执行一次
resolvectl query,应看到 TLS 握手和加密 DNS 流量
stub resolver 使用注意事项
systemd-resolved 的 stub resolver 始终监听 127.0.0.53:53(UDP/TCP),所有发往该地址的 DNS 请求都会经 resolved 处理并按配置转发(含 DoT)。关键点:
-
/etc/resolv.conf 必须指向 stub:应为符号链接到
/run/systemd/resolve/stub-resolv.conf,内容含nameserver 127.0.0.53 - 应用无需修改 — 只要遵守系统 DNS 设置(如 glibc、musl、curl 默认行为),就自动走 stub → DoT 链路
- DNSSEC 验证由 resolved 在 DoT 解密后执行,不是在 TLS 层;
DNSSEC=yes启用验证,失败时返回 SERVFAIL(非静默降级)










