libvirt/qemu 来宾虚拟机有时需要多次尝试 DNS 解析

libvirt/qemu 来宾虚拟机有时需要多次尝试 DNS 解析

我正在运行 libvirt/qemu,带有 arch 主机操作系统和 win10 来宾操作系统。有一段时间我使用默认网络配置,但我开始遇到某些域名无法解析的问题。我有一个工作 VPN,它有自己的私有 DNS。让来宾虚拟机解析这些私有 DN(有时甚至是其他 DN)变得越来越困难。有时以下内容可以暂时解决问题

virsh net-destroy default && virsh net-start default && systemctl restart libvirtd

其他时候我必须重新启动来宾(可能还有主机操作系统)。

读完后文档我将网络配置更改为以下(使用virsh net-edit default):

<network>
  <name>default</name>
  <uuid>...</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='...'/>
  <dns>
    <forwarder addr='8.8.8.8'/>
    <forwarder domain='private.dn' addr='192.168.30.1'/>
  </dns>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>

我添加的只是该<dns>部分...其他所有内容都是自动生成的。

它大部分都有效,但我经常需要多次提交请求才能使其正常工作。我认为这是 DN 分辨率,因为当我尝试一个简单的方法时,ping我会得到一个could not find host它不起作用的结果。

C:\Users\user>ping google.com

Pinging google.com [74.125.136.113] with 32 bytes of data:
Reply from 74.125.136.113: bytes=32 time=26ms TTL=106

C:\Users\user>ping yahoo.com
Ping request could not find host yahoo.com. Please check the name and try again.

C:\Users\user>ping yahoo.com

Pinging yahoo.com [74.6.143.26] with 32 bytes of data:
Reply from 74.6.143.26: bytes=32 time=43ms TTL=51

在此示例中google.com解决了第一次尝试,并yahoo.com进行了两次尝试。有时需要尝试 5 或 6 次才能解决。

系统日志对我来说看起来很普通......could not find host发生错误时没有记录任何内容:

user:~$ journalctl -eu libvirtd
Dec 14 07:50:01 systemd[1]: Started Virtualization daemon.
Dec 14 07:50:02 dnsmasq[641]: started, version 2.86 cachesize 150
Dec 14 07:50:02 dnsmasq[641]: compile time options: IPv6 GNU-getopt DBus no-UBus i18n IDN2 DHCP DHCPv6 no-Lua TFTP conntrack ipset auth cryptohash DNSSEC loop-detect inotify dumpfile
Dec 14 07:50:02 dnsmasq-dhcp[641]: DHCP, IP range 192.168.122.2 -- 192.168.122.254, lease time 1h
Dec 14 07:50:02 dnsmasq-dhcp[641]: DHCP, sockets bound exclusively to interface virbr0
Dec 14 07:50:02 dnsmasq[641]: using nameserver 8.8.8.8#53
Dec 14 07:50:02 dnsmasq[641]: using nameserver 192.168.30.1#53 for domain private.cp
Dec 14 07:50:02 dnsmasq[641]: read /etc/hosts - 17 addresses
Dec 14 07:50:02 dnsmasq[641]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 addresses
Dec 14 07:50:02 dnsmasq-dhcp[641]: read /var/lib/libvirt/dnsmasq/default.hostsfile
Dec 15 08:24:52 dnsmasq-dhcp[641]: DHCPREQUEST(virbr0) 192.168.122.7 52:54:00:e0:55:a8
Dec 15 08:24:52 dnsmasq-dhcp[641]: DHCPACK(virbr0) 192.168.122.7 52:54:00:e0:55:a8 DESKTOP-3GAMEL8

有谁知道为什么这只能间歇性地起作用?或者至少我还能在哪里寻找更相关的调试/日志记录信息? TIA

答案1

libvirt当您已经运行 DNS 服务器时,为什么要配置为使用 8.8.8.8 作为转发器 ( dnsmasq)?

相反,将 libvirt 配置为仅使用本地 DNS 服务器,然后将 DNS 服务器配置为使用 8.8.8.8 作为其无法自行解析的任何请求(例如您的private.dn域)且未缓存先前转发的请求的转发器。根据日志条目dnsmasq[641]: using nameserver 8.8.8.8#53,dnsmasq 已经设置为执行此操作,因此您需要做的就是<forwarder addr='8.8.8.8'/>从定义中删除<network>

顺便说一句,你的 libvirt 网络定义说你的私有域是private.dn,而 dnsmasq 说它是private.cp- 我不确定这是否是一个配置错误,预期的配置,或者在为这个问题匿名化你的私有域时的错误。

您可能会触发某种竞争条件。我不确定 libvirt 如何处理一个<dns>...</dns>部分中的多个转发器条目,是否按列出的顺序依次尝试它们,或者是否同时将请求发送到两个服务器并使用第一个返回的结果。

无论这样做是否可以解决问题,总体上应该会导致更快的 DNS 解析,因为 dnsmasq 会缓存它必须转发到 8.8.8.8 的任何 DNS 请求的结果,因此重复请求的往返延迟会短得多。

答案2

为了详细说明@cas 给出的非常好的答案,我想提供一些细节。我dnsmasq使用以下设置设置了服务/etc/dnsmasq.conf

no-resolv
server=/private.dn/192.168.30.1
server=1.1.1.1
server=8.8.8.8
server=8.8.4.4

可能有更好的方法来做到这一点,但我希望能够127.0.0.1在 NetworkManager 中提供我的 DNS,并且我认为如果dnsmasq正在阅读/etc/resolv.conf可能会导致循环引用。

一旦我完成了这个设置,即使我已经停止了 libvirtd 服务,端口 53 仍然显示为正在使用,由 libvirt 启动的 dnsmasq 的本地副本。必须做一个virsh net-destroy default来阻止它。

然后我能够:

systemctl start dnsmasq
systemctl enable dnsmasq

接下来,我进入 NetworkManager,将所有连接更改为 IPv4,DHCP Addresses Only并将其 DNS 服务器指定为127.0.0.1.断开并重新连接 wifi,测试,一切似乎都很好。

编辑:我从那以后了解到您可以为所有网络连接全局设置 DNS,如下所示/etc/NetworkManager/conf.d/dns-servers.conf

[global-dns-domain-*]
servers=127.0.0.1

(我很乐意为此表示感谢,但我不记得我从哪里得到它。)


哦,我在测试时做的最后一件事:你可以添加log-queries到你的系统日志中/etc/dnsmasq.conf,它会将 DNS 解析添加到你的系统日志中。帮助我验证一切正常。

相关内容