如何禁用 systemd-resolved 并使用 dnsmasq 解析 DNS?

如何禁用 systemd-resolved 并使用 dnsmasq 解析 DNS?

Ubuntu 16.10+ 用作systemd-resolvedDNS 解析器。

我更喜欢 16.04 使用的设置dnsmasq作为解析器。

我如何在 16.10+ 上,尤其是在 17.04 上做到这一点?

答案1

dnsmasq16.10 和 17.04 版本中仍提供这些软件包。

  1. 安装dnsmasq和依赖项(或者至少下载他们的软件包)禁用systemd-resolved

    sudo apt-get install dnsmasq
    
  2. 禁用systemd-resolved并验证dnsmasq正在运行:

    sudo systemctl stop systemd-resolved
    sudo systemctl disable systemd-resolved
    
    systemctl status dnsmasq
    
  3. 调味dnsmasq。应用设置后,重新启动dnsmasq

    sudo systemctl stop dnsmasq
    sudo systemctl start dnsmasq
    

完成第 2 步后,直到第 3 步完成,您可能仍无法使用系统解析器。您可能需要重新启动网络子系统(或简单地重新启动)才能dnsmasq使用默认配置运行。在我的测试中,添加已知的 DNS 服务器/etc/dnsmasq.conf并重新启动dnsmasq就足以让它在 liveCD 环境中运行。

答案2

除了@quixotic 的回答之外:

确保 /etc/NetworkManager/NetworkManager.conf 中包含以下内容:

[main]
dns=dnsmasq

如果需要添加它,请像这样重新启动 NetworkManager:

sudo systemctl restart NetworkManager

并且/etc/resolv.conf需要是 的符号链接/var/run/NetworkManager/resolv.conf。可以这样做

sudo rm /etc/resolv.conf; sudo ln -s /var/run/NetworkManager/resolv.conf /etc/resolv.conf

答案3

对于 (X)Ubuntu 18.04(请参阅我的在 stackexchange 上回答)。

这是它的副本(我应该复印一份吗?)

这是 (X)Ubuntu 18.04 Bionic 的解决方案。

安装 dnsmasq

sudo apt install dnsmasq

在端口 53 上禁用 systemd-resolved 监听器(不要触碰 /etc/systemd/resolved.conf,因为它可能会在升级时被覆盖):

$ cat /etc/systemd/resolved.conf.d/noresolved.conf 
[Resolve]
DNSStubListener=no

并重新启动它

$ sudo systemctl restart systemd-resolved

(或者通过 完全禁用它$ sudo systemctl disable systemd-resolved.service

删除 /etc/resolv.conf 并重新创建。这很重要,因为 resolv.conf 默认是指向 /run/systemd/resolve/stub-resolv.conf 的符号链接。如果您不删除符号链接,则该文件将在重启时被 systemd 覆盖(即使我们禁用了 systemd-resolved!)。此外,NetworkManager (NM) 会检查它是否是符号链接以检测 systemd-resolved 配置。

$ sudo rm /etc/resolv.conf
$ sudo touch /etc/resolv.conf

禁止 NM 覆盖 /etc/resolv.conf(还有一个 rc-manager 选项,但是它不起作用,尽管手册中有描述):

$ cat /etc/NetworkManager/conf.d/disableresolv.conf 
[main]
dns=none

然后重新启动:

$ sudo systemctl restart NetworkManager

告诉 dnsmasq 从 NM 使用 resolv.conf:

$ cat /etc/dnsmasq.d/nmresolv.conf 
resolv-file=/var/run/NetworkManager/resolv.conf

然后重新启动:

$ sudo systemctl restart dnsmasq

使用 dnsmasq 解析:

$ cat /etc/resolv.conf 
# Use local dnsmasq for resolving
nameserver 127.0.0.1

答案4

根据手册systemd-已解决systemd-resolved 通过三个不同的接口提供名称解析服务:

  1. “systemd-resolved 在总线上公开的功能齐全的 API”
  2. “本地环回接口上 IP 地址为 127.0.0.53 的本地 DNS 存根侦听器”
  3. RFC3493 定义的 glibc getaddrinfo(3) API 及其相关的解析器函数,包括 gethostbyname(3)。此 API 受到广泛支持,包括 Linux 平台之外。但是,其当前形式不公开 DNSSEC 验证状态信息,并且仅是同步的。此 API 由 glibc 名称服务交换机 (nss(5)) 支持。需要使用 glibc NSS 模块 nss-resolve(8) 才能允许 glibc 的 NSS 解析器函数通过 systemd-resolved 解析主机名。

看起来前两个接口不会干扰正常的 DNS 解析,而对我来说问题可能出在第三个接口上。

在手册中nss-解析

要激活 NSS 模块,请在 /etc/nsswitch.conf 中以“hosts:”开头的行中添加“resolve”。具体来说,建议将“resolve”放在 /etc/nsswitch.conf 的“hosts:”行的开头(但在“files”或“mymachines”条目之后),如果存在“dns”条目,则将其放在“dns”条目之前,后跟“[!UNAVAIL=return]”,以确保 DNS 查询始终通过 systemd-resolved(8) 路由(如果正在运行),但如果此服务不可用,则路由到 nss-dns

因此,需要将“dns”放在“host:”行中的“resolve”之前/etc/nsswitch.conf。然后getaddrinfo只需坚持/etc/resolv.conf

此方案仅阻止 systemd-resolved 处理所有 DNS 解析请求,并不局限于特定的网络管理员。同时,它还能确保 LLMNR 和 mDNS 服务正常运行。

(我不太熟悉 Linux 下的名称解析是如何工作的,也不确定我从这些手册中理解了什么。如果我有什么错误,请指出。谢谢 :) )

相关内容