为什么/etc/resolv.conf不断变化?

为什么/etc/resolv.conf不断变化?

我正在使用 virt-manager 运行基于 debian 的 Linux 虚拟机,该虚拟机具有两个以太网接口,一个与 NAT 连接,另一个桥接到 br0,/etc/network/interfaces我有以下配置

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

br0 有一个 dhcp 服务器,除了交换机之外没有连接到任何东西

当我重新启动机器时/etc/resolv.conf有以下条目

nameserver 192.168.150.1

这是 NAP 分配的网络地址,也就是说,当我尝试时ping google.com收到错误,temporary name resolution failure然后我添加另一个条目,即

nameserver 8.8.8.8

虚拟机工作正常,我可以访问任何网站,但一段时间后它检查/etc/resolv.conf并再次出现一个条目,即使我让机器运行而没有启动任何服务或运行任何程序

有没有办法找出覆盖的内容如果找不到的话是否可以添加wat(不使用bash文件/etc/resolv.confnameserver 8.8.8.8/etc/resolv.conf

答案1

因为它必须。是的,/etc/resolv.conf应该不断改变只要其他一些服务需要更新它。

问题就在这里:哪个服务?我们需要更多信息。

从你的问题的简单描述来看,只有两个接口,一个是lo,无需更改/etc/resolv.conf,另一个是 eth0 ,正在使用 dhcp 服务。 dhcp 服务必须从上游路由器、交换机或者在您的情况下最有可能从 libvirt 和网桥内部的虚拟 dhcp 服务器续订其租约。

我假设描述两个接口是通过查看配置里面VM,而不是来宾的配置。

那么,一种选择可能是告诉 dhcpclient覆盖 DHCP 租约指定的服务器/etc/dhcp/dhclient.conf通过在虚拟机内部添加以下行:

supersede domain-name-servers 1.1.1.1, 2.2.2.2, 3.3.3.3;

或者通过前置,即添加为第一个 DNS 解析器,用行:

prepend domain-name-servers 8.8.8.8, 8.8.4.4;

冰山

这个问题比上面的“冰山一角”可能表明的要复杂得多。

虚拟网络配置比较复杂。您必须确保桥接器(我假设提供 192.168.150.zz 地址(不是默认的 xx.yy.122.zz))配置正确。请阅读https://wiki.libvirt.org/page/VirtualNetworking

还有许多其他替代程序可以更新该/etc/resolv.conf文件。从您的描述来看,在这种情况下,它们中的任何一个都不是问题。但你知道,/etc/resolv.conf这些年来,控制权的竞争一直持续很长时间,即使在今天,这种竞争也依然存在。一些可能想要控制/etc/resolv.conf并不时更改它的程序是:

  1. resolvconf。旨在绝对控制/etc/resolv.conf并避免任何其他程序更改它的程序。去掉它。
  2. Network Manager(您不报告您正在使用)。它有几个条目来定义要使用的 DNS 服务器。您可以重置其配置(通过移动其配置文件),或者禁用它看看是否能解决问题。
  3. 文件/etc/network/interfaces 可能包含 DNS 配置行,这里的情况似乎并非如此。
  4. systemd resolved服务可能正在设置本地服务器 127.0.0.53,但您没有报告有关的
  5. dnsmasq或类似的 DNS 服务器可以配置为控制resolv.conf.检查是否有dnsmasq程序正在运行。
  6. 每个新租约可能dhclient都会更新(理应如此) 。dhcp.conf如上所述。

答案2

在这里吐槽一下,我也遇到过这样的问题。我遇到的问题是网络管理器正在通过 Resolv.conf 应用它的配置,可能需要检查一下。我目前在工作中感到无聊,如果需要,我回家后会得到更多细节。

grep DNS /etc/sysconfig/network-scripts/ifcfg-*

并查看其中的 DNS 服务器和/或

sudo vim /etc/NetworkManager/NetworkManager.conf

并将其添加到 [main] 部分:

dns=none
rc-manager=unmanaged

答案3

通常这是由于 systemd (参见其他答案)造成的,但它可能是供应商可能添加的任何脚本,或者可以修改 systemd 以需要其他更晦涩的命令来禁用“破坏 DNS”功能,所以我放弃了在某个时刻并将文件设置为不可变,例如:

set -e
cd /etc
TMPFILE=`mktemp -q resolv.XXXXXXXXXX`
echo "nameserver 8.8.8.8" > "$TMPFILE"
chmod 0644 "$TMPFILE"
chattr -i resolv.conf
mv "$TMPFILE" resolv.conf
chattr +i resolv.conf

然而,供应商脚本可以轻松地取消设置不可变标志,然后破坏您的 DNS 配置;深度防御还包括尝试破坏 systemd。这里还有一个轻微的竞争条件。此外,诸如 SELinux 之类的安全策略框架(除非您已禁用它)可能会抱怨上面所做的 inode 更改,并要求遵守各种仪式(例如禁用它)。

相关内容