这似乎是从 18.10 或 19.04 才开始出现的行为差异。
虽然avahi-resolve --name my.subdomain.local
返回有效的 IP 地址并且可以正常工作,但除此之外它不起作用,ping
即curl
或chrome
。
不过,名称解析对于 仍然有效。这似乎与 被解析为 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 包(默认情况下未安装),我不会再看到名称解析错误。