我有一个使用 mDNS 设置的家庭网络,其中包含各种系统(包括始终开启的 Raspberry Pi)。我的机器正在运行 avahi 守护程序,因此当前情况是:
- 网络上的每个人都可以解析
host.local
名称。
我另外想要的是:
- 我管理的机器也可以解析
host
为相同的地址host.local
。
我想到三种方法可以做到这一点:
普京:
search local
/etc/resolv.conf
mDNS 不支持该功能因为它被认为“造成了问题”。我可以--enable-search-domains
在所有的机器上使用这些选项重新编译。在所有网络机器上写入静态
/etc/hosts
文件。这是我目前所做的。但是,它使配置分布式,我想避免这种情况(这些文件做最终失去同步)。在网络上设置 DNS 服务器。但是,提供 Internet 访问的路由器不提供 DNS(这几乎是更换其他公司的好理由),因此我需要在 Raspberry 上设置它。这也带来了分布式配置的问题:Raspberry 上的静态 DNS 信息最终会与 mDNS 信息不同步,因此可能会令人
host
困惑host.local
地指向两个不同的 IP 地址……
所以,我的问题是:
该选项带来的“问题”是什么
--enable-search-domains
?(我看到的唯一问题是,它允许 LAN 上的任何人设置不合格的主机名,但是 1. 除了我已经控制的主机名之外,我不会使用不合格的主机名,并且 2. LAN 访问已经限制为受信任的对等方)。我是否错过了其他第四个选项?(例如,设置一个 DNS 服务器 + 一个 crontab 并定期向其提供一些
avahi-browse
命令的输出?)
答案1
mdns 不附加 .local 或搜索域的原因是 mdns 中没有 NXDOMAIN 或类似的概念。
因此,如果 mdns 无法在任何缓存中找到解析,它必须发送多播查询并等待查看是否有任何响应。此超时时间足够长,足以“导致问题”。
以下内容并未回答该问题,但推测了一些解决部分问题的可能实施方式。
我希望的是明确地将 .local 附加到主机名,而不在 nss 链的末尾添加任何点。例如
主机:文件 mdns4_minimal [NOTFOUND=return] dns mdns_append
也许还可以指定“仅缓存”mdns 解析。也许可以使用这样的 nsswitch
主机:文件 mdns4_minimal [NOTFOUND=return] mdns_append_cacheonly dns mdns_append
我设想 mdns_append 尝试附加和不附加 .local 两种情况。
答案2
我怀疑这个选项“不推荐”,因为它在实践中几乎没用:几乎所有其他 mDNS 实现都使用.local
域仅有的,因此尝试查找您从 DHCP 获得的任何域在大多数情况下都只会带来额外的延迟。还有安全问题在实际的 mDNS 规范中提到。
相反,nss-mdns 可以修补为具体来说.local
在尝试查找它们之前附加到无点名称,而不是使用 resolv.conf 域。