升级到 13.10 后,我的 DNS 解析失败。似乎我通过 DHCP(LAN)获得的 DNS 服务器未被使用。
nameserver 8.8.8.8
我可以通过添加来暂时解决问题/etc/resolv.conf
。但是内网主机仍然无法解析。
点击连接信息网络指示器上的菜单项,主 DNS 和辅助 DNS 设置正确。但我的电脑似乎不使用它们。
我的问题是:
- 如果需要的话我应该放什么进去
resolv.conf
? - 如何找出我的计算机正在查询哪些名称服务器?
- 下一步该查看哪里来找出为什么不使用 DHCP 接收的名称服务器?
答案1
首先,您需要了解自 Ubuntu 12.04 以来 Ubuntu 中名称解析的工作方式。
Stéphane Graber 去年在博客上发布了一些相关信息这里。最重要的是要知道 Ubuntu Server 和 Ubuntu Desktop 都使用 resolvconf 来管理文件resolv.conf
。这意味着您不应再/etc/resolv.conf
直接编辑;相反,您应该配置网络接口配置实用程序以向 resolvconf 提供正确的信息。对于 Ubuntu Server,网络接口配置实用程序是伊夫普该文件用于配置/etc/network/interfaces
。Ubuntu Desktop 的网络接口配置实用程序是网络管理器。这就是你正在使用的。
NetworkManager 通过以下方式配置网络指示器 > 编辑连接。但是,对于由 DHCP 配置的网络接口,通常不需要手动更改任何设置。通常情况下,(远程)DHCP 服务器会向 NetworkManager 提供本地接口的 IP 地址和要使用的(远程)DNS 名称服务器的地址。NetworkManager 会启动一个转发名称服务器的实例,该实例在 127.0.1.1 处进行本地侦听。此地址 127.0.1.1 被发送到 resolvconf,后者会放入nameserver 127.0.1.1
。NetworkManager/etc/resolv.conf
还会将 DHCP 提供的 DNS 名称服务器的(远程)IP 地址提供给转发名称服务器。因此,在本地系统上运行的程序会要求解析器将主机名转换为 IP 地址;解析器查询位于 127.0.1.1 的本地转发名称服务器;转发名称服务器查询已告知的远程名称服务器,收到答复并将其发回上链。
NetworkManager 通过 D-Bus 与转发名称服务器进程进行通信。您可以通过运行以下命令查看 NetworkManager 告诉转发名称服务器的内容
nmcli dev list iface eth0 | grep IP4.DNS
根据评论进行更新:
请注意,resolvconf 实际上会将文件写入应该是符号链接/run/resolvconf/resolv.conf
的文件。如果不是符号链接,则需要重新创建它。为此,您可以运行/etc/resolv.conf
/etc/resolv.conf
sudo dpkg-reconfigure resolvconf
或者
sudo ln -sf /run/resolvconf/resolv.conf /etc/resolv.conf
答案2
我按照以下链接的建议进行了更改(禁用 dnsmasq)。现在一切都很顺利! http://www.ubuntugeek.com/how-to-disable-dnsmasq-in-ubuntu-12-04precise.html
打开/etc/NetworkManager/NetworkManager.conf
文件。
sudo gedit /etc/NetworkManager/NetworkManager.conf
注释掉以下行:
#dnsmasq deactivated
#dns=dnsmasq
答案3
编辑 2:上一篇帖子被管理员删除了,我发布了我找到的解决方案。对此深表歉意。
编辑:我刚刚找到答案,它就在这个页面上 - 抱歉我的眼花了。我在下面发布了我的发现,扩展了本页中 Richard Lindstedt 的正确答案。我留下了我早先的抱怨,以便提供一些背景信息。请为 Richard 的答案点赞,他值得点赞。
事实上这真的很容易。
只需打开你的接口配置文件 --> sudo vi /etc/network/interfaces
这肯定对 OP 没有帮助,现在对我也没什么帮助。我们不需要静态地址,我们想要使用 DHCP 服务器发送给我们的地址。NetworkManager 似乎可以识别它们,但 Ubuntu 却直接忽略了它们:
# nmcli dev list iface wlan0 | grep IP4.DNS
IP4.DNS[1]: 10.*.*.*
IP4.DNS[2]: 10.*.*.*
IP4.DNS[3]: 8.8.8.8
但...
# dig microsoft.com
; <<>> DiG 9.9.5-4.3-Ubuntu <<>> microsoft.com
;; global options: cmd
;; connection timed out; no servers could be reached
我的 /etc/network/interfaces 是:
auto lo
iface lo inet loopback
这有点奇怪,我希望所有接口都在这里声明(或者我遗漏了什么?)。
简而言之:
- 我没有弄乱任何文件
- 我已经跑了
dpkg-reconfigure resolvconf
- 正确的符号链接已到位
- NetworkManager 从 DHCP 检索正确的 DNS 服务器
- Ubuntu 不使用此类地址
- 解决方法是将固定的 8.8.8.8 放在 /etc/network/interfaces 上,但我并不想这样做
- 我想在任何情况下都使用 DHCP 提供的 DNS 服务器。
没有打开另一个线程,因为这是一个确切的问题,只是我现在使用的是 14.10(但自从从 12.10 升级到 13.04 以来,这个问题一直困扰着我)。
解决方案
最后这句话让我走上了正确的轨道,直到那时我才注意到理查德的回答。
dnsmasq
问题似乎与冲突的和软件包有关resolvconf
。直到 12.10 版本,dnsmasq
仍在使用。从 13.04 版本开始,Ubuntu 似乎切换到 dnsmasq/resolvconf 混合版本,您已安装软件包dnsmasq-base
和resolvconf
,但没有安装dnsmasq
其本身。
我不能说这是否是 13.04 升级脚本中的错误或其他什么,因为在升级(如全新安装)时,会安装 resolvconf,升级 dnsmasq-base 并且(正确地)卸载 dnsmasq。
问题是,升级脚本未能注释掉dns=dnsmasq
中的行/etc/NetworkManager/NetworkManager.conf
。因此,即使 dnsmasq 守护进程不再存在于系统中,/etc/resolv.conf 仍然期望它存在。
答案4
我正在使用 Pop!OS,但我认为我的解决方案也适用于 Ubuntu 用户。对我来说涉及 2 个问题。
首先,systemd-resolved
没有配置使用 mdns。因此,应通过编辑/etc/systemd/resolved.conf
并启用选项 来启用此功能MulticastDNS=yes
更改后必须重新启动 systemd-resolved。
systemctl restart systemd-resolved.service
然后检查配置是否已更新
systemd-resolve --status
应该
Global
LLMNR setting: no
MulticastDNS setting: yes
但是如果你检查特定的接口,它将禁用多播。
Current Scopes: none
DefaultRoute setting: no
LLMNR setting: yes
MulticastDNS setting: no
DNSOverTLS setting: no
DNSSEC setting: no
问题是,无法从(至少我的) UI 网络接口配置器启用 MulticastDNS,因此您必须执行nmcli
命令行配置。
nmcli connection edit enp4s0
您对属性 connection.mdns 感兴趣,您可以通过以下方式获取更多信息
describe connection.mdns
所以
set connection.mdns reslove
(或者你喜欢什么都可以)
那么
save persistent quit
现在 mdns 应该可以运行了