systemd-resolved
systemd-resolved 是一个 systemd 服务,通过 D-Bus 接口、resolve
NSS 服务 (nss-resolve(8)) 以及本地 DNS 存根监听器 127.0.0.53
,为本地应用程序提供网络名称解析。有关用法,请参阅 systemd-resolved(8)。
安装
systemd-resolved 是默认安装的 systemd 软件包的一部分。
配置
systemd-resolved 为 域名系统 (DNS) (包括 DNSSEC 和 DNS over TLS)、组播 DNS (mDNS) 和 链路本地多播名称解析 (LLMNR) 提供解析器服务。
可以通过编辑 /etc/systemd/resolved.conf
和/或 /etc/systemd/resolved.conf.d/
中的 drop-in .conf 文件来配置解析器。请参阅 resolved.conf(5)。
要使用 systemd-resolved,启动 并 启用 systemd-resolved.service
。
DNS
依赖于 glibc 的 getaddrinfo(3)(或类似)的软件可以开箱即用,因为默认情况下,/etc/nsswitch.conf
配置为在使用 nss-resolve(8) 时使用它。
为了给直接读取 /etc/resolv.conf
的软件(例如 网页浏览器、Go 和 GnuPG)提供域名解析,systemd-resolved 有四种不同的模式来处理该文件——stub、static、uplink 和 foreign。它们在 systemd-resolved(8) § /ETC/RESOLV.CONF 中进行了描述。 我们将在此仅关注推荐模式,即 stub 模式,它使用 /run/systemd/resolve/stub-resolv.conf
。
/run/systemd/resolve/stub-resolv.conf
包含本地存根 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
符号链接是不可能的,因为该文件是从外部系统 bind-mount 的。 而是从 chroot 外部创建符号链接。 例如:# ln -sf ../run/systemd/resolve/stub-resolv.conf /mnt/etc/resolv.conf
设置 DNS 服务器
resolvectl status
。自动
systemd-resolved 将与使用 /etc/resolv.conf
的 网络管理器 开箱即用。 由于 systemd-resolved 将通过跟踪 /etc/resolv.conf
符号链接来检测到,因此无需进行特定的配置。 systemd-networkd、NetworkManager 和 iwd 都是这种情况。
但是,如果 DHCP 和 VPN 客户端使用 resolvconf 程序来设置名称服务器和搜索域(有关使用 resolvconf 的软件列表,请参阅 openresolv#用户),则需要额外的软件包 systemd-resolvconf 来提供 /usr/bin/resolvconf
符号链接。
- systemd-resolved 有一个有限的 resolvconf 接口,可能不适用于所有客户端,有关更多信息,请参阅 resolvectl(1) § 与 RESOLVCONF(8) 的兼容性。
- systemd-resolvconf 仅在
systemd-resolved.service
正在运行的情况下工作。 如果您未使用 systemd-resolved,请确保 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=~.
- 如果没有 resolved.conf(5) 中的
Domains=~.
选项,如果任何每链路配置中设置了Domains=~.
,systemd-resolved 可能会使用每链路 DNS 服务器。 - 此选项不会影响与每链路配置中指定的更具体的搜索域匹配的域名查询,它们仍将使用各自的每链路 DNS 服务器进行解析。
有关每链路配置的更多信息,请参阅 systemd-networkd#网络文件。
回退
如果 systemd-resolved 没有从 网络管理器 接收到 DNS 服务器地址,并且没有手动配置 DNS 服务器,那么 systemd-resolved 会回退到回退 DNS 地址,以确保 DNS 解析始终有效。
可以通过在 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
可以通过更改 resolved.conf(5) 中的 DNSSEC
设置来启用 DNSSEC 验证。
- 设置
DNSSEC=allow-downgrade
以仅在上游 DNS 服务器支持 DNSSEC 时才验证它。 - 设置
DNSSEC=true
以始终验证 DNSSEC,从而在使用不支持它的名称服务器时中断 DNS 解析。 例如
/etc/systemd/resolved.conf.d/dnssec.conf
[Resolve] DNSSEC=true
通过查询具有无效签名的域来测试 DNSSEC 验证
$ resolvectl query badsig.go.dnscheck.tools
badsig.go.dnscheck.tools: resolve call failed: DNSSEC validation failed: invalid
现在测试具有有效签名的域
$ resolvectl query go.dnscheck.tools
go.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。 要启用它,请更改 resolved.conf(5) 中 [Resolve]
部分的 DNSOverTLS
设置。 要启用 DNS 提供商的服务器证书验证,请将它们的主机名包含在 DNS
设置中,格式为 ip_address#hostname
。 例如
/etc/systemd/resolved.conf.d/dns_over_tls.conf
[Resolve] DNS=9.9.9.9#dns.quad9.net DNSOverTLS=yes
- 使用
DNSOverTLS=yes
,使用的 DNS 服务器必须支持 DNS over TLS。 否则,所有 DNS 请求都将失败。 - 或者,可以使用
DNSOverTLS=opportunistic
仅在服务器支持 DNS over TLS 时才使用它。 如果使用的 DNS 服务器不支持 DNS over TLS,systemd-resolved 将回退到常规的未加密 DNS。
ngrep 可用于测试 DNS over TLS 是否工作,因为 DNS over TLS 始终使用端口 853,而从不使用端口 53。 当使用 DNS over TLS 解析主机名时,命令 ngrep port 53
应该不会产生任何输出,而 ngrep port 853
应该产生加密输出。
Wireshark 可用于更详细地包检查 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
mDNS
systemd-resolved 能够作为 组播 DNS 解析器和响应器工作。
解析器使用 "hostname.local" 命名方案提供主机名解析。
只有在启用了 systemd-resolved 的 mDNS 支持,并且当前活动的 网络管理器 的配置为连接启用了 mDNS 时,mDNS 才会为连接激活。
systemd-resolved' 的 mDNS 支持默认启用。 可以通过其 MulticastDNS
设置禁用它(请参阅 resolved.conf(5) § 选项)。
启用每个连接的 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)。
/etc/NetworkManager/conf.d/
中创建一个配置文件并在 [connection]
部分中设置 connection.mdns=2
来设置所有 NetworkManager 连接的默认值。 请参阅 NetworkManager.conf(5) § 连接部分 和 [2]。LLMNR
链路本地多播名称解析是 Microsoft 创建的主机名解析协议。
只有在启用了 systemd-resolved 的全局设置(resolved.conf(5) § 选项 中的 LLMNR
)和 网络管理器 的每个连接的设置时,LLMNR 才会为连接激活。 默认情况下,systemd-resolved 启用 LLMNR 响应器;systemd-networkd 和 NetworkManager[3] 为连接启用它。
- 对于 systemd-networkd,设置是
[Network]
部分中的LLMNR
。 请参阅 systemd.network(5) § [NETWORK] 部分选项。 - 对于 NetworkManager,设置是
[connection]
部分中的llmnr
。 请参阅 nm-settings(5) § connection setting。
/etc/NetworkManager/conf.d/
中创建一个配置文件并在 [connection]
部分中设置 connection.llmnr
来设置所有 NetworkManager 连接的默认值。 请参阅 NetworkManager.conf(5) § 连接部分。如果您计划使用 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 未搜索本地域名
即使 UseDomains=yes
或 Domains=[domain-list]
存在于相应的 systemd-networkd 的 .network 文件中,并且该文件在 resolv.conf
中生成了预期的 search [domain-list]
,当仅给出主机名时,systemd-resolved 可能不会搜索本地域名。 您可以运行 networkctl status
或 resolvectl status
以检查是否实际拾取了搜索域。
可能的解决方法
- 禁用 LLMNR 以使 systemd-resolved 立即继续附加 DNS 后缀
- 修剪
/etc/nsswitch.conf
的hosts
数据库(例如,通过删除resolve
服务后的[!UNAVAIL=return]
选项) - 切换到使用完全限定域名
- 使用
/etc/hosts
解析主机名 - 回退到使用 glibc 的
dns
而不是使用 systemd 的resolve
systemd-resolved 无法解析不带后缀的主机名
要使 systemd-resolved 解析非完全限定域名的主机名,请将 ResolveUnicastSingleLabel=yes
添加到 /etc/systemd/resolved.conf
。
这似乎仅在禁用 LLMNR(LLMNR=no
)的情况下有效。
如果您正在使用 systemd-networkd,您可能希望 DHCP 服务器或 IPv6 路由器通告提供的域用作搜索域。 默认情况下禁用此功能,要启用它,请添加到接口的 .network 文件
[Network] UseDomains=true
您可以使用以下命令检查 systemd-resolved 为每个接口设置的内容
$ resolvectl domain