由resolvconf和NetworkManager设置的错误名称服务器。

我的DNS服务器是192.168.1.152

这个DNS由DHCP提供给客户端。我的局域网上的Windows客户端可以正确解析使用该DNS的名称,但我的Ubuntu虚拟机不能。

虚拟机已经设置为桥接网络,并且已经正确地提供了DNS服务器,但是我的本地主机名无法通过nslookup或浏览器解析。

这是我一个本地域名的nslookup

# nslookup unraid.local
Server:     127.0.0.53
Address:    127.0.0.53#53

** server can't find unraid.local: SERVFAIL

这是通过使用我的DNS服务器应该解析的内容。
# nslookup unraid.local 192.168.1.152
Server:     192.168.1.152
Address:    192.168.1.152#53

Name:   unraid.local
Address: 192.168.1.152

/etc/resolv.conf的nameserver设置有误:

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
# 127.0.0.53 is the systemd-resolved stub resolver.
# run "systemd-resolve --status" to see details about the actual nameservers.

nameserver 127.0.0.53

我运行了那个命令。在DNS服务器下面,令人困惑的是,它指定了正确的服务器(以及我的默认网关)。
root@ubuntu:~# systemd-resolve --status
Global
          DNSSEC NTA: 10.in-addr.arpa
                      16.172.in-addr.arpa
                      168.192.in-addr.arpa
                      17.172.in-addr.arpa
                      18.172.in-addr.arpa
                      19.172.in-addr.arpa
                      20.172.in-addr.arpa
                      21.172.in-addr.arpa
                      22.172.in-addr.arpa
                      23.172.in-addr.arpa
                      24.172.in-addr.arpa
                      25.172.in-addr.arpa
                      26.172.in-addr.arpa
                      27.172.in-addr.arpa
                      28.172.in-addr.arpa
                      29.172.in-addr.arpa
                      30.172.in-addr.arpa
                      31.172.in-addr.arpa
                      corp
                      d.f.ip6.arpa
                      home
                      internal
                      intranet
                      lan
                      local
                      private
                      test

Link 2 (ens33)
      Current Scopes: DNS LLMNR/IPv4 LLMNR/IPv6
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 192.168.1.152
                      192.168.1.1

我不想在配置文件中“硬编码”DNS服务器的IP地址,因为当我更改网络时,我将无法解析。
如何让resolvconf和NetworkManager自动设置DHCP服务器的IP地址在/etc/resolv.conf中?
13个回答


2这个解决方案在某种程度上起作用,host和nslookup命令可以正确解析名称,但是wget和浏览器不能。 - FireSpore
1这是正确的...当前的问题是/etc/resolv.conf链接来自/run/systemd/resolve/stub-resolv.conf,这是个错误,它应该是/run/systemd/resolve/resolv.conf。请注意,无论哪种情况下都不存在/etc/resolv.conf文件。 - Mr Heelis
@FireSpore:ping可以工作吗?hostnslookup在解析主机名时与pingwget有所不同。你可能需要查看/etc/nsswitch.conf来找到解决方案。 - HongboZhu
2不是使用“重启”命令,而是使用“service systemd-resolved restart && sudo systemctl restart networking”命令可以解决我的问题。 - Ben Mares
即使没有重新启动,它对我也起作用了。 - Afshin
对我来说并不是一个解决办法 - 现在我只是更快地无法解析名称! - levitopher

尝试编辑 /etc/systemd/resolved.conf 文件,添加您所期望的 DNS 服务器:
将以下内容更改为:
[Resolve]
#DNS=

根据您的喜好选择以下内容(这只是一个示例):

[Resolve]
DNS=192.168.1.152

重启服务之后:
service systemd-resolved restart

当你检查状态时,你应该看到
$ systemd-resolve --status
Global
         DNS Servers: 192.168.1.152

      DNSSEC NTA: 10.in-addr.arpa
                  16.172.in-addr.arpa
                  168.192.in-addr.arpa
                  17.172.in-addr.arpa
                  18.172.in-addr.arpa
                  19.172.in-addr.arpa

这是在更改/etc/systemd/resolved.conf后的systemd-resolve --status输出。https://pastebin.com/AeUFQkyB浏览器仍然无法解析名称。 - FireSpore
23systemd太烂了。DHCP会告诉主机应该使用什么DNS(以及一堆其他网络设置),你不需要修改主机上的任何文件才能使其正常工作。 - teknopaul
5看起来不太理想,每次更改DNS服务器/网络都需要这样做。 - Victor
4每次DNS IP发生变化(例如在不同的网络上),您都需要重新配置。 - Victor

我最终找到了Ubuntu 17.10的问题解决方案。默认情况下,这个版本的Ubuntu使用systemd-resolved,希望它在接下来的版本中能够稳定。

为了使用自定义dns而不是本地的systemd-resolved缓存,请按照以下步骤操作:

  1. 添加新的nameservers。作为sudoer编辑/etc/systemd/resolved.conf文件。这里我已经注释掉了DNS条目并放置了我的dns [Resolve] DNS=10.96.0.10 8.8.8.8 8.8.4.4

  2. 取消实际到/etc/resolv.conf的符号链接

  3. 创建一个新的符号链接sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
  4. 重启服务sudo service systemd-resolved restart
  5. 重新启动网络管理器sudo systemctl restart networking

现在,如果您查找由您添加的dns提供的名称,您应该会看到记录已解析dig nexus.default.svc.cluster.mydomain

最后一步是更新/etc/nsswitch.conf中的解析顺序,将dns放在mdns4_minimal之前。
hosts           files dns mdns4_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] myhostname

1每次DNS IP更改(例如在不同网络上),您都需要重新配置。 - Victor
维克多,你有没有最好的解决方案?如果你使用静态网络配置,效果是一样的。 - Fabio Fumarola
这个答案适用于静态和动态配置:https://askubuntu.com/a/974482/343617 - Victor
谢谢,我指出的解决方案是静态的。我同意。 - Fabio Fumarola
这在我新安装的18.04上刚刚起作用。 - JamesCW
这对我在Linux Mint 19.1的全新安装上也起作用了。 - Ismail Cherri
好消息是,现在已经是2021年了,但systemd-resolved仍然不稳定。 - Salem F
这是对我有效的方法 - 只是切换链接并不起作用。但无论我连接到哪个本地网络,8.8.8.8 都应该是可访问的,对吗? - levitopher
这个对我来说是根据评论时间戳的工作。赞! - Rahul

你的/etc/resolv.conf不是问题所在。systemd-resolved默认为未配置,因此它无法执行任何查找。随意抱怨未配置与合理默认值之间的区别。
请手动向systemd-resolved添加名称服务器。 (根据Olorin评论下面的编辑,添加mkdir命令以及正确的路径/etc而不是/lib,以便在系统更新后保持可用)
sudo mkdir -p /etc/systemd/resolved.conf.d
sudo nano /etc/systemd/resolved.conf.d/00-my-dns-server-is.conf

地址:

[Resolve]
Cache=yes
DNS=192.168.1.152

然后...
sudo systemctl daemon-reload

systemd-resolved很聪明,但是由于软件包维护者没有进行配置,它看起来就像个傻瓜,因为软件包维护者不相信合理的默认设置。我们可以在其中放入13个互联网根服务器,也可以选择10个OpenNIC服务器:https://pastebin.com/JBfYVVtG 或者三个通过namebench测量得出的最快的OpenNIC服务器。当然还可以加上ISP的域名服务器和Google。 systemd-resolved并不是问题所在,问题在于我自己。


1虽然你可能不想编辑/usr/lib目录下的文件,因为它们在软件包升级时很可能会被覆盖。我认为最好的方法是在/etc/systemd目录中找到相应的文件(管理员已经可以编辑/etc/systemd/resolved.conf文件)。 - Olorin
1人解决了.conf.d,带着d的,是的,/etc/systemd/resolved.d 是位置。我注意到我们经常需要 mkdir /etc/[路径].d。bob@laptop l /etc/systemd/resolved.conf.d ls: 无法访问 '/etc/systemd/resolved.conf.d':没有那个文件或目录 - BobDodds
这看起来非常有希望,但我的系统仍在使用/etc/resolv.conf (/run/systemd/resolve/stub-resolv.conf)。我尝试了/etc/systemd/resolved.conf.d和/etc/systemd/resolved.d,我的/etc/systemd/resolved.conf也配置了正确的DNS服务器,但是/run/systemd/resolve/stub-resolv.conf没有更新,而且似乎只有这个文件被使用。(我还在netplan yaml文件中设置了dhcp4-overrides: use-dns: no,暂时需要将/etc/resolv.conf链接到/run/systemd/resolve/resolv.conf。不确定是否有遗漏,但真的希望能找到一个合适的解决方案。 - Sruli

在我的系统上,我发现了一个坏的符号链接:/etc/resolv.conf 是一个指向 /run/systemd/resolve/stub-resolv.conf 的符号链接。
这个文件只包含一行:
nameserver 127.0.0.53#53

作为结果,本地网络的DNS查找经常出现问题。
因此,我改变了/etc/reolv.conf,将其指向/run/systemd/resolve/resolv.conf 现在可以正常工作了。

对我有效的解决方案是在我的博客上发布的这里
使用nano编辑器来编辑这两个文件。
nano /etc/resolv.conf
nano /etc/resolvconf/resolv.conf.d/head

添加您想要使用的DNS服务器
nameserver 9.9.9.9
nameserver 127.0.0.1

然后重新启动服务。
service systemd-resolved restart

最后检查:
cat /etc/resolv.conf

进行nslookup
nslookup google.com 

我刚刚使用了这个方法,成功解决了我家里笔记本电脑的问题。但是将来如果我离开家庭网络,我可以预见到会出现问题,因为主要和次要的DNS服务器仍然是我的家庭服务器,它们具有局域网地址。

2每次 DNS IP 发生变化时(例如在不同网络上),您都需要重新配置。 - Victor
虽然不太优雅,但有时候gcloud会破坏我的睡眠。 - digoferra
编辑/etc/resolv.conf不起作用,因为在systemd-resolved重新启动期间,该文件将被覆盖。只需编辑/etc/systemd/resolved.conf即可。请参阅我在这里的答案:https://askubuntu.com/questions/977243/ubuntu-17-10-disable-netplan/1037288 - EnzoR

我编写了一个脚本,解决了Netplan目前不支持替代DHCP提供的DNS服务器和域搜索顺序的问题。它创建了Netplan yaml文件,并配置systemd-resolved以按预期工作。
################## Start Netplan config (renderer: NetworkManager)
#  Some useful commands for customisation
# NetConn=$(nmcli device show|grep GENERAL.CONNECTION|head -n1|awk '{print $2}')
# IP=$(nmcli device show|grep IP4.ADDRESS|head -n1|awk '{print $2}')
# GATEWAY=$(nmcli device show|grep IP4.GATEWAY|head -n1|awk '{print $2}')
# sed -i 's/renderer: networkd/renderer: NetworkManager/' //etc/netplan/01-netcfg.yaml
######################################
systemctl start NetworkManager
NIC=$(nmcli device show|grep GENERAL.DEVICE|head -n1|awk '{print $2}')

#####   create Netplan yaml config file
cat >/etc/netplan/01-netcfg.yaml <<EOF 
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
  network:
   version: 2
   renderer: NetworkManager
   ethernets:
EOF
echo "    ${NIC}:" >> /etc/netplan/01-netcfg.yaml
cat >>/etc/netplan/01-netcfg.yaml <<EOF
      dhcp4: yes
      nameservers:
        search: [abc.domain.edu, def.domain.edu]
        addresses: [10.10.11.22, 10.10.11.23]

EOF

#work around DNS resolv bug
systemctl stop systemd-resolved
sed -i 's/#DNS=/DNS=10.10.11.22 10.10.11.23/' /etc/systemd/resolved.conf
sed -i 's/#Domains=/Domains=abc.domain.edu def.domain.edu' /etc/systemd/resolved.conf
systemctl start systemd-resolved
systemctl restart NetworkManager
netplan apply
reboot
############### End Netplan Config

很奇怪,但在Ubuntu 18.04上为我工作的唯一解决方案是我在这里找到的:

首先,通过设置所需的nameserver更改/etc/resolv.conf

# nano /etc/resolv.conf

例如,设置如下:
nameserver 8.8.8.8

然后执行

# chattr +i /etc/resolv.conf

这将保护/etc/resolv.conf文件,以防止任何人修改它,包括root用户。

使用cat命令查看/etc/resolvconf/run/interface/*文件,如果有任何你不想要的内容,请稍后使用vi命令进行注释。

你是不是指的是 cat /etc/resolvconf/interface-order ?你也可以用你喜欢的文本编辑器,比如说 vi,稍后对其进行注释。 - jmarina
是的,你抓住我了...但经过一些测试,我意识到问题不是因为resolvconf,而是由dhcpcd生成的,所以我编辑了/etc/dhcpcd.conf文件,并取消了以"static domain_name_servers"开头的那行注释,并设置了一些以空格分隔的IP地址。 - Alex Lee

我只能通过完全禁用systemd-resolved来使Docker的名称解析工作。
systemctl stop systemd-resolved
systemctl disable systemd-resolved

然后像在没有systemd的时代一样编辑/etc/resolv.conf。