Networking

libvirt/qemu 來賓 VM 有時需要多次嘗試進行 DNS 解析

  • December 16, 2021

我正在執行 libvirt/qemu,帶有 Arch 主機作業系統和 win10 來賓作業系統。有一段時間我使用預設網路配置,但我開始遇到某些域名無法解析的問題。我有一個工作 VPN,它有自己的私有 DNS。讓來賓 VM 解析這些私有 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

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 請求的結果,因此重複請求的往返延遲會更短。

引用自:https://unix.stackexchange.com/questions/681583