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


Answers:


35

dnsmasq 软件包仍在16.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环境中工作。


很好的答案,并且似乎是禁用NetworkManager时唯一的解决方案!
bogl

3
对我来说,这是一个很好的答案,但还需要dns=dnsmasq/etc/NetworkManager/NetworkManager.conf
@blabla

同样在这里。在努力解决systemd-resolved和无限制地切换到dnsmasq之后,Ubuntu 17.10上实现了成功。我确实必须使用blabla的附加功能。
阿尔贝托·L·邦菲利奥

17

除了@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

实际上,我将其设置为dns=default,并且工作正常,因为我有一个名称服务器,然后由NetworkManager定义,而不是在dnsmasq中定义。这对我有用-NM通过系统托盘从KDE的NM配置中进行的设置获取名称服务器。我在家庭网络FWIW上使用固定IP。
pbhj

1
这一步是@quixotic对我的回答的必要补充(ubuntu 17.04,完整安装,而不是LiveCD)。
罗伯托·泰利

0

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

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

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

nss-resolve手册中:

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

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

此解决方案仅阻止systemd-resolved处理所有DNS解析请求,并且不限于特定的网络管理器。并且还可以确保LLMNR和mDNS服务正常运行。

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


0

对于(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)还会检查它是否是检测系统解析的配置的符号链接。

$ 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.