我正在使用 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.conf
)nameserver 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
并不时更改它的程序是:
resolvconf
。旨在绝对控制/etc/resolv.conf
并避免任何其他程序更改它的程序。去掉它。Network Manager
(您不报告您正在使用)。它有几个条目来定义要使用的 DNS 服务器。您可以重置其配置(通过移动其配置文件),或者禁用它看看是否能解决问题。- 文件
/etc/network/interfaces
可能包含 DNS 配置行,这里的情况似乎并非如此。 - 该
systemd
resolved
服务可能正在设置本地服务器 127.0.0.53,但您没有报告有关的。 dnsmasq
或类似的 DNS 服务器可以配置为控制resolv.conf
.检查是否有dnsmasq
程序正在运行。- 每个新租约可能
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 更改,并要求遵守各种仪式(例如禁用它)。