跟进此问题中未答复的评论。
我正在尝试将 zeroconf/bonjour 用于需要将某些流量传递到其他设备的家庭网络专业网络设备 - 如果我可以使其工作,带有额外主机名的 zeroconf 似乎是最简单和最灵活的方法。
我在 avahi-deamon 的第一次通行证让我的希望破灭了,因为每个主机可能只能注册一个名称。但后来我发现上面链接的 SO 帖子及其引用向我暗示它可能只是一个配置。我相信我根据建议配置了我的系统,但是来自同一设备或其他机器的三级域的名称解析仍然无法正常工作。所以我不知道我是做错了还是不可能,我误解了文档。
With hosts: files mdns4 [NOTFOUND=return] resolve [!UNAVAIL=return] dns
in /etc/nsswitch.conf
- 单个主机上的这一更改是否有望修复所有联网客户端上的名称解析?或者这只是希望修复每个客户端的名称解析策略,并且必须应用于所有希望参与非最小 zeroconf 名称解析的客户端?
这些可能是愚蠢的问题,但我相信 avahi 使用 nss 来确定它是否应该响应zeroconf 名称解析查询或其他任何问题。另外,如果它在本地工作但不能在其他机器上工作,我相信它需要在任何地方应用 - 但由于它甚至无法在本地解析名称(配置已更改),所以我想我只有它错了。我可以期待什么工作?
从技术上讲,请求/先前的行为违反了 mDNS 规范;所以要了解出现的兼容性问题。您需要立即使用 Avahi 的显式映射或第三方工具来获得所需的结果。
您也可以使用旧版本的解决方案
nss-mdns
(它似乎在转发到 Avahi 之前解析到主机,后续版本似乎已删除此类支持)。但这仅适用于以这种方式配置的每个系统,请参阅下面的详细说明。反对规范
RFC 6762,第 3 节 - 多播 DNS 名称:
这似乎意味着 mDNS 不正式支持子域。其他实现/平台似乎也加强了这一点:
Windows 不支持:
macOS 不支持:
自述
nss-mdns
文件确实引用了一些规则,最小变体使用这些规则来决定是否应该将它们发送到 Avahi 进行处理。我在github repo 上看到了这条评论nss-mdns
,它提供了一些上下文日期:这些规则是在2018 年初的
0.11
版本nss-mdns
中引入的,距离上一个版本已经过去了十多年0.10
,相关的变更日志说明:您引用的 AskUbuntu 问题说更改可能是从 Ubuntu 18.10 版本引入的,这是可以理解的,因为 18.04 本来是 LTS 版本,因此更新不太可能被批准。
这表明,
nss-mdns
由于长时间缺乏维护/更新,以前没有遵循此规则,Apple 的这两项更改都是0.10
在nss-mdns
. 正如相关的 github 问题通过反向查找逻辑及其造成的缺点/风险所阐明的那样。有一个长期存在的错误报告,mdns 被提交查询以解决在返回到标准 DNS 之前阻塞直到超时,这可以理解地给用户带来了很多问题,特别是那些与
.local
来自 Microsoft Active Directory 的非 mdns FQDN 交互的用户。要获得这种旧行为,我认为您可能需要恢复为
0.10
ofnss-mdns
。另一个问题是,在 2020 年,虽然据说 Windows 10 正在改进它的 mDNS 支持,但 Android 仍然缺乏它(除了开发人员在他们的应用程序中明确配置)。有一些解决方法,例如 Unbound 或 CoreDNS,它们都具有将单播 DNS 查询转发到多播的插件,但是需要配置 Avahi,以便主机通告发布的地址,以便它们可被发现。
Avahi 和 NSS
名称服务交换机 (NSS) 是供您的本地系统处理查找查询的,在这里它可以推迟到您的
/etc/hosts
本地 DNSsystemd-resolved
、mDNS 等。您的大多数软件都会使用它,但情况并非总是如此,特别是对于一些实用程序,如host
、dig
、drill
,nslookup
它们都绕过它并直接查询 DNS。Avahi 不服从 NSS,而是 NSS 通过
nss-mdns
. 因此,它与如何处理通过网络上其他设备的外部请求无关。您可以在不涉及 NSS 的情况下使用avahi-resolve --name myhostname.local --verbose
.我相信 mDNS 的其他实现在配置方面可能更加严格/有限,因此请记住,无论任何 Windows 和 macOS 客户端都可能无法正常工作,类似于它们可能只处理
.local
mDNS 的 TLD。配置 Avahi 以响应多个主机名
您可以配置
nss-mdns
为允许通过/etc/mdns.allow
(当您的行中不使用最小变体时/etc/nsswitch.conf
hosts:
)解析其他标签。如果没有这个,任何使用 NSS 的东西都可能会发送一个单播 DNS 查询,而不是跳过 mDNS。配置后,您可能需要重新启动任何进程以重新加载该配置,或者您可以使用 CLI 命令(如
ping
. 虽然这确实允许预期的解析行为,但您会注意到 5 秒的常见超时响应。Avahi 本身未能找到查询响应的命中,因为没有设置任何响应该主机名的设置。此外,该文件
/etc/avahi/avahi-daemon.conf
不支持or.
的值,这些值用于单个标签。但是,您可以使用 avahi-publish 手动发布显式映射:host-name
domain-name
并且守护进程会对此做出响应,但不会通过 将其报告为可发现的
avahi-browse -a
。该-R
选项很重要,因为它允许您发布相同的 IP 地址(否则会抱怨本地名称冲突)。或者,您也可以在每行中定义这些/etc/avahi/hosts
,每行是 IP 地址,后跟一个主机名(也可以有一个.
),在该位置的现有文件中应该有一些注释和示例。基于文件的方法没有等效于 的-R
选项avahi-publish
,因此指定已映射到主机名的 IP 地址将被忽略。avahi-daemon
修改此 hosts 文件时不需要重新启动。请注意,对于没有
avahi-resolve
工作的查询,您需要将 NSS 配置为使用非最小mdns 变体,例如mdns4
,将范围限定为 IPv4(与mdns
IPv6 相对)也可以导致更快的结果(而不是等待 5 秒)超时,然后收到 IPv4 响应,avahi-resolve
无论如何都会立即响应)。您还可以在不修改/etc/nsswitch.conf
withgetent --service=mdns4 hosts test.hostname.local
、将--service
值更改为mdns4_minimal
、mdns
等的情况下测试查询。Avahi 通过 D-Bus
提供明确的 IP 地址有点违背目的,但如果设备运行 Avahi,您应该能够通过脚本/程序将一系列标签/子域列出到主机名,该脚本/程序通过其 D-Bus 与 Avahi 通信API,就像这个旧的 python一样,他们将他们的答案片段移到了Github 存储库,如果旧代码没有很好地老化,它有很多分支,包括一个移植到 python3。对于 Docker 用户,在 DockerHub 上搜索 avahi 镜像时可以找到类似的内容,我相信有一个与 Traefik 和 docker 标签集成以通过 Avahi 在 mDNS 上公开容器。
用于 DNS-SD 的 Avahi
您仍然可以利用 mDNS 在打印机等设备中与 DNS-SD(服务发现)一起使用。您可以提供一个友好的字符串作为服务名称,并指明服务类型。然后,另一台设备可以使用 DNS-SD 查询感兴趣的设备并与之交互。
另一个可行的替代方案是动态 DNS (DDNS),它允许设备更新其 IP 地址的 DNS 记录。还有更多涉及的服务发现软件,例如 Hashicorp Consul。