Answers:
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环境中工作。
dns=dnsmasq
/etc/NetworkManager/NetworkManager.conf
除了@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。
根据systemd-resolved的手册,systemd-resolved通过三个不同的接口提供名称解析服务:
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 :))
对于(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