![systemd-resolved 不会查询 DNS 服务器以获取本地域](https://linux22.com/image/1202632/systemd-resolved%20%E4%B8%8D%E4%BC%9A%E6%9F%A5%E8%AF%A2%20DNS%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BB%A5%E8%8E%B7%E5%8F%96%E6%9C%AC%E5%9C%B0%E5%9F%9F.png)
自从升级到 17.04 后,我无法再解析本地网络 (silvesternet.local) 中的地址。我收到以下响应:
$ systemd-resolve edgerouter
edgerouter: resolve call failed: No appropriate name servers or networks for name found
日志中仅存在与此查找相关的交易超时的报告。
我使用 Wireshark 嗅探网络流量,似乎它甚至没有尝试查找名称。根本没有 DNS 流量。查找另一个外部域就可以了。
同一主题的许多问题都提到更改 nsswitch.conf,但这似乎没有解决任何问题。我当前的设置是:
hosts: files mdns4_minimal dns [NOTFOUND=return] resolve [!UNAVAIL=return] mdns4
答案1
我相信这是设计使然。
Ubuntu 17.04 已切换到 systemd-resolved 进行名称解析,并且仅使用 LLMNR(多播名称查找)进行单标签名称解析。有关详细信息,请参阅此链接:https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html
要了解这个决定背后的原因,请查看这个错误报告中 poettering 的回复: https://github.com/systemd/systemd/issues/2514
更新:可以通过为本地网络使用域名来解决此问题。如果网络接口配置(手动或通过 DHCP)以使用搜索域,则 systemd-resolved 会将此域添加到单标签名称,然后通过单播 DNS 查找它们。
显然,本地 DNS 服务器应该重新配置以识别这些域。如果 dnsmasq 从 /etc/hosts 读取本地主机到 IP 对,可以通过向 dnsmasq.conf 添加以下指令来实现:
domain=mydomain.net
local=/mydomain.net/
expand-hosts
更新2:或者你可以按照此处所述恢复到 dnsmasqhttps://askubuntu.com/a/911432/692094
答案2
我在 Ubuntu 18.04 上遇到了同样的问题,它也使用 systemd-resolved 进行 DNS 解析。其默认配置不通过 DNS 解析单标签主机名或 .local 域主机名,而是分别通过 LLMNR 或 mDNS 解析。
为了使本地单标签主机名或 .local 域主机名由 DNS 解析,我启用了“处理 /etc/resolv.conf 的四种模式”中的第三种模式,该模式在systemd-resolved.service 的手册页:
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
答案3
升级到 18.04 后,对我有用的方法是配置文件 /etc/systemd/resolved.conf,将 Domains 参数更改为域(本地或我的情况是 mydomain.local)。我还更改了 DNS 参数,但似乎不相关,但我提到它以防万一情况并非如此。有关更多信息,请访问https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html。
此外,我更改了 avahi 配置(/etc/avahi/avahi-daemon.conf),将服务器部分内的域参数从本地(默认)更改为其他内容,正如一些人在此论坛中指出的那样。
通过上述更改,我可以使用无点名称访问计算机,例如,ping mycomputer 计算机即可成功联系。但是,如果我 ping mycomputer.mydomain.local 则不起作用,因为 FQDN 未按预期解析。
希望这对某些情况有所帮助或带来更通用的解决方案。
答案4
如果有人使用systemd版本 242 或更早版本(Ubuntu 17.04来了和systemd232),systemd-networkd用于网络配置和 DHCP 获取本地域(UseDomains=true
在文件[DHCP]
部分.network
),那么无法解析本地(不一定.local
)域的一个原因可能是错误systemd-networkd DHCP 搜索域选项这使得只有当 DHCP 服务器推送域名时,解析才能起作用强行即即使客户端没有在参数请求列表中要求它。