16.10无法解析DNS。

升级我的16.04安装到16.10后,我在DNS方面遇到了问题。
首先,在连接WiFi时几次遇到问题,而通过以太网连接则正常工作。现在似乎WiFi也可以正常工作了。不确定为什么,也不确定它是否与我现在面临的问题有任何关联:
当使用Cisco Anyconnect VPN连接到VPN主机时,它会在'/etc/resolv.conf'中添加一行。我知道Ubuntu现在正在使用systemd-resolve,手册上说有三种不同的处理/etc/resolv.conf的模式。我的/etc/resolv.conf不是一个符号链接,并且没有将127.0.0.53列为DNS服务器,所以据我理解,systemd-resolved应该“读取它以获取DNS配置数据”。然而,它似乎并不关心它。

dig

奇怪的是,对我来说,dig host.customer.tld返回了一个很好的答案,其中包含了所请求主机的IP,并将其引用为由VPN客户端添加到/etc/resolv.conf的DNS服务器。当VPN连接被禁用时,我得不到任何答案。也就是说,dig读取/etc/resolv.conf
另一方面,浏览器无法访问/etc/resolv.conf,也无法解析主机名。同样,ping/curl也无法解析。
我找到了一个相关帖子,并尝试运行。
nmcli device show <interfacename> | grep IP4.DNS

但它没有为cscotun0设备列出任何DNS。(尽管在16.04中也没有。)此外,nmcli将我的DHCP服务器(我的路由器)列为我的eth/wlan连接的IP4.DNS主机。对于任何公共域名,使用dig @192.168.0.1 xxx都可以正常工作。

配置

在我的/run/systemd/resolve/resolv.conf中还列出了一些其他DNS服务器。

nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 2001:4860:4860::8888
# Too many DNS servers configured, the following entries may be ignored.
nameserver 2001:4860:4860::8844

这些不是由我的DHCP服务器提供的。文件/etc/systemd/resolved.conf只包含了被注释掉的行,除了部分标题。
[Resolve]
#DNS=
#FallbackDNS=8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844

DNS= 一个以空格分隔的IPv4和IPv6地址列表,用作系统DNS服务器。 ... 出于兼容性原因,如果未指定此设置,则使用/etc/resolv.conf中列出的DNS服务器(如果该文件存在并配置了任何服务器)。此设置默认为空列表。

FallbackDNS= 一个以空格分隔的IPv4和IPv6地址列表,用作备用DNS服务器。从systemd-networkd.service(8)获取的每个链接的DNS服务器优先于此设置,以及通过上述DNS=或/etc/resolv.conf设置的任何服务器。因此,只有在没有其他DNS服务器信息时才使用此设置。如果未提供此选项,则使用编译的DNS服务器列表

在我的情况下,似乎备用DNS最终会出现在/run/systemd/resolve/resolv.conf中。

编辑:我不确定问题是什么,老实说,我还不太清楚这个是如何工作的,但至少在我的情况下,解决方案是禁用systemd-resolved服务。我原以为这个服务是必需的,它是为所有本地应用程序提供DNS服务的组件,但显然还有其他东西在那里完成这项工作。

如果您没有使用VPN,是否遇到DNS的问题? - Mark Stosberg
你试过这个解决方案吗?它可能适用于16.04版本的AnyConnect问题。点击此处查看详情。 - Mark Stosberg
我在安装后的WiFi上遇到了DNS问题,但不知怎么回事它开始正常工作了... VPN也曾经成功连接过一次,但我不知道为什么。然而,现在主要的问题似乎是/etc/resolv.conf中的添加内容没有被考虑进去。 - aweibell
我还没有尝试过那个手动构建的变通方法。看起来那里提到的版本与现在仓库中的版本相比相当古老。 - aweibell
并不是每个人都高兴看到Ubuntu使用systemd-resolved:https://lists.dns-oarc.net/pipermail/dns-operations/2016-June/014964.html - aweibell
3只是想提一下,我在16.10版本上也遇到了与Anyconnect完全相同的问题。多次连接到VPN服务似乎可以暂时解决,但在某个时候,DNS又再次无法工作。 - jmartinez
2我遇到了与16.04不同的类似DNS解析问题。我的建议是首先备份并删除/etc/resolv.conf;卸载resolvconf软件包;重新启动;使用dig、systemd-resolve测试有无VPN来查看哪些工作正常,哪些不正常。 - philcolbourn
1请比较一下这个错误报告:https://bugs.launchpad.net/ubuntu/+source/systemd/+bug/1624317 - jdthood
@philcolbourn 卸载 resolvconf?aptitude 建议用 openresolv 代替它?我可以不安装任何一个吗? - aweibell
systemd-resolve在/run/systemd/resolve/resolv.conf中建立了一个实时的resolv.conf文件,systemd-resolved手册建议将/etc/resolv.conf链接到该文件。 - philcolbourn
@philcolbourn 我知道,但即使我链接到那个,VPN客户端会重命名链接并添加一个新的/etc/resolv.conf,而操作系统似乎不使用它。 - aweibell
@aweibell,那么是什么在改变/etc/resolv.conf文件呢?我的文件因为我正在尝试而变得“错误”,但是连接到PIA的VPN并没有改变/etc/resolv.conf的符号链接。 - philcolbourn
我猜应该是VPN客户端在修改/etc/resolv.conf之前“友好地”备份了旧版本。 - aweibell
sudo systemctl disable systemd-resolved.service 对我来说似乎运行正常。 - jmartinez
那对我来说没有改变任何事情。Anyconnect VPN客户端仍然用一个包含VPN DNS参考的文本文件替代符号链接。 - aweibell
4个回答

当我在ubuntuforums上遵循一个建议时,OpenVPN连接期间的DNS行为立即得到了改善:

  1. 使用具有root权限的编辑器打开/etc/NetworkManager/NetworkManager.conf
  2. 删除(或使用哈希符号#注释掉)包含dns=dnsmasq的行。
  3. 通过sudo service NetworkManager restart重新启动NetworkManager。

谢谢。我刚试了一下,但没有成功。实际上,DNS运行正常,除非我启动Cisco VPN客户端,它会用一个纯文本文件替换符号链接/etc/resolve.conf。 - aweibell
1这个修复方法对我有效,我在使用OpenVPN时遇到了DNS问题。在进行了这个更改之后,我的/etc/resolve.conf文件发生了变化。这非常奇怪,因为我甚至没有安装dnsmasq。 - postfuturist
这可能适用于NM和openvpn的问题,但至少会减慢连接速度。就像在这里所猜测的那样。 - BairDev

我遇到了类似的问题,例如添加额外的USB wifi dongle时。 首先,我按照上面所述的方法在networkmanager中禁用了dnsmasq,并停止了dnsmasq(service dnsmasq stop)。
我注意到,在我的VPN连接过程中,当解析出现故障时,路由表看起来略有不同(route命令的输出)。 网关的名称在无法工作时是DD-WRT,在工作时只是'gateway'。 这个输出没有改变:
nmcli device show wlp1s0 | grep IP4.DNS

它一直显示我的路由器IP地址。 一个临时解决办法是重新启动systemd-resolvd,这样它就能正常工作一段时间。
sudo service systemd-resolved restart

由于dnsmasq不在问题范围内,要么是systemd-resolvd引起了问题,要么是任何改变路由表的东西。
所以这是我看到的唯一区别:
ubuntu@ubuntu-Lenovo-Yoga-2-11:~$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    601    0        0 

这是工作的情况。 这是在它不工作的时候:
ubuntu@ubuntu-Lenovo-Yoga-2-11:~$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         DD-WRT          0.0.0.0         UG    601    0        0 wlp1s0

VPN线路上的同名差异问题:
vpn-dns.name gateway         255.255.255.255 UGH   0      0        0 wlp1s0

谁知道可能会影响路由表的因素呢? 如果我们能够确定这一点,那就可以提交一个错误报告了。 我已经厌倦了追踪所有这些错误,但我希望能够修复它们,这样未来的用户和我们都会很开心 :)。
[更新] 似乎停止 systemd-resolved 可能会解决这个问题,并且不会对其他东西产生负面影响。你可以尝试一下,如果它破坏了某些东西,请告诉我。 当我在调试时运行 systemd-resolvd 时,它出现了故障。
Removing scope on link wlp1s0, protocol llmnr, family AF_INET
Removing scope on link wlp1s0, protocol llmnr, family AF_INET6
Removing scope on link *, protocol dns, family *

禁用方法:
sudo systemctl disable systemd-resolved.service

我已经更新了Ubuntu报告,并提出了一些建议。 [更新] 附加说明:错误报告: https://bugs.launchpad.net/ubuntu/+source/systemd/+bug/1624317 对于某些问题,17.04版本有一个补丁。 请查看错误报告,如果可能的话,请测试该补丁。谢谢! [/更新]
请查看上述提到的错误报告,问题似乎已经在17.10版本中解决,并且通过一个简单的命令可以禁用DNS泄漏。 [/更新]

非常感谢你详尽的报告!我注意到路由表中有一些不同的变化,可能是因为我的 VPN 动态地添加了很多路由,随着它们的使用而变化。然而,禁用 systemd-resolved 对我的问题也非常有效! - aweibell
我认为最终路由表中的名称并不重要,问题在于 systemd-resolved 在某种程度上搞乱了 DNS 解析。我还不得不禁用 dnsmasq 服务以防止其启动,但现在一切都正常工作了。 希望有人能够修复这些包之间正确的依赖关系,以使它们能够正确地协同工作。这个问题真的很烦人。 - Vincent Gerris
值得注意的是,我花了整整一天的时间来解决这个问题,重新启动systemd-resolved服务对我没有任何帮助,但是完全禁用它后,问题就解决了! - fd8s0
再次强调一下,自从我从16.10升级到17.04以来,我的网络问题已经持续了几天。我尝试了这里的大多数解决方案,大部分都能暂时解决问题,但之后问题又会出现。最终有效的方法是使用sudo systemctl disable systemd-resolved.service禁用systemd-resolved,并在/etc/resolv.conf中将DNS设置为8.8.8.8。 - Japheth Ongeri - inkalimeva
这个简单的命令解决了我的问题:sudo service systemd-resolved restart,谢谢! - Sergio Abreu
请查看我为17.10版本发布的选项的错误报告! - Vincent Gerris

遇到了同样的问题。不知怎么回事,我可能是在安装某个应用程序时安装了DNSmasq。只需简单地移除dnsmasq就解决了我的问题。
sudo apt-get remove dnsmasq 

从那时起,再也没有断开连接或某些网站无法加载的问题了(我在加载Gmail时遇到了问题,突然间无法连接到Gmail,尽管其他网站都能正常访问)。

尝试移除 dnsmasq-base 软件包时,aptitude 告诉我它是 network-managerubuntu-fan 所需的,并且移除它将导致许多其他软件包被删除。 - aweibell
什么发行版和版本?我使用的是Ubuntu 16.10,没有任何问题可以删除它。否则我就不会发布这个帖子 :) - Nitai
我也在Ubuntu 16.10上!奇怪。apt remove dnsmasq-base ... 将删除以下软件包: account-plugin-ubuntuone checkbox-converged checkbox-gui dnsmasq-base indicator-network network-manager network-manager-gnome network-manager-openconnect network-manager-openconnect-gnome network-manager-openvpn network-manager-openvpn-gnome network-manager-pptp network-manager-pptp-gnome network-manager-vpnc pay-service plainbox-provider-checkbox plainbox-provider-resource-generic ubuntu-desktop ubuntu-fan ubuntu-push-client .... - aweibell
我也是一样,16.10版本也想要删除所有其他的软件包。 - Dave Kincaid
前几天我又遇到了一次断连问题。不知怎么回事,某个应用程序似乎重新安装了dnsmasq。无论如何,这次我直接通过systemd将其禁用了。目前为止,它已经停止运行了,而且我也没有再遇到任何断连问题。 - Nitai
@aweibell:我认为你无法删除那个软件包,但如果你只有一个名为'dnsmasq'的软件包,那么它应该是可以移除的。考虑到依赖关系,最好的办法是暂时禁用它。希望Ubuntu开发人员能够查看并确定需要包含和启用的软件包集合。 - Vincent Gerris
太棒了!这是一个对我来说完美运作的解决方案。在我的情况下,我试图连接到我的工作VPN,但是没有一个VPN主机是可达的,这是因为DNS解析失败;使用它们的IP地址进行访问却起作用了。所以我找到了这篇关于OpenVPN的文章和你的SE回答!现在我的VPN工作得非常好 :-) - asgs

编辑 /etc/nsswitch.conf 文件并进行修改。
hosts:          files mdns4_minimal [NOTFOUND=return] dns

hosts:          files dns mdns4_minimal [NOTFOUND=return]

编辑:

我遇到了同样的问题很长一段时间。我能够从VPN解析域名,但是无法ping或curl它们,也无法在其他应用程序中使用它们。上述描述的更改对我解决了这个问题。