systemd-resolved
systemd-resolved是一个通过D-Bus接口、NSS(nss-resolve(8))解析服务和一个监听127.0.0.53
的本地DNS解析器为本地应用提供网络名称解析的systemd服务。
安装[编辑 | 编辑源代码]
systemd-resolved是默认安装的systemd包包的一部分。
配置[编辑 | 编辑源代码]
systemd-resolved为DNS(包括DNSSEC和Dns over TLS)、多播DNS(mDNS)和链路本地多播名称解析(LLMNR)提供解析服务。
可以通过编辑/etc/systemd/resolved.conf
或 /etc/systemd/resolved.conf.d/
中的附加配置片段文件来配置解析器。请参阅resolved.conf(5)。
要使用systemd-resolved,启用并启动systemd-resolved.service
。
DNS[编辑 | 编辑源代码]
依赖 glibc getaddrinfo(3)(或类似API)的软件直接就能使用。如果存在nss-resolve(8),/etc/nsswitch.conf
的默认配置将使用它进行主机名解析。
有些软件会直接读取/etc/resolv.conf
进行域名解析,例如网络浏览器、Go 和 GnuPG 等,为了支持这些软件,systemd-resolved提供了四种不同的文件处理模式:本地、静态、上联和外部(file-stub, static, uplink和foreign),systemd-resolved(8) § /ETC/RESOLV.CONF中对这些方式进行了详细说明。
/run/systemd/resolve/stub-resolv.conf
包含作为唯一DNS服务器和搜索域名的本地存根127.0.0.53
。这是将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服务器[编辑 | 编辑源代码]
resolvectl status
.自动配置[编辑 | 编辑源代码]
对于使用/etc/resolv.conf
的网络管理器,systemd-resolved将开箱即用,不需要特定的配置,因为systemd-resolved将通过/etc/resolv.conf
符号链接探测,systemd-networkd、NetworkManager和iwd就是这样。
但是,如果DHCP和VPN客户端使用resolvconf程序来设置名称服务器和搜索域名(请参阅[1]来获得使用resolvconf程序的软件的列表)则需要额外的软件包systemd-resolvconf包来提供/usr/bin/resolvconf
符号链接。
- systemd-resolved有一个受限的resolvconf接口,可能与所有客户端一起工作,请参阅 resolvectl(1) § COMPATIBILITY WITH RESOLVCONF(8)来获得更多信息。
- systemd-resolvconf包只在
systemd-resolved.service
运行时才工作。 如果你没有使用systemd-resolved确保systemd-resolvconf包包已经删除,否则会导致需要使用/usr/bin/resolvconf
二进制文件的网络软件出问题。
手动配置[编辑 | 编辑源代码]
在本地(stub)和静态(static)模式中,自定义DNS服务器可以在resolved.conf(5)文件中设置:
/etc/systemd/resolved.conf.d/dns_servers.conf
[Resolve] DNS=192.168.35.1 fd7b:d0bd:7a6e::1 Domains=~.
- 在resolved.conf(5)中没有
Domains=~.
选项时,如果在per-link的配置中,其中任何一个设置了Domains=~.
,systemd-resolved可能使用每per-link的DNS服务器。 - 此选项不会影响任何在per-link配置中指定了更具体的搜索域名的域名解析.
要获得更多关于per-link配置的信息,请参阅Systemd-networkd#network_文件。
备用[编辑 | 编辑源代码]
如果systemd-resolved没有从网络管理器收到任何DNS服务器地址并且没有DNS服务器在Systemd-resolved#手动配置中配置了,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。
- 设置
DNSSEC=true
以始终验证DNSSEC,因此停止不支持它的名称服务器的DNS解析。例如:
/etc/systemd/resolved.conf.d/dnssec.conf
[Resolve] DNSSEC=true
- 如果你的DNS服务器不支持DNSSEC,并且您遇到默认允许降级模式的问题(例如systemd issue 10579),你可以通过设置
DNSSEC=false
来显式禁用systemd-resolved的DNSSEC支持。 - systemd-resolved可能会在几次验证失败后禁用DNSSEC。如果
DNSSEC
选项被设为true
,DNS解析将会完全停止工作。请参阅systemd issue 9867。
通过查询一个具有无效签名的域名来测试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命令53端口应该不产生输出,并且853端口应该产生加密输出。
使用Wireshark可以检查 TLS DNS 的详细数据包内容。
mDNS[编辑 | 编辑源代码]
systemd-resolved可以作为mDNS的解析程序和响应程序工作。
解析器使用"主机名.local"命名方案提供主机名([网络配置#设置计算机名])解析。
只有同时启用systemd-resolved的mDNS支持并且当前活动的网络管理器为网络连接启用了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.service
和avahi-daemon.socket
以防止和systemd-resolved发生冲突。 - 如果你计划使用mDNS和防火墙确保打开UDP端口
5353
。
/etc/NetworkManager/conf.d/
中创建配置文件并在[connection]
部分设置connection.mdns=2
来设置所有NetworkManager连接的默认值。请参阅NetworkManager.conf(5) § CONNECTION SECTION和[2]。LLMNR[编辑 | 编辑源代码]
Link-Local Multicast Name Resolution是由微软创造的主机名解析服务。
LLMNR将只会在systemd-resolved的全局设置(resolved.conf(5) § OPTIONS中的LLMNR
)和网络管理器的每个连接的设置都启用时才会活动。默认情况下,systemd-resolved启用LLMNR响应程序,systemd-networkd和NetworkManager[3]为连接启用它。
- 对于systemd-networkd,选项是
[Network]
部分中的LLMNR
。请参阅systemd.network(5) § [NETWORK] SECTION OPTIONS。
- 对于NetworkManager,选项是
[connection]
部分中的llmnr
。请参阅nm-settings(5) § connection setting。
/etc/NetworkManager/conf.d/
中创建配置文件并在[connection]
部分中设置connection.llmnr
来进行设置。请参阅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不搜索本地域名[编辑 | 编辑源代码]
当只给定主机名时,即使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]
选项。)
- 切换到使用完全限定域名(fully-qualified domain names)。
- 使用
/etc/hosts
来解析主机名。
- 回退到使用glibc的
dns
以代替systemd的resolve
。
systemd-resolved不解析没有后缀的主机名[编辑 | 编辑源代码]
为了使systemd-resolved解析不完全限定域名的主机名,请向/etc/systemd/resolved.conf
中添加ResolveUnicastSingleLabel=yes
。
这似乎只在禁用LLMNR的情况下工作(LLMNR=no
)。
如果你在使用systemd-networkd,你可能希望DHCP服务器或IPv6路由器提供的域名用作搜索域名,这在默认情况下是禁用的,将它添加到接口的.network文件中来启用:
[DHCPv4] UseDomains=true [DHCPv6] UseDomains=true [IPv6AcceptRA] UseDomains=true
你可以使用以下工具检查每个接口的systemd-resolved结果:
$ resolvectl domain