Я использую libvirt/qemu с операционной системой Arch Host и гостевой ОС win10. Некоторое время я использовал сетевую конфигурацию по умолчанию, но у меня начались проблемы с некоторыми доменными именами, которые не разрешались. У меня есть рабочий VPN, у которого есть собственный частный DNS. Становилось все труднее заставить гостевую виртуальную машину разрешать эти частные 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

Кто-нибудь знает, почему это работает только с перерывами? Или, по крайней мере, где еще я могу найти более актуальную информацию об отладке/регистрации? ТИА

0
David784 15 Дек 2021 в 16:59
Не обязательно для решения этой проблемы (см. ответы ниже), но теперь я полностью отключил встроенную сеть NAT, настроил все вручную. Я задокументировал весь процесс в посте Arch bbs.
 – 
David784
17 Дек 2021 в 00:54

2 ответа

Лучший ответ

Почему libvirt настроен на использование 8.8.8.8 в качестве сервера пересылки, если вы уже используете DNS-сервер (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 будет кэшировать результаты любых DNS-запросов, которые он должен был перенаправить на 8.8.8.8, поэтому задержки в оба конца для повторных запросов будут намного короче.

1
cas 16 Дек 2021 в 08:58
В настоящее время у меня нет dnsmasq, работающего по всему миру. Насколько я понимаю, libvirt запускает локальный экземпляр dnsmasq для каждой виртуальной машины и что раздел <dns> настраивает этот экземпляр. Но я думаю, что вы правы, глобальный dnsmasq звучит как путь. Спасибо! И да, проблема с ДВУ была ошибкой при анонимизации данных.
 – 
David784
16 Дек 2021 в 16:21
Вы также должны иметь возможность вытащить встроенный libvirt dnsmasq ip в конфигурацию вашей виртуальной машины и использовать его (учитывая, что между вашей виртуальной машиной и libvirts по умолчанию dnsmasq есть связь).
 – 
etosan
20 Дек 2021 в 03:11
Также имейте в виду, что libvirt — это безумная абстракция поверх безумного количества библиотек, инструментов cli и другой кучи дерьма: + kernel предоставляет интерфейсы и сеть (tuns, taps, vnets, bridges, маршрутизация) + на самом деле qemu-system то, что на самом деле работает и эмулирует вашу виртуальную машину и гостевую сторону nics + libvirt, просто организует все это вместе
 – 
etosan
20 Дек 2021 в 03:14
Наконец, даже после того, как все «снаружи», на хосте, уже настроено, все равно требуется некоторое время, пока виртуальный гость не установит свою собственную внутреннюю сеть, особенно если вы используете там что-то вроде NetworkManager или других хронических отстающих. Каждый раз проверяйте, правильно ли все это собрано, и только потом приступайте к отладке проблемы глубже.
 – 
etosan
20 Дек 2021 в 03:19

Чтобы уточнить очень хороший ответ, который дал @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 в качестве своего DNS в NetworkManager, и я решил, что если dnsmasq читает /etc/resolv.conf, это может привести к круговая ссылка.

После того, как я это настроил, даже несмотря на то, что я остановил сервисный порт libvirtd 53, он все еще отображался как используемый локальной копией dnsmasq, запущенной libvirt. Пришлось сделать virsh net-destroy default, чтобы остановить это.

Тогда я смог:

systemctl start dnsmasq
systemctl enable dnsmasq

Затем я зашел в NetworkManager и изменил все свои подключения IPv4 на DHCP Addresses Only и дал ему DNS-сервер 127.0.0.1. Отключите и снова подключите Wi-Fi, проверьте, и все кажется хорошим.

О, последнее, что я сделал во время тестирования: вы можете добавить log-queries к вашему /etc/dnsmasq.conf, и это добавит разрешение DNS в ваш системный журнал. Помогли убедиться, что все работает.

1
David784 16 Дек 2021 в 19:04
1
+1. приятно видеть, что люди возвращаются, чтобы опубликовать свои полные ответы.
 – 
cas
17 Дек 2021 в 12:51
1
Как вы уже дошли, не забудьте переоценить полное отключение systemd-resolved - если он у вас работает - он, как известно, дерьмовый, он делает странные вещи с доменами .local и остальной частью DNS. , вещи, которые DNS никогда не должен был делать. Теперь, когда у вас запущен тщательно настроенный экземпляр dnsmasq, может быть хорошей идеей перенаправить DNS-трафик хоста и всего гостя через него. Он намного проще в управлении и позволяет нагибать некоторые дурацкие «пути» DNS так, как вам нужно. Это "известный экземпляр".
 – 
etosan
20 Дек 2021 в 03:24