我查看了 systemd-networkd 和 systemd-resolved:
我对一些词感到困惑:
systemd-resolved.service(8)
使用 LLMNR 协议将单标签名称路由到所有能够进行 IP 多播的本地接口。查找以每个接口域之一结尾的主机名将专门路由到匹配的接口。
systemd.network(5)
“搜索”和“仅路由”域都用于路由 DNS 查询:查找以这些域结尾的主机名(因此,如果列出了任何“搜索域”,也将单标签名称)路由到为此接口配置的 DNS 服务器。
我的问题是:对于具有配置了“搜索域”和启用 LLMNR 的一堆接口的主机,单标签查找请求将去哪里?
我的困惑的更多细节:
- 如果接口配置了搜索域“mydomain”并且禁用了 LLMNR,是否会将任何单标签查找请求路由到该接口?
- 如果接口配置了搜索域“mydomain”并启用了 LLMNR,并且对“xyz”的查找请求进入,那么通过 LLMNR 的“xyz”和通过指定 dns 服务器的“xyz.mydomain”是否都会发生?
这个问题需要很长时间才能解释。简短(不精确)的描述是:
单标签查找请求会去哪里?
单标?(not
localhost
et al.):始终使用 LLMNR 系统。多标签?:到每个接口的DNS服务器。失败时(或如果未配置),发送到全球 DNS 服务器。
是的,一般顺序如systemd-resolved.service(8) BUT中所述:
将systemd.network(5)设置为 DNS 解析的附加资源。
并且,从 RFC 4795了解:
序列(简化)是:
本地配置的主机名解析为按其范围排序的所有本地配置的 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 协议解析。某些域后缀(如“.local”,参见完整列表)的多字(一个点或多个)名称
systemd-resolve --status
是通过 MulticastDNS 协议解析的。根据每个接口的systemd.network(5)
Domains=
中的列表检查多词名称,如果匹配,则使用该接口的 DNS 服务器列表。其他多标签名称被路由到所有配置了 DNS 服务器的本地接口,加上全局配置的 DNS 服务器(如果有的话)。
#编辑
你的问题的标题是:
所以,我的答案
systemd-resolved
完全集中在上面。现在你问:
如果接口配置了搜索域“mydomain”并禁用了 LLMNR,是否会将任何单标签查找请求路由到该接口?
如果接口配置了搜索域“mydomain”并启用了 LLMNR,并且输入了“xyz”的查找请求,那么通过 LLMNR 的“xyz”和通过指定的 dns 服务器的“xyz.mydomain”是否都会发生?
那些似乎是
systemd-resolved
排他性的。让我们尝试分析它们:
systemd-resolved
systemctl mask systemd-resolved
? _如果
systemd-resolved
禁用/停止,则没有使用LLMNR(很可能,除非您安装 Avahi、Apple bonjour 或类似程序)但当然,这超出了systemd-resolved
配置范围。在这种情况下,我们应该问:当名称解析失败时会发生什么?(因为没有服务器来回答它)。这是在
nsswitch
(文件/etc/nsswitch.conf
)中配置的。Ubuntu(作为 Debian)的默认配置包含以下行:这意味着(用 nsswitch 的说法):
首先检查
/etc/hosts
文件。如果没有找到,继续。尝试
mdns4_minimal
(Avahi 等人),仅当名称以 .local 结尾时,它才会尝试通过多播 DNS 解析名称。如果找到但没有找到这样的 mDNS 主机,mdns4_minimal 将返回 NOTFOUND。对 NOTFOUND 的默认名称服务切换响应将尝试下一个列出的服务,但 [NOTFOUND=return] 条目会覆盖该条目并停止名称未解析的搜索。如果 mdns4_minimal 返回 UNAVAIL(未运行)然后转到 dns。情节加深了每个人都想成为第一个解决名字的人,每个人都提出自己做所有的决议。
中的
dns
条目实际上首先nsswitch
调用nss-resolve
它替换 nss-dns这将取决于
DOMAINS=
一般的几个条目和/或通过文件的/etc/systemd/resolved.conf
每个接口。/etc/systemd/network
这在EDIT条目上方进行了解释。了解 sytemd-resolved 可能会在 nsswitch 中的 dns 条目之前自行查询 dns 服务器。
如果尚未找到(没有
[notfound=return]
条目),请尝试 DNS 服务器。如果名称不以 .local 结尾,或者根本不以 .local 结尾,这或多或少会立即发生。如果您删除 [NOTFOUND=return] 条目,nsswitch 将尝试通过单播 DNS 定位未解析的 .local 主机。这通常是一件坏事,因为它会将许多此类请求发送到永远无法解析它们的 Internet DNS 服务器。显然,这种情况经常发生。final
myhostname
充当 localhost、hostname、*.local 和其他一些基本名称的最后解析器。如果在与上述相同的列表中
systemd-resolved
有一个LLMNR=no
集合,则应用但仍然能够解析和应用设置(全局或每个接口)。/etc/systemd/resolved.conf
systemd-resolved
localhost
DOMAINS=
了解systemd-resolved 中有 LLMNR 设置,systemd-networkd 中也有 per-link LLMNR 设置。 链接。
#这一切是什么意思?除非配置非常具体,否则很难确定会发生什么。您将不得不禁用服务并尝试(在您的计算机上使用您的配置)会发生什么。
#Q1
是的,当然可以。禁用 LLMNR 只会阻止本地解析(不会询问本地(是:.local)网络上的其他服务器),但该名称的解析必须找到答案(即使是否定的)所以它可能(如果没有NOTFOUND =return entry,例如)
mylocalhost.mylocaldomain
当解析mylocalhost
开始并且mylocaldomain
在“搜索域”中有一个条目时,会联系匹配接口的 DNS 服务器以解析。笼统地回答几乎是不可能的,变数太多了。#Q2
不,如果所有配置都正确,单个标签名称“xyz”应该只由 LLMNR 解析,即使被询问,DNS 服务器也不应该尝试解析它。嗯,这就是理论。但是 DNS 系统必须解析
com
(显然,否则网络会像现在这样崩溃)。但是有一个简单的解决方法:询问com.
,它有一个点,它是一个 FQDN。NOERROR
在任何情况下,如果服务器没有关于标签的足够信息并且解析应该继续使用根服务器(对于) ,则 DNS 服务器应该回答(带有空 A(或 AAAA).
)。或者对它知道不存在的域使用 NXDOMAIN(避免进一步解决的最佳答案)。控制这种情况的唯一安全方法是拥有本地 DNS 服务器并选择要解析的名称和不解析的名称。
它将使用 LLMNR 和 DNS 路由到所有这些,并且将使用收到的第一个响应。
请参阅 systemd-resolved 手册页的这一部分: