我读到过,只有当我的机器有自己的 DNS 服务器时,我nameserver 127.0.1.1
的文件中才应该有/etc/resolv.conf
它。如果没有,那么拥有它就会带来问题。但无论我做什么,我都无法摆脱它!
以下是我目前所做的事情:
- 添加
nameserver 192.168.1.3
到/etc/resolvconf/resolv.conf.d/base
文件。(192.168.1.3 是我们网络的 DNS)。 - 跑步:
sudo resolvconf --enable-updates
。 - 跑步:
sudo resolvconf -u
。 - 正在运行:(
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
!这个地址是从哪里来的?
答案1
NetworkManager 是一个程序,它(通过 resolvconf 实用程序)将地址插入127.0.1.1
。resolv.conf
只有当 NM 配置为启动 dnsmasq 程序实例以充当本地转发名称服务器时,它才会插入该地址。该 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 会进行更新/etc/resolv.conf
(仍通过 resolvconf)以包含 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
答案2
有可能 resolvconf 配置错误。如果您一直在摆弄其配置文件,而没有真正理解 resolvconf 和 NetworkManager 的工作原理,则尤其有可能出现这种情况。
有关背景信息,请阅读 resolvconf 文档和 Stéphane Graber 的博客文章。
https://www.stgraber.org/2012/02/24/dns-in-ubuntu-12-04/
首先你应该知道 Ubuntu Desktop 和 Ubuntu Server 都默认安装并激活了 resolvconf。Resolvconf 提供了一个框架,用于以有序且可逆的方式动态更新 /etc/resolv.conf 文件。
其次,您应该知道 Ubuntu Desktop 默认安装并激活了 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 中。通过注释掉此行来禁用 NetworkManager 控制的本地转发名称服务器是一个合理的选择dns=dnsmasq
。
[main]
...
#dns=dnsmasq
...
完成所有操作后,建议重新启动机器以清除陈旧的名称服务器信息记录。
sudo reboot
答案3
在我的例子中,文件dns=dnsmasq
中没有行,并且仍然被网络管理器覆盖,只有/etc/NetworkManager/NetworkManager.conf
/etc/resolv.conf
nameserver 127.0.1.1
修复方法是恢复符号链接以进行正确的更新:
sudo ln -sf /run/resolvconf/resolv.conf /etc/resolv.conf
答案4
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
删除此文件并重新生成:
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
现在您将看到链接不再存在并且静态/etc/resolv.conf
文件仍然存在。
sudo ls -la /etc/resolv.conf
现在配置 resolvconf 不重新生成默认/etc/resolv.conf
文件,以便静态文件在重启后仍然存在,请执行以下命令:
sudo dpkg-reconfigure resolvconf
在第一个屏幕上,点击 Tab 键选择NO
在第二个屏幕上,按下 Tab 键选择 OK 并按 Enter。
/etc/resolv.conf
重启服务器后,您的文件仍将保留。
Ubuntu 18.04 服务器
如果您将 ips 添加到/etc/netplan/50-cloud-init.yaml
文件中,则很可能需要使用netplan apply
或应用新设置netplan --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