systemd-resolved
作为 DNS 解析器。我更喜欢 16.04 使用的设置,即使用
dnsmasq
作为解析器。在 16.10+ 版本上,特别是在 17.04 上,我该如何做到这一点?
systemd-resolved
作为 DNS 解析器。dnsmasq
作为解析器。dnsmasq
软件包仍然可在16.10和17.04版本中获得。
在禁用systemd-resolved
之前,安装dnsmasq
和依赖项(或至少下载它们的软件包):
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
dnsmasq
与默认配置一起正常工作。在我的测试中,将已知的DNS服务器添加到/etc/dnsmasq.conf
并重新启动dnsmasq
就足以使其在liveCD环境中正常工作。dns=dnsmasq
配置添加到/etc/NetworkManager/NetworkManager.conf
文件中。 - Roberto Tyley[main]
dns=dnsmasq
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
dns=default
,这样就可以正常工作了,因为我是通过NetworkManager定义的名称服务器,而不是在dnsmasq中定义的;这对我来说很有效 - NM通过系统托盘从KDE的NM配置中获取名称服务器的设置。顺便说一下,我在家庭网络上使用固定IP。 - pbhjsudo 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
$ cat /etc/NetworkManager/conf.d/disableresolv.conf
[main]
dns=none
$ sudo systemctl restart NetworkManager
$ cat /etc/dnsmasq.d/nmresolv.conf
resolv-file=/var/run/NetworkManager/resolv.conf
$ sudo systemctl restart dnsmasq
$ cat /etc/resolv.conf
# Use local dnsmasq for resolving
nameserver 127.0.0.1
要激活NSS模块,请在/etc/nsswitch.conf文件中以"hosts:"开头的行中添加"resolve"。具体来说,建议将"resolve"放在/etc/nsswitch.conf的"hosts:"行中的较早位置(但在"files"或"mymachines"条目之后),紧接着是"dns"条目(如果存在),然后是"[!UNAVAIL=return]",以确保DNS查询始终通过systemd-resolved(8)路由,如果该服务正在运行,但如果此服务不可用,则通过nss-dns路由。
所以需要做的是在/etc/nsswitch.conf的"host:"行中使"dns"位于"resolve"之前。然后getaddrinfo
应该简单地遵循/etc/resolv.conf。
这个解决方案只是防止systemd-resolved处理所有DNS解析请求,并不限于特定的网络管理器。它还确保LLMNR和mDNS服务正常运行。
(我对Linux下的名称解析工作不太熟悉,也不确定我从这些手册中理解的是否正确。如果我有什么错误,请指出。谢谢 :))
1.1.1.1
或者8.8.8.8
作为解析器呢? - recolic