我最近安装了域名解析充当我的本地网络的 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
这似乎是一个相当黑客的解决方案,但它确实有效。