libvirt/qemu ゲスト VM は、時には DNS 解決を複数回試みる必要があります。

libvirt/qemu ゲスト VM は、時には DNS 解決を複数回試みる必要があります。

私はアーチホストOSとwin10ゲストOSを使ってlibvirt / qemuを実行しています。しばらくデフォルトのネットワーク設定を使用していましたが、特定のドメイン名が解決されない問題が発生し始めました。独自のプライベートDNSを持つビジネス用VPNがあります。ゲストVMでこれらのプライベートDN(時には他のDN)を確認することはますます困難になっています。時には、次の方法で問題を一時的に解決できます。

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

それ以外の場合は、ゲスト(およびホストOS)を再起動する必要があります。

読んだ後文書ネットワーク構成を次のように変更しました(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>部分だけでした。他のすべては自動的に作成されました。

ほとんどは機能しますが、機能するには要求を何度も送信する必要があることがよくあります。簡単な方法を試してみましたが、ping結果could not find hostがうまくいかないので、DNチェックだと思います。

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.com2回試行されます。時には解決に5〜6回の試みが必要な場合があります。

syslogは普通に見えます。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

これが断続的にしか機能しない理由を知っている人はいますか?それとも、少なくともより関連性の高いデバッグ/ロギング情報をどこで見つけることができますか?ティア

ベストアンサー1

libvirtすでにDNSサーバーを実行していますが、なぜ8.8.8.8をフォワーダー(dnsmasq)として使用するように構成しますか?

代わりにローカルDNSサーバーのみを使用するようにlibvirtを構成し、それ自体で解決できprivate.dnない(ドメインなど)、以前に転送された要求をキャッシュしないすべての要求に対してフォワーダーとして8.8.8.8を使用するようにDNSサーバーを構成します。 。ログエントリによると、dnsmasqはすでにこれを行うように設定されているため、定義から削除するだけdnsmasq[641]: using nameserver 8.8.8.8#53です。<forwarder addr='8.8.8.8'/><network>

ところで、libvirtネットワーク定義にプライベートドメインがあると言われており、private.dndnsmasqにと呼ばれていますprivate.cp。これが構成エラーであるか、予期された構成であるか、またはこの問題の個人ドメインを匿名化するバグであるかどうかはわかりません。

ある種の競合状態が発生する可能性があります。 libvirtが<dns>...</dns>セクション内の複数のフォワーダエントリをどのように処理するのか、リストされた順序で1つずつ試みるのか、両方のサーバーに同時に要求を送信し、最初のサーバーから返された結果を使用するのかわかりません。

これは、問題の解決にかかわらず、dnsmasqが8.8.8.8に渡す必要があるすべてのDNS要求の結果をキャッシュするため、繰り返される要求の往復待ち時間がはるかに短くなるため、全体的にDNS解決が高速になります。

おすすめ記事