情况就是这样。我有一个通过 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 个标签名称。
// 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