Ubuntu 16.10+ 用作systemd-resolved
DNS 解析器。
我更喜欢 16.04 使用的设置dnsmasq
作为解析器。
我如何在 16.10+ 上,尤其是在 17.04 上做到这一点?
答案1
dnsmasq
16.10 和 17.04 版本中仍提供这些软件包。
安装
dnsmasq
和依赖项(或者至少下载他们的软件包)前禁用systemd-resolved
:sudo apt-get install dnsmasq
禁用
systemd-resolved
并验证dnsmasq
正在运行:sudo systemctl stop systemd-resolved sudo systemctl disable systemd-resolved systemctl status dnsmasq
调味
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 通过三个不同的接口提供名称解析服务:
- “systemd-resolved 在总线上公开的功能齐全的 API”
- “本地环回接口上 IP 地址为 127.0.0.53 的本地 DNS 存根侦听器”
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 下的名称解析是如何工作的,也不确定我从这些手册中理解了什么。如果我有什么错误,请指出。谢谢 :) )