linxu DNS systemd-resolved

八月 13, 2025 #DNS

systemd-resolved 获取上游 DNS 的途径

systemd-resolved 不会依赖 /etc/resolv.conf 获取上游 DNS(因为那是它给应用程序提供的入口)。它通过更底层的、按网络接口(Link)独立配置 的方式获取上游 DNS:

网络管理器配置(主要来源):

[Network]
DNS=192.168.1.1 8.8.8.8
DNS=1.1.1.1

systemd-resolved 全局配置文件 (/etc/systemd/resolved.conf):

可以作为备用或全局覆盖,使用 DNS= 选项:

[Resolve]
DNS=9.9.9.9 2620:fe::fe # 例如 Quad9 DNS
FallbackDNS=8.8.8.8 2001:4860:4860::8888 # 备用 Google DNS
Domains=~example.com # 搜索域
#DNSSEC=yes # 可选 DNSSEC 配置

DHCP 客户端集成:

VPN 或特殊网络接口:

当连接 VPN(如 OpenVPN, WireGuard)或使用特殊接口(如 PPPoE)时:

linux dns查询如何到达真正的上游 DNS?

  1. 应用程序发起查询: 浏览器等 App 请求 www.example.com。

  2. 查询发送到 stub: 根据 /etc/resolv.conf (指向 127.0.0.53),查询被发送到本机 systemd-resolved 服务。

  3. systemd-resolved 处理:

    • 检查本地缓存(如有缓存且有效,直接返回结果)。
    • 检查是否属于 LLMNR/mDNS 域名(如 .local),如果是则在本地链路处理。
    • 判断查询应使用哪个网络接口的上游 DNS (基于源接口、路由策略、域名后缀匹配)。
  4. 转发到上游 DNS: systemd-resolved 将查询转发给为该接口/域配置的真正上游 DNS 服务器(如 192.168.1.1 或 9.9.9.9)。

    • 支持协议:传统 UDP/TCP DNS,或加密的 DNS-over-TLS (DoT) / DNS-over-HTTPS (DoH)(需配置)。
  5. 接收并处理响应:

    • 接收上游 DNS 返回的响应。
    • 可选进行 DNSSEC 验证(若配置)。
    • 将响应结果缓存(根据记录的 TTL)。
    • 将最终结果返回给发起查询的应用程序。