如何避免 dnsmasq 和 systemd-resolved 之间的冲突?

如何避免 dnsmasq 和 systemd-resolved 之间的冲突?

我最近安装了域名解析充当我的本地网络的 DNS 服务器。 dnsmasq 侦听端口 53,该端口已被本地 DNS 存根侦听器使用systemd 解析

只需停止 systemd-resolved,然后在 dnsmasq 运行后重新启动即可解决此问题。但重新启动后它会返回:systemd-resolved 已优先启动,并且 dnsmasq 将不会启动,因为端口 53 已在使用中。

我想,第一个明显的问题是如何最好地让 systemd-resolved 理解它不应该启动本地 DNS 存根侦听器,从而保留端口 53 供 dnsmasq 使用?

然而,一个更有趣的问题是这两种服务通常如何协同工作。它们是否意味着可以并行工作,或者如果使用 dnsmasq,则只是通过 systemd 进行解析?

答案1

作为系统232(2017 年发布)您可以编辑/etc/systemd/resolved.conf(不是/etc/resolv.conf)并添加以下行:

DNSStubListener=no

这将关闭与端口 53 的绑定。确保文件的[Resolve]节标题位于顶部(除非安装损坏,否则应该是这种情况)。

该选项的详细描述见resolved.conf联机帮助页

您可以找到系统运行的 systemd 版本:

systemctl --version

答案2

我刚刚通过删除 /etc/dnsmasq.conf 中行开头的“#”来启用选项“bind-interfaces”。

我能够再次启动 dnsmasq:

  • dnsmasq 在所有接口(包括127.0.0.1)上绑定DNS端口53,
  • systemd-resolv 持续监听 127.0.0。53:53

这次讨论指出了这个解决方案已解决:添加一个选项以禁用存根解析器

答案3

您可以systemd-resolved使用 禁用启动时加载sudo systemctl disable systemd-resolved

如果您想同时运行两者,您可以重定向systemd-resolved以使用本地主机作为主名称服务器。这将确保所有查询在访问外部 DNS 服务器之前都定向到 dnsmasq 进行解析。这可以通过在文件nameserver 127.0.0.1顶部添加行来完成/etc/resolv.conf。这也将禁用 systemd 的本地缓存。

您可以在Arch Linux 维基。我从那里复制了这个,它很好地涵盖了它。

然而,这并不能可靠地避免启动时的错误,即如果 systemd-resolved 碰巧首先启动,dnsmasq 仍然会失败。如果您的版本systemd足够新,请使用答案马尔维尼乌斯。如果您的版本systemd太旧,您可以通过修改 dnsmasq 单元来解决此问题:在 部分中[Unit],添加Before=systemd-resolved.

此后,如果您愿意,可以/etc/dnsmasq-resolv.conf为上游名称服务器创建一个单独的文件并使用-r--resolv-file选项传递它,或者将上游名称服务器添加到 dnsmasq 配置文件并使用-R--no-resolv选项。这样你就只有 localhost /etc/resolv.conf,一切都通过 dnsmasq 进行。

答案4

从 systemd 联机帮助页来看,它并不打算能够手动禁用存根 DNS 服务器。有趣的是,我只是在将 systemd 从 230 升级到 231 后才注意到所描述的问题。

禁用 systemd-resolved 对我来说没有选择,因为我需要它来处理通过 DHCP 接收到的上游 DNS 服务器。

我的解决方案是在启动之前让 dnsmasq 停止 systemd-resolved,然后再启动它。

我在以下位置创建了一个嵌入式配置/etc/systemd/system/dnsmasq.service.d/resolved-fix.conf

[Unit]
After=systemd-resolved.service

[Service]
ExecStartPre=/usr/bin/systemctl stop systemd-resolved.service
ExecStartPost=/usr/bin/systemctl start systemd-resolved.service

这似乎是一个相当黑客的解决方案,但它确实有效。

相关内容