跳转至内容

systemd-resolved

来自 ArchWiki

systemd-resolved 是一个 systemd 服务,它通过 D-Bus 接口、resolve NSS 服务 (nss-resolve(8)) 和监听在 127.0.0.53 的本地 DNS 存根,为本地应用程序提供网络名称解析。有关用法,请参阅 systemd-resolved(8)

安装

systemd-resolved 是默认安装的 systemd 包的一部分。

配置

systemd-resolved域名系统 (DNS)(包括 DNSSECDNS over TLS)、组播 DNS (mDNS)链路本地组播名称解析 (LLMNR) 提供解析器服务。

可以通过编辑 /etc/systemd/resolved.conf 和/或 /etc/systemd/resolved.conf.d/ 中的 .conf 文件的 drop-in 来配置解析器。请参阅 resolved.conf(5)

要使用 systemd-resolved,请 启动启用 systemd-resolved.service

提示 要理解选项和开关的上下文,可以按照 systemd#诊断服务 中所述,为 systemd-resolved 开启详细的调试信息。

DNS

依赖 glibc 的 getaddrinfo(3)(或类似函数)的软件可以开箱即用,因为默认情况下,如果 /etc/nsswitch.conf 可用,它会被配置为使用 nss-resolve(8)

为了提供 域名解析给直接读取 /etc/resolv.conf 的软件,例如 网页浏览器GoGnuPG 和使用用户网络时的 QEMUsystemd-resolved 有四种不同的模式来处理该文件——stub、static、uplink 和 foreign。它们在 systemd-resolved(8) § /ETC/RESOLV.CONF 中进行了描述。我们在此只关注推荐模式,即使用 /run/systemd/resolve/stub-resolv.conf 的 stub 模式。

/run/systemd/resolve/stub-resolv.conf 包含本地 stub 127.0.0.53 作为唯一的 DNS 服务器和一个搜索域列表。这是推荐的操作模式,它将 systemd-resolved 管理的配置传播给所有客户端。要使用它,请将 /etc/resolv.conf 替换为其符号链接

# ln -sf ../run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
  • 开头的 ../ 的目标路径是 *相对于链接位置*,而不是当前目录。
  • 未能正确配置 /etc/resolv.conf 将导致 DNS 解析失败。
  • arch-chroot 环境中无法创建 /etc/resolv.conf 符号链接,因为该文件是从外部系统绑定的。相反,请在 chroot 环境外部创建符号链接。例如:
    # ln -sf ../run/systemd/resolve/stub-resolv.conf /mnt/etc/resolv.conf

设置 DNS 服务器

提示 要检查 systemd-resolved 当前正在使用的 DNS,请运行 resolvectl status
自动设置

systemd-resolved 将与使用 /etc/resolv.conf网络管理器开箱即用。无需特殊配置,因为 systemd-resolved 会通过遵循 /etc/resolv.conf 符号链接来检测到。对于 systemd-networkdNetworkManageriwd,情况将是如此。

但是,如果 DHCPVPN 客户端使用 resolvconf 程序来设置名称服务器和搜索域(请参阅 openresolv#Users 查看使用 resolvconf 的软件列表),则需要额外的包 systemd-resolvconf 来提供 /usr/bin/resolvconf 符号链接。

手动设置

在 stub 和 static 模式下,可以在 resolved.conf(5) 文件中设置自定义 DNS 服务器。

/etc/systemd/resolved.conf.d/dns_servers.conf
[Resolve]
DNS=192.168.35.1 fd7b:d0bd:7a6e::1
Domains=~.
  • 强烈建议在连接到第三方 DNS 服务时使用加密协议。请参阅 #DNS over TLS
  • /etc/systemd/resolved.conf 中没有 Domains=~. 选项的情况下,systemd-resolved 可能会使用每个链接的 DNS 服务器,如果其中任何一个在每个链接的配置中设置了 Domains=~.
  • 此选项不会影响匹配每个链接配置中指定的更具体搜索域的域名查询,它们仍将使用各自的每个链接 DNS 服务器进行解析。

有关每个链接配置的更多信息,请参阅 systemd.network(5)

回退方案

如果 systemd-resolved 未从 网络管理器接收到 DNS 服务器地址,并且没有 手动 配置任何 DNS 服务器,那么 systemd-resolved 将回退到备用 DNS 地址,以确保 DNS 解析始终有效。

注意 备用 DNS 的顺序如下:Quad9、Cloudflare 和 Google。请参阅 systemd PKGBUILD,其中定义了服务器。

可以通过在 resolved.conf(5) 中设置 FallbackDNS 来更改地址。例如:

/etc/systemd/resolved.conf.d/fallback_dns.conf
[Resolve]
FallbackDNS=127.0.0.1 ::1

要禁用备用 DNS 功能,请设置 FallbackDNS 选项而不指定任何地址。

/etc/systemd/resolved.conf.d/fallback_dns.conf
[Resolve]
FallbackDNS=

DNSSEC

警告截至 2023 年 6 月,systemd-resolved 中的 DNSSEC 支持被认为是实验性的且不完整。[1]

默认情况下,systemd 包以禁用 DNSSEC 验证的方式构建。这可以通过 resolved.conf(5) 中的 DNSSEC 设置来更改。

  • 设置 DNSSEC=false(默认值)可禁用 DNSSEC 验证。
  • 设置 DNSSEC=allow-downgrade 以仅当上游 DNS 服务器支持 DNSSEC 时才进行验证。如果您的 DNS 服务器不支持 DNSSEC 并且您在此模式下遇到问题(例如:systemd issue 21107systemd issue 36681),您可能需要明确禁用 DNSSEC 验证。
  • 设置 DNSSEC=true 以始终验证 DNSSEC,从而导致与不支持它的名称服务器的 DNS 解析失败。例如:
/etc/systemd/resolved.conf.d/dnssec.conf
[Resolve]
DNSSEC=true

通过查询没有签名的域名来测试 DNSSEC 验证。

$ resolvectl query brokendnssec.net
brokendnssec.net: resolve call failed: DNSSEC validation failed: no-signature (RRSIG Missing)

现在测试一个具有有效签名的域名。

$ resolvectl query test.dnscheck.tools
test.dnscheck.tools: 2604:a880:400:d0::256e:b001 -- link: enp2s0
                   142.93.10.179               -- link: enp2s0

-- Information acquired via protocol DNS in 122.2ms.
-- Data is authenticated: yes; Data was acquired via local or encrypted transport: no
-- Data from: network

DNS over TLS

全局 DNS over TLS

DNS over TLS 默认是禁用的。要启用它,请在 resolved.conf(5)[Resolve] 部分的 DNSOverTLS 设置进行更改。要启用验证您的 DNS 提供商的服务器证书,请将他们的主机名以 ip_address#hostname 的格式包含在 DNS 设置中。例如:

/etc/systemd/resolved.conf.d/dns_over_tls.conf
[Resolve]
DNS=9.9.9.9#dns.quad9.net 149.112.112.112#dns.quad9.net 2620:fe::fe#dns.quad9.net 2620:fe::9#dns.quad9.net
DNSOverTLS=yes
Domains=~.
  • 此示例使用 Quad9。将其替换为您信任的 DNS 解析器。请参阅 域名解析#第三方 DNS 服务
  • 使用 DNSOverTLS=yes 时,使用的 DNS 服务器必须支持 DNS over TLS。否则所有 DNS 请求都会失败。
  • 或者,可以使用 DNSOverTLS=opportunistic 仅在服务器支持 DNS over TLS 时才使用它。如果使用的 DNS 服务器不支持 DNS over TLS,systemd-resolved 将回退到常规的未加密 DNS。
  • 有关全局使用自定义 DNS 服务器的细节,请参阅 #Manually 中的注意事项。

ngrep 可用于测试 DNS over TLS 是否正常工作,因为 DNS over TLS 始终使用端口 853 而不是端口 53。命令 ngrep port 53 在使用 DNS over TLS 解析主机名时应不产生任何输出,而 ngrep port 853 应产生加密的输出。

Wireshark 可用于对 DNS over TLS 查询进行更详细的数据包检查。

为特定连接启用 DNS over TLS 取决于 网络管理器

其他监听接口

默认情况下,systemd-resolved 通过回环接口响应本地应用程序的 DNS 请求。要使 systemd-resolved 响应除默认接口外的其他接口或地址的 DNS 请求,请在 resolved.conf(5) 中为每个附加接口设置 DNSStubListenerExtra 选项。例如:

/etc/systemd/resolved.conf.d/additional-listening-interfaces.conf
[Resolve]
DNSStubListenerExtra=192.168.10.10
DNSStubListenerExtra=2001:db8:0:f102::10
DNSStubListenerExtra=192.168.10.11:9953
提示 这在将 systemd-resolved 用于充当 DNS 服务器的 路由器时非常有用。

mDNS

systemd-resolved 能够作为 组播 DNS 解析器和响应器工作。

解析器提供使用 "hostname.local" 命名方案的 主机名解析。

mDNS 仅在连接上激活,前提是 systemd-resolved 的 mDNS 支持已启用,并且当前活动的 网络管理器的连接配置启用了 mDNS。

systemd-resolved 的 mDNS 支持默认启用。可以通过其 MulticastDNS 设置禁用(请参阅 resolved.conf(5) § OPTIONS)。

为每个连接启用 mDNS 支持取决于 网络管理器

  • 对于 systemd-networkd,请在每个连接设置文件的 [Network] 部分设置 MulticastDNS。您可能还必须在 [Link] 部分设置 Multicast=yes。请参阅 systemd.network(5)
  • 对于 NetworkManager,请在连接设置文件的 [connection] 部分设置 mdns。运行 nmcli connection modify interface_name connection.mdns {yes|no|resolve} 将为您执行此操作。请参阅 nm-settings(5)
  • 如果已安装 Avahi,请考虑 禁用屏蔽 avahi-daemon.serviceavahi-daemon.socket,以防止与 systemd-resolved 发生冲突。
  • 如果您计划使用 mDNS 和 防火墙,请确保打开 UDP 端口 5353
提示 可以通过在 /etc/NetworkManager/conf.d/ 中创建一个配置文件并在 [connection] 部分设置 connection.mdns=2 来设置所有 NetworkManager 连接的默认值。请参阅 NetworkManager.conf(5) § CONNECTION SECTION[2]

LLMNR

链路本地组播名称解析 是 Microsoft 创建的 主机名解析协议。

LLMNR 仅在同时启用了 systemd-resolved 的全局设置(resolved.conf(5) § OPTIONS 中的 LLMNR)和 网络管理器的每个连接设置时,才会为连接激活。默认情况下,systemd-resolved 启用 LLMNR 响应器;systemd-networkdNetworkManager[3] 会为连接启用它。

提示 可以通过在 /etc/NetworkManager/conf.d/ 中创建一个配置文件并在 [connection] 部分设置 connection.llmnr 来设置所有 NetworkManager 连接的默认值。请参阅 NetworkManager.conf(5) § CONNECTION SECTION

如果您计划使用 LLMNR 和 防火墙,请确保打开 UDP 和 TCP 端口 5355

查询

要查询 DNS 记录、mDNS 或 LLMNR 主机,您可以使用 resolvectl 工具。

例如,查询 DNS 记录:

$ resolvectl query archlinux.org
archlinux.org: 2a01:4f8:172:1d86::1
               138.201.81.199

-- Information acquired via protocol DNS in 48.4ms.
-- Data is authenticated: no

故障排除

systemd-resolved 未搜索本地域

即使在适当的 systemd-networkd.network 文件中存在 UseDomains=yesDomains=[domain-list],并且该文件在 resolv.conf 中产生了预期的 search [domain-list]systemd-resolved 在只给出主机名时也可能不搜索本地域。您可以运行 networkctl statusresolvectl status 来检查搜索域是否被实际拾取。

可能的解决方法

  • 通过在相关链接的 .network 文件中设置 DNSOverTLS=false 来禁用本地链接上的 #全局 DNS over TLS。即使它们通过同一个接口离开,它仍然应该在非本地 DNS 查询上使用 TLS。
  • 禁用 LLMNR 以便 systemd-resolved 立即继续附加 DNS 后缀。
  • 修剪 /etc/nsswitch.confhosts 数据库(例如,通过在 resolve 服务后删除 [!UNAVAIL=return] 选项)。
  • 切换到使用完全限定的域名。
  • 使用 /etc/hosts 解析主机名。
  • 回退到使用 glibc 的 dns 而不是 systemd 的 resolve

systemd-resolved 未解析没有后缀的主机名

为了让 systemd-resolved 解析不是完全限定域名的主机名,请将 ResolveUnicastSingleLabel=yes 添加到 /etc/systemd/resolved.conf

警告 这会将单标签名称转发给全局 DNS 服务器,这些服务器可能不受您的控制。这种行为不符合标准,并可能带来隐私和安全风险。详情请参阅 resolved.conf(5)

这似乎仅在禁用 LLMNR (LLMNR=no) 时才有效。

如果您正在使用 systemd-networkd,您可能希望使用 DHCP 服务器或 IPv6 路由器公告提供的域作为搜索域。这默认是禁用的,要启用它,请添加到接口的 .network 文件中。

[Network]
UseDomains=true

您可以使用以下命令检查 systemd-resolved 为每个接口提供了什么:

$ resolvectl domain

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.