![systemd-resolved 如何处理单标签 dns 查找请求?](https://linux22.com/image/142196/systemd-resolved%20%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E5%8D%95%E6%A0%87%E7%AD%BE%20dns%20%E6%9F%A5%E6%89%BE%E8%AF%B7%E6%B1%82%EF%BC%9F.png)
我研究了 systemd-networkd 和 systemd-resolved:
我对一些话感到困惑:
systemd-resolved.service(8)
使用 LLMNR 协议将单标签名称路由到能够进行 IP 多播的所有本地接口。对以每个接口域之一结尾的主机名的查找将专门路由到匹配的接口。
系统网络(5)
“搜索”域和“仅路由”域都用于 DNS 查询的路由:对以这些域结尾的主机名的查找(因此,如果列出了任何“搜索域”,也是单标签名称),被路由到为此接口配置的 DNS 服务器。
我的问题是:对于配置了“搜索域”并启用 LLMNR 的大量接口的主机,单标签查找请求将去往何处?
我的困惑的更多细节:
- 如果接口配置了搜索域“mydomain”并且禁用了 LLMNR,任何单标签查找请求是否会路由到此接口?
- 如果接口配置了搜索域“mydomain”并启用了 LLMNR,并且传入“xyz”的查找请求,则通过 LLMNR 的“xyz”和通过指定 dns 服务器的“xyz.mydomain”是否都会发生?
答案1
这个问题需要很长的时间来解释。简短(不精确)的描述是:
单标签查找请求会去哪里?
单一标签? (不是localhost
等人):始终到 LLMNR 系统。
多标签?:到每个接口的DNS服务器。失败时(或如果未配置),发送至全局 DNS 服务器。
是的,一般顺序如中所述systemd-resolved.service(8) 但:
查找路由可能会受到配置每个接口域名的影响。看系统网络(5)了解详情。
设置系统网络(5)作为 DNS 解析的附加资源。
并且,了解这一点来自 RFC 4795:
由于 LLMNR 仅在本地链路上运行,因此不能将其视为 DNS 的替代品。
顺序(简化)是:
本地的,已配置主机名解析为按其范围排序的所有本地配置的 IP 地址,或者(如果未配置)IPv4 地址 127.0.0.2(位于本地环回)和 IPv6 地址 ::1(这是本地主机)。
主机名“localhost”和“localhost.localdomain”(以及任何以“.localhost”或“.localhost.localdomain”结尾的主机名)将解析为 IP 地址 127.0.0.1 和 ::1。
主机名“_gateway”被解析为...
包括中定义的映射
/etc/hosts
(前后)。如果要搜索的名称没有点(像带有点的名称
home.
)它由 LLMNR 协议解析。LLMNR 查询在端口 5355 上发送和接收。 RFC 4795
某些域名后缀的多字(一个点或多个)名称(例如“.local”,请参阅带 的完整列表
systemd-resolve --status
)通过 MulticastDNS 协议进行解析。Domains=
根据列表检查多词名称系统网络(5) 每个接口如果匹配,则显示 DNS 服务器列表那接口被使用。其他多标签名称将路由到配置了 DNS 服务器的所有本地接口,以及全局配置的 DNS 服务器(如果有)。
#编辑
你的问题的标题是这样的:
systemd-resolved 如何处理单标签 dns 查找请求?
所以,我的回答集中在systemd-resolved
专门的问题上。
现在你问:
如果接口配置了搜索域“mydomain”并且禁用了 LLMNR,任何单标签查找请求是否都会路由到该接口?
如果接口配置了搜索域“mydomain”并启用了 LLMNR,并且传入“xyz”的查找请求,则通过 LLMNR 的“xyz”和通过指定 dns 服务器的“xyz.mydomain”是否都会发生?
这些似乎不属于systemd-resolved
专有范围。
让我们尝试分析一下它们:
- LLMNR 已禁用?如何?我可以问一下吗?经过禁用
systemd-resolved
自身与类似的东西systemctl mask systemd-resolved
?
如果systemd-resolved
被禁用/停止则没有LLMNR正在使用中(很可能,除非您安装 Avahi、Apple bonjour 或类似程序)但可以肯定的是,这超出了systemd-resolved
配置范围。
在这种情况下,我们应该问:当名称解析失败时会发生什么? (因为没有服务器可以回答)。那是配置在nsswitch
(文件/etc/nsswitch.conf
)。 Ubuntu(如 Debian)的默认配置包含以下行:
hosts: files mdns4_minimal [NOTFOUND=return] dns myhostname
那方法(用 nsswitch 的话说):
首先检查
/etc/hosts
文件。如果没有找到,则继续。尝试
mdns4_minimal
(阿瓦希等人。),仅当名称以 .local 结尾时,才会尝试通过多播 DNS 解析该名称。如果存在但没有找到这样的 mDNS 主机,mdns4_minimal 将返回 NOTFOUND。对 NOTFOUND 的默认名称服务切换响应将尝试下一个列出的服务,但 [NOTFOUND=return] 条目会覆盖该条目并停止搜索,且名称未解析。如果 mdns4_minimal 返回 UNAVAIL(未运行),则转到 dns。
剧情变厚了每个人都想成为解析名称列表中的第一个每个人都提出自己完成所有决议。
dns
中的条目nsswitch
实际上打电话nss-resolve
先调用取代 nss-dnsnss-resolve 是 GNU C 库 (glibc) 的 GNU 名称服务切换 (NSS) 功能的插件模块,使其能够通过 systemd-resolved(8) 本地网络名称解析服务解析主机名。它取代了传统上通过 DNS 解析主机名的 nss-dns 插件模块。
这将取决于
DOMAINS=
一般的几个条目/etc/systemd/resolved.conf
和/或通过/etc/systemd/network
文件的每个接口。上面已经解释过了编辑入口。了解 sytemd-resolved 可能会在 nsswitch 中的 dns 条目之前自行查询 dns 服务器。
如果尚未找到(没有
[notfound=return]
条目),则尝试 DNS 服务器。如果名称不以 .local 结尾,则这种情况或多或少会立即发生,或者如果以 .local 结尾则根本不会发生。如果删除 [NOTFOUND=return] 条目,nsswitch 将尝试通过单播 DNS 查找未解析的 .local 主机。这通常是一件坏事,因为它会将许多此类请求发送到永远无法解析它们的 Internet DNS 服务器。显然,这种情况经常发生。决赛
myhostname
作为最后一招localhost、主机名、*.local 和其他一些基本名称的解析器。
如果systemd-resolved
有一个LLMNR=no
在/etc/systemd/resolved.conf
与上面应用相同的列表中,但systemd-resolved
仍然能够解析localhost
和应用DOMAINS=
设置(全局或每个接口)。
明白systemd-resolved 中有 LLMNR 设置,systemd-networkd 中有每个链接的 LLMNR 设置。 关联。
#这一切意味着什么?除非配置非常具体,否则很难确定会发生什么。您将必须禁用服务并尝试(在具有您的配置的计算机中)会发生什么。
#Q1
如果接口配置了搜索域“mydomain”并且禁用了 LLMNR,任何单标签查找请求是否都会路由到该接口?
是的,当然,它可能。禁用 LLMNR 只会阻止本地解析(本地上没有其他服务器(是的:.local)网络将被询问),但该名称的解析必须找到答案(即使是否定的),因此它可能(如果没有未找到=返回例如,mylocalhost.mylocaldomain
当开始解析时,会联系匹配接口的 DNS 服务器进行解析mylocalhost
,并且有一个条目mylocaldomain
并且“搜索域”中会联系匹配接口的 DNS 服务器进行解析。回答一般的意义几乎是不可能的,变量太多。
#Q2
如果接口配置了搜索域“mydomain”并启用了 LLMNR,并且传入“xyz”的查找请求,则通过 LLMNR 的“xyz”和通过指定 dns 服务器的“xyz.mydomain”是否都会发生?
不。如果一切配置正确单个标签名称“xyz”只能由 LLMNR 解析,并且即使询问,DNS 服务器也不应该尝试解析它。嗯,这就是理论。但DNS系统必须解决com
(显然,否则网络就会像现在这样崩溃)。但有一个简单的解决方法:询问com.
,它有一个点,它是一个 FQDN。在任何情况下,NOERROR
如果服务器没有足够的有关标签的信息,并且解析应该继续与根服务器(对于.
),则DNS 服务器应该回答(带有空的 A(或 AAAA))。或者使用 NXDOMAIN (避免进一步解析的最佳答案)来处理它知道不存在的域。
控制这一点的唯一安全方法是拥有本地 DNS 服务器并选择要解析的名称和不解析的名称。
答案2
它将使用 LLMNR 和 DNS 路由到所有这些响应,并且将使用收到的第一个响应。
请参阅 systemd 解析的联机帮助页的这一部分:
如果查找被路由到多个接口,则返回第一个成功的响应(从而有效地合并所有匹配接口上的查找区域)。如果所有接口上的查找均失败,则返回最后一个失败的响应。