如何检查是什么阻止了我的 mDNS 请求?

如何检查是什么阻止了我的 mDNS 请求?

情况就是这样。我有一个通过 avahi 发布多个域的家庭服务器。

Avahi 和resolvctl 安装在客户端(ubuntu 22)上。

在文件中/etc/nsswitch.conf- hosts: files mdns4_minimal [NOTFOUND=return] dns.这看起来很正常。

但,

$ avahi-resolve -n whoami.homeserver.local
whoami.homeserver.local 192.168.0.4

但是当尝试通过 ping 或curl 解析地址时

$ curl whoami.homeserver.local
curl: (6) Could not resolve host: whoami.homeserver.local

UPD:有趣 -homeserver.local通过 ping 正确解析基本名称

答案1

您正在尝试通过 mDNS 解析 3 标签名称。

通常,mdns4_minimal只会解析 2 个标签名称。

libnss-mdns 解析器库的源代码:

// If mdns_allow_file is NULL, then this implements the "local" SOA
// check and two-label name checks similarly to the algorithm
// described at https://support.apple.com/en-us/HT201275. This means
// that if a unicast DNS server claims authority on "local", or if the
// user tries to resolve a >2-label name, we will not do mDNS resolution.

提到的 Apple 支持文档已不再存在,但是可以通过 archive.org 查看

这里提到的指mdns_allow_file的是构建时可配置${sysconfdir}/mdns.allow(通常是/etc/mdns.allow)。测试mdns4_minimal此文件是否存在:如果存在,则允许进行更广泛的 mDNS 查找。如果没有它,就像默认情况一样,只会<single_label>.local通过 mDNS 查找表单的两个标签名称- 如果local.发现存在常规 DNS SOA 记录,甚至会跳过该查找。

当 mDNS 被引入时,很快就发现许多组织已经将内部 DNS 层次结构设置为.local.organization.local

为了最大限度地减少 mDNS 使用分配带来的麻烦.local,我们达成了妥协:默认情况下,mDNS 仅适用于以 结尾的双标签名称,.local除非专门启用以供更广泛的使用。这将允许三个或更多标签的名称以 结尾,并像以前一样进行解析,但会保留以 mDNS / Zeroconf / Bonjour 目的.local结尾的两个标签名称。.local

该文件似乎记录得很差,但添加对其支持的提交消息内容丰富:

从版本 0.5 开始,nss-mdns有一个简单的配置文件,/etc/mdns.allow用于在.local.该文件包含有效的域后缀,以换行符分隔。空行将被忽略,以 # 开头的注释也是如此。要启用所有名称的 mDNS 查找,无论域后缀如何,请添加*仅包含以下内容的行(类似于nss-mdns版本 <= 0.4 的操作模式):

# /etc/mdns.allow
*

如果配置文件不存在或不可读,则nss-mdns行为就像读取具有以下内容的配置文件:

# /etc/mdns.allow
.local.
.local

即只有以 结尾的主机名.local通过 mDNS 进行解析。

如果配置文件存在但为空,则完全禁用 mDNS 名称查找。

正在阅读决定该名称是否允许 mDNS 查找的函数的源代码/etc/mdns.allow表示仅当文件不存在时(else最外层 if...then...else子句的分支)才应用双标签限制。显然,双标签启发式是在实施该mdns.allow文件 10 年后添加的。

因此,如果您希望三标签 mDNS 名称正常工作,但又想让其他所有内容按原样运行,则必须创建一个/etc/mdns.allow包含以下内容的文件:

.local.
.local

相关内容