违反规范

违反规范

跟进未答复的评论这个问题

我正在尝试使用 zeroconf/bonjour 作为家庭网络专业网络设备它需要将某些流量传递到其他设备 - 如果我能让它工作的话,带有额外主机名的 zeroconf 似乎是最简单、最灵活的方法。

我第一次尝试 avahi-deamon 时,我的希望破灭了,因为每个主机可能只能注册一个名称。但后来我发现上面链接的 SO 帖子及其参考资料向我暗示这可能只是一种配置。我相信我按照建议配置了我的系统,但从同一设备或其他机器通过三级域进行的名称解析仍然不起作用。所以我不知道是我做错了还是不可能,我误解了文档。

是否hosts: files mdns4 [NOTFOUND=return] resolve [!UNAVAIL=return] dns预期/etc/nsswitch.conf在单个主机上进行这一更改可以修复所有联网客户端上的名称解析?或者这仅预期修复每个客户端的名称解析策略,并且必须应用于希望参与非最小零配置名称解析的所有客户端?

这些问题可能很愚蠢,但我相信 avahi 会使用 nss 来确定是否应该回应到零配置名称解析查询,或其他任何情况。另外,如果它在本地工作,但在其他机器上不工作,我相信它需要应用到任何地方 - 但由于它甚至无法在本地解析名称(配置已更改的地方),所以我认为我错了。我能期望什么工作?

答案1

从技术上讲,请求/之前的行为违反了 mDNS 规范;因此请了解由此产生的兼容性问题。您需要使用显式映射或第三方工具与 Avahi 配合使用才能获得所需的结果。

您也可以使用旧版本,nss-mdns应该可以解决问题(它似乎在转发到 Avahi 之前解析到主机,后续版本似乎已删除此类支持)。但这仅适用于以这种方式配置的每个系统,请参阅下面的详细说明。

违反规范

RFC 6762,第 3 节 - 多播 DNS 名称

本文档允许任何计算机用户选择为其计算机提供以下形式的链路本地多播 DNS 主机名:“single-dns-label.local”。... 本文档建议对点本地主机名使用单一平面命名空间(即 DNS“A”和“AAAA”记录的名称,将名称映射到 IPv4 和 IPv6 地址),但其他 DNS 记录类型(例如基于 DNS 的服务发现 [RFC6763] 使用的记录类型)可以包含适合所需用途的尽可能多的标签。

这似乎意味着 mDNS 尚未正式支持子域名。其他实现/平台似乎也支持这一说法:

Windows 不支持此功能

我唯一失望的是 Bonjour/Avahi 的 Windows 实现不支持此实现宣布的别名,它只会看到通常宣布的主 avahi 主机名(即我们上面示例中的 server.local)。

macOS 不支持此功能

如果名称有两个以上的标签,则会返回错误,例如 foo.bar.local 的情况。

自述文件nss-mdns确实引用了一些规则最小变体用来决定是否应该将它们发送到 Avahi 进行处理。我遇到了此评论nss-mdnsgithub repo 上提供了一些日期作为背景信息:

双标签限制启发式算法在 2007-10-26 发布的 Mac OS X v10.5 中实现。单播 SOA 启发式算法在 2009-08-28 发布的 Mac OS X v10.6 中实现。

这些规则是在0.11nss-mdns2018 年初发布,距离上一次0.10发布已有十多年,相关更新日志如下:

nss-mdns现在实施用于检测单播解析的标准启发式方法.local,并将在本地服务器响应.local请求时自动禁用解析

您引用的 AskUbuntu 问题表示该变化可能是从 Ubuntu 18.10 版本开始引入的,这是可以理解的,因为 18.04 本来是一个 LTS 版本,因此该更新不太可能获得批准。

这表明,nss-mdns由于长期缺乏维护/更新,Apple 之前并未关注这些更改,这些更改都是在0.10发布后添加的nss-mdns相关 github 问题用反向查找逻辑澄清以及它所造成的缺点/风险。

有一个长期存在的错误报告,指出 mdns 被交给查询来解析,该查询被阻止直到超时才回退到标准 DNS,这可以理解地给用户带来了不少问题,特别是那些与.localMicrosoft Active Directory 中的非 mdns FQDN 交互的用户。

为了获得以前的行为,我认为您可能需要恢复0.10nss-mdns

另一个问题是,在 2020 年,虽然 Windows 10 据说正在改进其 mDNS 支持,但 Android 仍然缺乏它(除了开发人员在其应用程序中明确配置它之外)。有一些解决方法,例如 Unbound 或 CoreDNS,它们都有插件可以将单播 DNS 查询转发到多播查询,但是需要配置 Avahi,以便主机宣传已发布的地址,以便它们可以被发现。

Avahi 和 NSS

名称服务交换 (NSS) 供您的本地系统处理查找查询,在这里它可以被延迟到您的/etc/hosts、本地 DNS、systemd-resolved、mDNS 等。大多数软件都会使用它,但情况并非总是如此,尤其是一些实用程序(如hostdigdrillnslookup都会绕过它并直接查询 DNS。

Avahi 不会遵从 NSS,而是 NSS 通过 遵从 Avahi nss-mdns。因此,它与网络上其他设备的外部请求的处理方式无关。您可以使用 测试 Avahi 查询,而无需 NSS 参与avahi-resolve --name myhostname.local --verbose

我相信 mDNS 的其他实现在配置方面可以更加严格/有限,因此请记住,无论如何,任何 Windows 和 macOS 客户端都可能无法工作,类似于它们可能只处理.localmDNS 的 TLD。

配置 Avahi 以响应多个主机名

可以配置nss-mdns允许通过以下方式解析其他标签/etc/mdns.allow(不使用时最小变体/etc/nsswitch.conf hosts:)。如果没有这个,任何使用 NSS 的东西都可能会发送单播 DNS 查询,跳过 mDNS。

配置完成后,您可能需要重新启动任何进程以重新加载该配置,或者您可以使用 CLI 命令(如)进行测试ping。虽然这确实允许预期的解析行为,但您会注意到常见的 5 秒超时响应。Avahi 本身无法找到查询响应的匹配项,因为没有设置任何内容来响应该主机名。

此外,该文件/etc/avahi/avahi-daemon.conf不支持或 的.值,这些值适用于单个标签。但是,您可以使用 avahi-publish 手动发布显式映射:host-namedomain-name

avahi-publish -a -R test.hostname.local 192.168.1.42

守护进程将对此作出响应,但不会将其报告为可通过 发现avahi-browse -a。该-R选项很重要,因为它将允许您发布相同的 IP 地址(否则会抱怨本地名称冲突)。或者,您也可以在 中定义这些,/etc/avahi/hosts每行都是 IP 地址,后跟主机名(同样可以有.),该位置的现有文件中应该有一些注释和示例。基于文件的方法没有与 选项等效的选项-Ravahi-publish因此指定已经映射到主机名的 IP 地址将被忽略。avahi-daemon修改此主机文件时不需要重新启动。

请注意,对于没有的查询,avahi-resolve您需要将 NSS 配置为使用非最小mdns 变体,例如mdns4,将范围限定为 IPv4(而不是mdns也涵盖 IPv6)也可以更快地获得结果(而不是等待 5 秒超时,然后收到 IPv4 响应,avahi-resolve无论如何都会立即响应)。您还可以使用 测试查询而无需修改,将值更改为/etc/nsswitch.conf、等。getent --service=mdns4 hosts test.hostname.local--servicemdns4_minimalmdns

通过 D-Bus 的 Avahi

提供显式的 IP 地址有点违背了目的,但如果设备运行 Avahi,你应该能够让它通过与 Avahi 通信的脚本/程序列出主机名的一系列标签/子域,例如这个老 Python,他们将答案片段移至Github 仓库,它有相当多的分支,包括一个移植到 python3 的分支,如果旧代码已经过时了的话。对于 Docker 用户,在 DockerHub 上搜索 avahi 镜像时可以找到类似的镜像,我相信有一个与 Traefik 和 docker 标签集成的镜像,可以通过 Avahi 在 mDNS 上公开容器。

DNS-SD 的 Avahi

您仍然可以利用 mDNS,因为它通常与打印机等设备中的 DNS-SD(服务发现)一起使用。您可以提供一个友好的字符串作为服务名称,并指明服务类型。然后,另一台设备可以使用 DNS-SD 查询感兴趣的设备并与其交互。

另一个可行的替代方案是动态 DNS (DDNS),它允许设备更新其 IP 地址的 DNS 记录。还有更多相关的服务发现软件,如 Hashicorp Consul。

相关内容