我正在运行 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 解析添加到你的系统日志中。帮助我验证一切正常。