nameserver 127.0.1.1 在 resolv.conf 中无法消失!

我已经阅读过,只有在我的机器有自己的DNS服务器时,才应该在我的/etc/resolv.conf文件中使用nameserver 127.0.1.1。由于它没有,使用它会引起问题。但是,无论我做什么,都无法摆脱它!到目前为止,我所做的事情如下:
  1. 将nameserver 192.168.1.3添加到/etc/resolvconf/resolv.conf.d/base文件中。 (192.168.1.3是我们网络的DNS)。
  2. 运行:sudo resolvconf --enable-updates。
  3. 运行:sudo resolvconf -u。
  4. 运行:sudo service network-manager restart(只是为了确保)。
然而,当我打开/etc/resolv.conf文件时,它仍显示nameserver 127.0.1.1!有人知道出了什么问题吗?
请注意,实际上应该是127.0.1.1!我不知道为什么不是127.0.0.1
即使我手动更新/etc/resolv.conf并将其更改为其他任何内容,sudo resolvconf -u也会将其恢复为127.0.1.1!这个地址是从哪里来的?
4个回答

NetworkManager是一个程序,通过resolvconf实用程序将地址127.0.1.1插入到resolv.conf中。只有在配置为启动dnsmasq程序作为本地转发名称服务器的实例时,NM才会插入该地址。该dnsmasq实例在地址127.0.1.1上监听查询。
如果您不想使用本地转发名称服务器,则配置NetworkManager不启动dnsmasq实例并且不插入该地址。在/etc/NetworkManager/NetworkManager.conf中注释掉dns=dnsmasq这一行。
sudo nano /etc/NetworkManager/NetworkManager.conf

[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq

重新启动NetworkManager服务。
sudo service network-manager restart

在这种模式下,NetworkManager通过resolvconf更新/etc/resolv.conf文件,以包含NetworkManager对活动连接的名称服务器地址。
如果您想禁用resolvconf机制来更新resolv.conf,并只使用静态的resolv.conf文件,请按照以下步骤操作。
sudo rm -f /etc/resolv.conf  # Delete the symbolic link
sudo nano /etc/resolv.conf   # Create static file

# Content of static resolv.conf
nameserver 8.8.4.4
nameserver 8.8.8.8

我有3个DNS,如果我禁用dnsmasq,查询永远不会到达第三个。有什么建议吗?我想先查询Google,然后再查询内部网络的DNS。谢谢。 - JorgeeFG
3重新启动network-manager在Xenial上无效,因为它使用systemd而不是upstart。请尝试使用systemctl restart network-manager - Matthias Weiler
我的问题是dnsmasq程序会询问哪个DNS服务器?它会向DHCP的DNS服务器询问主机IP地址查询吗? - Clock ZHONG
我安装了dnsmasq,然后又将其移除,并且注释掉dnsmasq的那一行似乎解决了我遇到的分辨率问题。 - dw1

可能是resolvconf配置不正确。如果你在没有真正理解resolvconf和NetworkManager工作原理的情况下修改了它的配置文件,那么这种情况很有可能发生。
请阅读resolvconf文档和Stéphane Graber的博客文章获取更多背景信息。

https://www.stgraber.org/2012/02/24/dns-in-ubuntu-12-04/

首先,你应该知道Ubuntu桌面版和Ubuntu服务器默认都安装并激活了resolvconf。Resolvconf提供了一种有序和可逆的方式来动态更新/etc/resolv.conf文件的框架。
其次,你应该知道Ubuntu桌面版默认安装并激活了NetworkManager。默认情况下,NetworkManager启动一个dnsmasq实例作为本地转发域名服务器。这个由NetworkManager控制的dnsmasq实例监听127.0.1.1的查询。当NetworkManager启动dnsmasq实例时,它会告诉resolvconf将地址127.0.1.1插入resolv.conf。正如另一个答案中提到的,如果你配置NetworkManager不启动本地转发域名服务器实例,它将不会启动本地转发域名服务器,并且不会告诉resolvconf将地址127.0.1.1插入resolv.conf。
这个默认配置可以正常工作,所以除非你的情况特殊,否则你应该恢复默认配置。
要恢复默认配置,请确保:
  • /etc/resolvconf/resolv.conf.d/head 只包含 resolvconf 头部文本,由两行以 # 字符开头的内容组成
  • /etc/resolvconf/resolv.conf.d/base 是一个空文件
  • /etc/resolvconf/resolv.conf.d/tail 是一个空文件
  • /etc/resolv.conf 是一个符号链接,其内容为 ../run/resolvconf/resolv.conf

要实现这一点,请执行以下命令。

sudo su
dpkg-reconfigure resolvconf   # And answer `Yes` to agree to dynamic updates
cd /etc/resolvconf/resolv.conf.d
echo '# 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' > head
rm -f base tail original
:> base
:> tail

NetworkManager的原始配置是具有
[main]
...
dns=dnsmasq
...

在/etc/NetworkManager/NetworkManager.conf文件中,通过注释掉dns=dnsmasq行来禁用NetworkManager控制的本地转发名称服务器是一个合理的选择。
[main]
...
#dns=dnsmasq
...

完成所有这些操作后,建议重新启动机器以清除过期的域名服务器信息记录。
sudo reboot

在我的情况下,/etc/NetworkManager/NetworkManager.conf文件中没有dns=dnsmasq行,并且/etc/resolv.conf仍然被网络管理器覆盖,只有nameserver 127.0.1.1
解决方法是恢复符号链接以进行正确的更新:
sudo ln -sf /run/resolvconf/resolv.conf /etc/resolv.conf

Ubuntu 16.04 + Ubuntu 18.04服务器 - 配置/etc/resolv.conf以在重启后保持

在Ubuntu 16.04服务器上,没有/etc/NetworkManager/NetworkManager.conf文件。

执行以下命令将显示/etc/resolv.conf文件链接到/run/resolvconf/resolv.conf文件:

sudo ls -la /etc/resolv.conf

nameserver 127.0.1.1 in resolv.conf won't go away

删除此文件并重新生成:
sudo rm -f /etc/resolv.conf
sudo echo '#== My Static /etc/resolv.conf File
#== ===============================
nameserver 8.8.8.8
nameserver 8.8.4.4' > /etc/resolv.conf

nameserver 127.0.1.1 in resolv.conf won't go away

现在你会发现链接已经消失了,而你的静态`/etc/resolv.conf`文件还在。
`sudo ls -la /etc/resolv.conf`

nameserver 127.0.1.1 in resolv.conf won't go away

现在要配置resolvconf,以便在重启后保留静态文件而不重新生成默认的/etc/resolv.conf文件,请执行以下命令:
sudo dpkg-reconfigure resolvconf
在第一个屏幕上,按下Tab键选择NO。

configure resolv.conf to persist after reboot

在第二个屏幕上,按下制表键来选择“确定”,然后按回车键。

configure /etc/resolv.conf to persist after reboot

你的/etc/resolv.conf文件在重启服务器后将保留。 Ubuntu 18.04服务器 如果你在/etc/netplan/50-cloud-init.yaml文件中添加了IP地址,很可能需要使用netplan applynetplan --debug apply来应用新的设置。这样做将重新创建/etc/resolve.conf链接到../run/resolvconf/resolv.conf。如果发生这种情况,只需执行rm -f /etc/resolv.conf并按照上述步骤重新创建它。
现在你需要像这样使用chattr命令对文件进行设置:
chattr +i /etc/resolv.conf 你的/etc/resolv.conf文件在重启服务器后将保留。
如果你需要编辑该文件,请记得反转chattr命令,如下所示:
chattr -i /etc/resolv.conf 现在你可以编辑/etc/resolve.cfg文件。