libvirt多网络接口环境下DNS更新冲突问题及配置需求求助
看起来你遇到的是多DHCP网络接口下,guest系统的DNS配置被不同网络的DHCP服务器反复覆盖的问题,这其实是libvirt+dnsmasq配合guest网络管理工具(比如NetworkManager、dhclient)的默认行为,但完全可以从主机端调整配置来解决,不需要修改guest。
先理清楚问题根源:你的guest有三个DHCP接口:
vtunnel0:由libvirt的dnsmasq提供DHCP,推送自身IP(203.0.113.2)作为DNSvlocal0:同样由libvirt的dnsmasq提供DHCP,推送自身IP(10.8.17.1)作为DNS- 物理桥接接口:由物理网络的DHCP服务器提供DNS
guest的网络管理工具会自动从所有活跃的DHCP接口获取DNS服务器信息,并更新/etc/resolv.conf——如果多个接口的DHCP都推送了DNS,就会出现你看到的“内容反复变化”的情况。
接下来给你两种针对性的解决方案,根据你的需求(固定从vtunnel0或物理网卡获取DNS)来选:
方案1:仅保留vtunnel0推送DNS,禁用其他两个网络的DNS推送
1.1 调整vlocal0的虚拟网络配置
编辑vlocal0的网络XML配置(可以用virsh net-edit vlocal0命令直接编辑),添加以下配置来让dnsmasq停止推送DNS服务器信息:
<network> <name>vlocal0</name> <uuid>1bbbe818-cbab-443d-9637-ee3e178e2c2b</uuid> <bridge name='vlocal0' stp='on' delay='0'/> <mac address='3c:3f:8a:c5:4b:c4'/> <ip address='10.8.17.1' netmask='255.255.255.0'> <dhcp> <range start='10.8.17.6' end='10.8.17.254'/> <!-- 添加这一行,推送空的DNS服务器选项,guest会忽略 --> <option name='dns-server' value=''/> </dhcp> </ip> <!-- 可选:直接禁用该网络的DNS服务功能 --> <dns enable='no'/> </network>
保存后,重启vlocal0网络生效:
virsh net-destroy vlocal0 && virsh net-start vlocal0
1.2 处理物理桥接接口的DNS推送
由于物理桥接接口的DHCP来自物理网络的DHCP服务器(不是libvirt的dnsmasq),如果无法修改物理DHCP的配置,我们可以在libvirt层面让guest的这个接口不请求DNS服务器选项:
编辑guest的XML配置(virsh edit <你的guest名称>),找到物理桥接的<interface>块,添加<dhcp>子标签来指定不请求DNS:
<interface type='direct'> <mac address='50:00:7b:6b:bb:10'/> <source dev='enp4s0' mode='bridge'/> <model type='e1000'/> <address type='pci' domain='0x0000' bus='0x10' slot='0x03' function='0x0'/> <!-- 添加这部分配置,告诉guest的DHCP客户端不请求DNS服务器 --> <dhcp> <request option='dns-server' value='no'/> </dhcp> </interface>
保存后,重启guest生效:
virsh destroy <你的guest名称> && virsh start <你的guest名称>
方案2:仅保留物理网卡的DNS推送,禁用vtunnel0和vlocal0的DNS推送
如果你的需求是用物理网络的DNS,只需要反过来调整:
- 对
vtunnel0和vlocal0的网络配置,按照方案1.1的方法添加<option name='dns-server' value=''/>和<dns enable='no'/> - 物理桥接接口的配置保持不变即可
验证配置是否生效
重启对应的网络和guest后,你可以在guest中查看/etc/resolv.conf,应该只会看到你指定的网络的DNS服务器;同时可以用virsh net-dumpxml <网络名称>检查主机端的网络配置是否正确应用,或者在主机端查看dnsmasq的日志(通常在/var/log/libvirt/dnsmasq/目录下)确认是否推送了DNS选项。
备注:内容来源于stack exchange,提问作者Tintenfisch

