systemd-resolved

来自 Arch Linux 中文维基

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

提示:要了解有关选项和开关的上下文,可以如Systemd#诊断一个服务中所述打开systemd-resolved的详细调试信息。

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服务器[编辑 | 编辑源代码]

提示:要检查systemd-resolved当前正在使用的DNS, 请运行resolvectl status.
自动配置[编辑 | 编辑源代码]

对于使用/etc/resolv.conf的网络管理器,systemd-resolved将开箱即用,不需要特定的配置,因为systemd-resolved将通过/etc/resolv.conf符号链接探测,systemd-networkdNetworkManageriwd就是这样。

但是,如果DHCP和VPN客户端使用resolvconf程序来设置名称服务器和搜索域名(请参阅[1]来获得使用resolvconf程序的软件的列表)则需要额外的软件包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解析始终工作。

注意: 备用DNS依次为:Cloudflare、Quad9和Google。请参阅定义DNS服务器的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[编辑 | 编辑源代码]

警告: DNSSEC在systemd-resolved中的支持被认为是实验性和不完整的

可以通过更改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.serviceavahi-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-networkdNetworkManager[3]为连接启用它。

提示:所有NetworkManager连接的默认值可以通过在/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=yesDomains=[domain-list]存在于相应的systemd-networkd.network文件中,并且该文件在resolv.conf中生成预期的search [domain-list]systemd-resolved也可能不会搜索本地域名。你可以运行networkctl statusresolvectl status来检查域名搜索是否真的被选中了。

可能的解决方法:

  • 禁用LLMNR以使systemd-resolved立刻继续附加DNS后缀。
  • 修改/etc/nsswitch.confhosts数据库(例如在resolve服务后删除[!UNAVAIL=return]选项。)
  • 切换到使用完全限定域名(fully-qualified domain names)。
  • 使用/etc/hosts来解析主机名。
  • 回退到使用glibc的dns以代替systemd的resolve

systemd-resolved不解析没有后缀的主机名[编辑 | 编辑源代码]

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

警告: 这将把single-label names转发到可能不在你控制之下的全局DNS服务器。这种行为不符合标准,且可能导致隐私和安全风险。请参阅resolved.conf(5)来获得详细信息。

这似乎只在禁用LLMNR的情况下工作(LLMNR=no)。

如果你在使用systemd-networkd,你可能希望DHCP服务器或IPv6路由器提供的域名用作搜索域名,这在默认情况下是禁用的,将它添加到接口的.network文件中来启用:

[DHCPv4]
UseDomains=true

[DHCPv6]
UseDomains=true

[IPv6AcceptRA]
UseDomains=true

你可以使用以下工具检查每个接口的systemd-resolved结果:

$ resolvectl domain

另请参阅[编辑 | 编辑源代码]