当前位置: 首页 > 文档资料 > systemd 中文手册 >

resolved.conf 中文手册

优质
小牛编辑
132浏览
2023-12-01

名称

resolved.conf, resolved.conf.d — 网络名字解析服务配置文件

大纲

/etc/systemd/resolved.conf

/etc/systemd/resolved.conf.d/*.conf

/run/systemd/resolved.conf.d/*.conf

/usr/lib/systemd/resolved.conf.d/*.conf

描述

这些配置文件控制着本地 DNS 与 LLMNR名字解析

配置目录及其优先级

默认设置是在编译期间确定的,所以仅在确实需要修改默认设置的情况下,才需要使用配置文件。位于/etc/systemd/ 目录中的初始配置文件,仅包含了展示选项默认值的注释,目的在于方便系统管理员查看和直接修改。

如果软件包想要自定义某些默认设置,那么必须将自定义的配置文件安装到/usr/lib/systemd/*.conf.d/ 目录中。/etc/ 目录仅供系统管理员使用。系统管理员可以利用下面的逻辑来覆盖默认设置:主配置文件最先被读取,优先级也最低。所有 *.conf.d/ 中的配置文件都会覆盖主配置文件中的设置。所有 *.conf.d/ 中的配置文件(无论位于哪个目录中),统一按照文件名的字典顺序处理。当多个配置文件都设置了同一个选项的时候:(1)如果该选项仅接受一个单一值,那么仅以文件名最靠后(字典顺序)的那一个为准;(2)如果该选项可接受一个值列表,那么将会按照文件名的字典顺序将所有值列表拼接起来。为了便于排序,建议给所有 *.conf.d/ 中的配置文件都加上两位十进制数字的文件名前缀。

如果系统管理员想要屏蔽 /usr/lib/ 目录中的某个配置文件,那么最佳做法是在 /etc/ 目录中创建一个指向 /dev/null 的同名符号链接,即可彻底屏蔽 /usr/lib/ 目录中的同名文件。

选项

下列选项都位于 "[Resolve]" 小节:

DNS=

一个空格分隔的 IPv4 与 IPv6 地址列表。用作系统的全局DNS服务器。DNS请求将被首先发送给 systemd-networkd.service(8) 中针对特定连接设置的DNS服务器或者由外部程序在运行时设置的DNS服务器,然后才会发送给此处设置的全局DNS服务器。出于兼容性考虑,如果未设置此选项,那么将使用 /etc/resolv.conf 中的DNS服务器(如果其中确实配置了DNS服务器的话)。此选项的默认值为空。

FallbackDNS=

一个空格分隔的 IPv4 与 IPv6 地址列表。用作系统的替补DNS服务器。在 systemd-networkd.service(8) 中 针对特定连接配置的任何DNS服务器的优先级都高于此选项中设置的DNS服务器,也高于上述 DNS= 中设置的DNS服务器,同样也高于 /etc/resolv.conf 中设置的DNS服务器。所以,此选项所设置的DNS服务器仅在实在找不到可用DNS的情况下才会被使用。若未设置此选项,则使用程序内置的默认DNS服务器列表。

Domains=

一个空格分隔的域名列表。在解析不含"."的域名时,将被用作域名后缀,以将这些域名转化为FQDN(全限定域名)。这些后缀将会严格按照这里设置的顺序依次尝试,直到解析成功。出于兼容性考虑,如果未设置此选项,那么将使用 /etc/resolv.conf 中列出的搜索域(如果其中确实配置了搜索域的话)。此选项的默认值为空。

如果指定的域名带有 "~" 前缀,那么表示它不是一个搜索域,而是一个"路由域",也就是仅用于将指定的域名查询请求 优先路由到上文 DNS= 设置的全局DNS服务器上去。注意,如果不存在针对特定连接的DNS服务器,那么 "~" 语法没有任何实际效果。特殊值 "~." 表示将所有DNS查询请求 优先路由到上文 DNS= 设置的全局DNS服务器上去 (前面的波浪号表示这是一个"路由域",后面的点表示DNS根域(也就是所有域名的后缀))。

LLMNR=

必须设为 "resolve" 或布尔值。控制本机对LLMNR(Link-Local Multicast Name Resolution, RFC 4795)的支持。设为 yes 表示完全支持 LLMNR responder 与 resolver ; 设为 no 表示彻底不支持 LLMNR ; 设为 "resolve" 表示仅支持 LLMNR resolver 而不支持 LLMNR responder ; 注意,systemd-networkd.service(8) 中还有针对特定连接的LLMNR设置。对于某个特定的连接来说,LLMNR 将仅在针对该连接的设置与全局设置都开启的情况下,才会开启。

MulticastDNS=

必须设为布尔值或特殊值 "resolve" ,用于控制本机对组播DNS(RFC 6762)的支持。设为 yes 表示完整的支持组播DNS的 responder 与 resolver 角色。设为 no 表示完全禁止组播DNS。设为 "resolve" 表示仅支持解析(resolver)而不支持应答(responder)。注意,systemd-networkd.service(8) 还支持针对每个网络连接单独设置对组播DNS的支持。对于某个特定的网络连接来说,只有全局开启了对组播DNS的支持,并且同时也针对该连接开启了组播DNS支持的情况下,才能在此连接上使用组播DNS 。

DNSSEC=

必须设为布尔值或特殊值 "allow-downgrade" 。设为 yes 表示使用 DNSSEC 机制 检查所有 DNS 应答的有效性(多播DNS 与 LLMNR 除外)。如果某个DNS应答被鉴定为无效,那么上层应用将会得到一个"查询失败"的结果。注意,这意味着 DNS 服务器必须支持 DNSSEC 。如果某个 DNS 服务器不能正确支持 DNSSEC ,那么从该 DNS 服务器接收到的所有应答都将被视为无效应答。设为 "allow-downgrade" 表示: 如果某个 DNS 服务器不能正确支持 DNSSEC ,那么将不使用 DNSSEC 机制检查该 DNS 应答的有效性。注意,这将导致 DNSSEC 机制形同虚设,从而造成安全漏洞。设为 no 则表示彻底禁用 DNSSEC 机制。

注意,因为 DNSSEC 需要 额外查询更多的 DNS 数据,所以,开启此选项会减慢 DNS 查询速度。

为了确保数据完整性,DNSSEC 必须预先知道一些信任锚(相当于域的公钥)。systemd 已经内置了 Internet 根域名服务器的信任锚(Trust anchor),不过,系统管理员还可在 dnssec-trust-anchors.d(5) 中添加更多的信任锚。如果信任锚过期或被撤销,那么 DNSSEC 验证机制就会失效,此时必须配置新的信任锚,或者通过更新 systemd 软件包来更新 Internet 根域名服务器的信任锚。实际上,当内置的根域名服务器信任锚已经失效,并且 DNSSEC=yes 时,所有的DNS查询都将会失败,因为此时已经无法验证DNS应答的可靠性了; 但是如果 DNSSEC=allow-downgrade ,那么将会自动关闭 DNSSEC 验证机制。

查询DNS数据的客户端程序将会被通知: (1)其所发出的DNS查询请求是否可以使用DNSSEC机制进行验证; (2)返回的应答是否无法使用DNSSEC机制进行验证(原因有三: DNS服务器返回的应答不含签名、DNS服务器本身不支持DNSSEC扩展、 DNS服务器返回的应答中的签名在本地找不到对应的信任锚)。如果出现第(2)种情况(无法使用DNSSEC验证返回的应答),那么客户端程序 必须能够自己验证DNS应答的可靠性。

强烈建议 在已知DNS服务器支持DNSSEC扩展的系统上设置 DNSSEC=yes 并且及时更新信任锚。对于其他系统,则建议设置为 DNSSEC=allow-downgrade

除了此处的全局 DNSSEC 设置,在 systemd-networkd.service(8) 中还支持针对每个连接进行 DNSSEC 设置。对于前文提及的系统全局DNS服务器来说,仅参照此处的全局 DNSSEC 设置。对于专门针对单个连接设置的DNS服务器来说,优先参照针对该连接的 DNSSEC 设置 (仅在未设置时才参照此处的全局设置)。

私有DNS区域通常不支持DNSSEC验证,除非专门为其配置了反向信任锚(私有区域未签名) 或者正向信任锚(私有区域已签名)。如果选择了 "allow-downgrade" 模式,那么将会尝试使用DNS根服务器所不知道的顶级域去检测私有DNS区域。注意,这个逻辑并不总是适用于所有的私有区域配置。

默认值是 "allow-downgrade"

DNSOverTLS=

设为 "opportunistic" 表示 优先尝试通过 DNS-over-TLS 发送DNS查询请求,如果DNS服务器不支持TLS,那么就禁用 DNS-over-TLS 。注意,这种模式仍然存在"降级"攻击的安全漏洞。设为 "no" 表示 完全禁用 DNS-over-TLS ,仅使用不安全的传统 UDP 方式发送DNS查询请求。

因为 DNS-over-TLS 需要额外的数据包建立安全连接,所以相比不安全的传统 UDP 方式 需要消耗更多的查询时间。

注意,因为解析程序目前尚不能对服务器进行认证,所以仍然存在"中间人"攻击的安全漏洞。

除了这里的全局 DNSOverTLS 设置之外,systemd-networkd.service(8) 还有针对每个连接的 DNSOverTLS 设置。对于系统的全局DNS服务器来说,仅使用这里的全局 DNSOverTLS 设置。但对于针对每个连接设置的DNS服务器来说,则优先使用针对每个连接的 DNSOverTLS 设置(仅在未设置时继承全局设置)。

默认值为 "no"

Cache=

必须设为布尔值。默认值 "yes" 表示缓存先前已经解析成功的域名直到缓存过期,以避免重复查询。注意,关闭缓存不但浪费网络流量,更容易造成访问延迟,尤其是在使用了DNSSEC的时候。

注意,对于IP地址为 127.0.0.1 或 ::1 之类的本机DNS来说,DNS缓存总是关闭的。这样做是为了避免不必要的多次缓存。

DNSStubListener=

可设为 "yes"(默认值), "no", "udp", "tcp" 之一。"udp" 表示本地存根DNS服务器将在 127.0.0.53 的 53 端口上监听 UDP 请求; "tcp" 表示在 127.0.0.53:53 上监听 TCP 请求; "yes" 表示在 127.0.0.53:53 上同时监听 UDP 与 TCP 请求; "no" 表示禁止监听。

注意,如果 127.0.0.53:53 已被其他程序占用,那么本地存根DNS服务器将会自动放弃监听。

ReadEtcHosts=

接受一个布尔值。默认值 "yes" 表示在向DNS服务器发送查询请求之前,优先查询 /etc/hosts 文件。

参见

systemd(1),systemd-resolved.service(8),systemd-networkd.service(8),dnssec-trust-anchors.d(5),resolv.conf(4)