19.04 版中,avahi 名称解析不符合子域名的要求

19.04 版中,avahi 名称解析不符合子域名的要求

这似乎是从 18.10 或 19.04 才开始出现的行为差异。

虽然avahi-resolve --name my.subdomain.local返回有效的 IP 地址并且可以正常工作,但除此之外它不起作用,pingcurlchrome

不过,名称解析对于 仍然有效。这似乎与 被解析为 mDNS CNAMEsubdomain.local有关。*.subdomain.local

内容nsswitch.conf

passwd:         compat systemd
group:          compat systemd
shadow:         compat
gshadow:        files

hosts:          files mdns4_minimal [NOTFOUND=return] dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

内容/etc/resolv.conf

nameserver 127.0.0.53
options edns0

答案1

以下内容在 Ubuntu 19.10 上对我有用:

sudo apt install libnss-resolve

sudo bash -c "cat > /etc/mdns.allow" <<'EOF'
.local.
.local
EOF

然后,/etc/nsswitch.conf以 root 身份编辑并更改:

hosts:          files mdns4_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] dns

hosts:          files mdns4 [NOTFOUND=return] resolve [!UNAVAIL=return] dns

这种行为是由于双标签限制nss-mdns 中的启发式方法。其他此类限制包括:

  • 如果请求不是以.local或结尾.local.,则表示被拒绝。例如:example.test被拒绝。
  • 如果请求包含两个以上的标签,则会被拒绝。例如:foo.bar.local被拒绝。这是双标签限制启发式
  • 如果在请求期间,系统配置的单播 DNS(在 中指定/etc/resolv.conf)报告顶级本地名称的 SOA 记录,则请求将被拒绝。示例:host -t SOA local返回除“未找到主机本地:3(NXDOMAIN)”之外的内容。这是单播 SOA 启发式方法。

上述解决方案改编自github issue#64

答案2

设置 DNS 的方法有很多,但我发现使用 systemd 进行标准 Ubuntu 安装时会出现间歇性故障,除非我还安装了 libnss-resolve 包。此包的唯一作用是更改 /etc/nsswitch.conf 文件中的“hosts”行 - 在 dns 条目前添加“resolve [!UNAVAIL=return]”。例如

hosts: files mdns4_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] dns myhostname  

查看错误1727237 systemd-resolved 未找到域1805027 systemd-resolved 无法解析康卡斯特邮件服务器地址, 和1804487 当 EDNS 禁用时,当答案超过 512 字节时,systemd-resolved 会出现问题

这些名称解析失败之所以难以追踪,是因为它们仅在某些条件下发生,即当 UDB 的回退结果限制为 512 字节时。这个问题与 nsswitch.conf hosts 行的关系更难弄清楚,但在错误中提到了添加 libnss-resolve 包的建议,它解决了我偶尔遇到的所有问题。

此“修复”将应用于发现机器,但在 Ubuntu 20.04 中不再起作用。无论是否安装了 libnss-resolve,都不再解析短名称,除非直接传递给 dig 中的路由器。好的一面是,如果没有 libnss-resolve 包(默认情况下未安装),我不会再看到名称解析错误。

相关内容