systemd-resolved 如何处理单标签 dns 查找请求?

Sol*_*eng 6 dns systemd-networkd systemd-resolved

我查看了 systemd-networkd 和 systemd-resolved:

我对一些话感到困惑:

  • systemd-resolved.service(8)

    使用 LLMNR 协议将单标签名称路由到所有能够进行 IP 多播的本地接口。对以每个接口域之一结尾的主机名的查找被专门路由到匹配的接口。

  • systemd.network(5)

    “搜索”和“仅路由”域都用于 DNS 查询的路由:查找以这些域结尾的主机名(因此,如果列出了任何“搜索域”,也会将单标签名称路由到为此接口配置的 DNS 服务器。

我的问题是:对于配置了“搜索域”并启用 LLMNR 的一堆接口的主机,单标签查找请求会去哪里?

我的困惑的更多细节:

  • 如果接口配置了搜索域“mydomain”并禁用了 LLMNR,是否将任何单标签查找请求路由到此接口?
  • 如果接口配置了搜索域“mydomain”并启用了 LLMNR 并且传入了对“xyz”的查找请求,“xyz”是否会通过 LLMNR 和“xyz.mydomain”通过指定的 dns 服务器同时发生?

ImH*_*ere 6

这个问题需要很长时间来解释。简短(不精确)的描述是:

单标签查找请求会去哪里?

单标签?(不是localhost等人):总是到 LLMNR 系统。

多标签?:到每个接口的DNS服务器。出现故障(或未配置)时,发送到全球 DNS 服务器。


是的,一般顺序如systemd-resolved.service(8) BUT 中所述

配置每个接口的域名可能会影响查找的路由。有关详细信息,请参阅systemd.network(5)

systemd.network(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 协议进行解析。

  • 根据每个接口的systemd.network(5)Domains=列表检查多词名称,如果匹配,则使用接口的 DNS 服务器列表。

  • 其他多标签名称将路由到所有配置了 DNS 服务器的本地接口,以及全局配置的 DNS 服务器(如果有)。


编辑

你的问题的标题是:

systemd-resolved 如何处理单标签 dns 查找请求?

所以,我把我的答案集中在systemd-resolved独家上。

现在你问:

  1. 如果某个接口配置了搜索域“mydomain”并且禁用了 LLMNR,是否将任何单标签查找请求路由到该接口?

  2. 如果一个接口配置了搜索域“mydomain”并启用了 LLMNR 并且一个对“xyz”的查找请求进来了,“xyz”通过 LLMNR 和“xyz.mydomain”通过指定的 dns 服务器都会发生吗?

那些似乎在systemd-resolved排他性之外。

让我们尝试分析它们:

  • LLMNR 禁用 ? 如何?我可以问吗?。通过禁用systemd-resolved本身有类似的东西systemctl mask systemd-resolved

    如果systemd-resolved被禁用/停止,则没有使用LLMNR(很可能,除非您安装 Avahi、Apple bonjour 或类似程序)但当然,这不在systemd-resolved配置范围内。

    在这种情况下,我们应该问:当名称解析失败时会发生什么?(因为没有服务器来回答它)。这是nsswitch(file /etc/nsswitch.conf) 中配置的。Ubuntu(作为 Debian)的默认配置包含这一行:

    主机:文件 mdns4_minimal [NOTFOUND=return] dns myhostname

    意味着(用 nsswitch 的说法):

    1. 首先检查/etc/hosts文件。如果没有找到,继续。

    2. 尝试mdns4_minimalAvahi 等人),它仅在名称以 .local 结尾时才尝试通过多播 DNS 解析名称。如果有但没有找到这样的 mDNS 主机,mdns4_minimal 将返回 NOTFOUND。对 NOTFOUND 的默认名称服务切换响应将尝试下一个列出的服务,但 [NOTFOUND=return] 条目覆盖该条目并停止搜索,名称未解析。如果 mdns4_minimal 返回 UNAVAIL(未运行),则转到 dns。

    情节变厚了,每个人都想成为第一个解决名字的人,每个人都提出自己做所有的决议。

    1. 中的dns条目nsswitch 实际上nss-resolve首先调用它替换 nss-dns

      nss-resolve 是 GNU C 库 (glibc) 的 GNU 名称服务切换 (NSS) 功能的插件模块,使其能够通过 systemd-resolved(8) 本地网络名称解析服务解析主机名。它取代了传统上通过 DNS 解析主机名的 nss-dns 插件模块。

      这将取决于DOMAINS=一般的几个条目/etc/systemd/resolved.conf和/或通过/etc/systemd/network文件的每个接口。这在上面的EDIT条目中进行了解释。

      了解 sytemd-resolved 可能会在 nsswitch 中的 dns 条目之前自行查询 dns 服务器。

    2. 如果尚未找到(没有[notfound=return]条目),则尝试 DNS 服务器。如果名称不以 .local 结尾,这或多或少会立即发生,或者根本不以 .local 结尾。如果删除 [NOTFOUND=return] 条目,nsswitch 将尝试通过单播 DNS 定位未解析的 .local 主机。这通常是一件坏事,因为它会将许多此类请求发送到永远不会解析它们的 Internet DNS 服务器。显然,这种情况经常发生。

    3. finalmyhostname充当localhost、hostname、*.local 和其他一些基本名称的最后一个解析器。

    如果在与上述相同的列表中systemd-resolved有一个LLMNR=no集合/etc/systemd/resolved.confsystemd-resolved仍然能够解析localhost和应用DOMAINS=设置(全局或每个接口)。

了解systemd-resolved 中有 LLMNR 设置,systemd-networkd 中有每个链接的 LLMNR 设置。 链接

这一切意味着什么?

除非配置非常具体,否则很难确定会发生什么。您将不得不禁用服务并尝试(在您的计算机中使用您的配置)会发生什么。

第一季度

如果某个接口配置了搜索域“mydomain”并且禁用了 LLMNR,是否将任何单标签查找请求路由到该接口?

是的,当然可以。禁用 LLMNR 只会阻止本地解析(不会询问本地(是:.local)网络上的其他服务器)但该名称的解析必须找到答案(即使是否定的),因此它可能(如果没有NOTFOUND =return entry,例如)发生在开始解析mylocalhost.mylocaldomain时联系匹配接口的 DNS 服务器进行解析,mylocalhost并且mylocaldomain在“搜索域”中有一个条目。一般意义上的回答几乎是不可能的,变数太多了。

Q2

如果一个接口配置了搜索域“mydomain”并启用了 LLMNR 并且一个对“xyz”的查找请求进来了,“xyz”通过 LLMNR 和“xyz.mydomain”通过指定的 dns 服务器都会发生吗?

不。如果所有配置都正确,单个标签名称“xyz”应该只由 LLMNR 解析,并且即使被询问,DNS 服务器也不应该尝试解析它。嗯,这就是理论。但是 DNS 系统必须解析com(显然,否则网络会像现在这样崩溃)。但是有一个简单的解决方法: ask for com.,它有一个点,它是一个 FQDN。在任何情况下,NOERROR如果服务器没有关于标签的足够信息并且解析应该继续与根服务器(对于.),则 DNS 服务器应该回答(带有空的 A(或 AAAA))。或者使用 NXDOMAIN(避免进一步解析的最佳答案)用于它知道不存在的域。

控制这一点的唯一安全方法是拥有一个本地 DNS 服务器,并选择要解析哪些名称以及不解析哪些名称。