Назад | Перейти на главную страницу

Туннелированная сеть libvirt TCP работает только для 2 виртуальных машин

Я настраиваю несколько виртуальных машин с помощью libvirt (драйвер qemu). Одна виртуальная машина предназначена для использования в качестве шлюза и поэтому настроена с двумя сетевыми интерфейсами. Один интерфейс подключается к моей реальной локальной сети, а другой использует TCP-туннелирование (режим сервера):

<!-- External interface - i.e. facing the Internet -->
<interface type='direct' trustGuestRxFilters='no'>
  <source dev='eth0' mode='vepa'/>
</interface>

<!-- Virtual network -->
<interface type='server'>
  <source address='0.0.0.0' port='5558'/>
</interface>

Затем у меня есть две другие виртуальные машины (называемые test_1 и test_2), которые практически идентичны (за исключением, конечно, UUID, MAC и имени хоста). У них есть только сетевые интерфейсы, которые используют виртуальную сеть с туннелем TCP:

<interface type='client'>
  <source address='127.0.0.1' port='5558'/>
</interface>

Теперь виртуальная машина шлюза должна раздавать IP-адреса всем виртуальным машинам в виртуальной сети, но это делает это только тестовой виртуальной машине, которая загружается первой. Также, если оба работают, и я отключу тот, у которого в настоящее время есть IP-адрес, другой получит IP-адрес.

Я не думаю, что это проблема DHCP, потому что я вижу, что вторая тестовая виртуальная машина даже не отправляет DHCP-запрос на шлюз. Также не помогает установка статического IP-адреса на второй виртуальной машине.

В конце концов, похоже, что в качестве клиента виртуальной сети может быть только одна виртуальная машина, а другая виртуальная машина вообще не подключена к виртуальной сети. Но проверяя соединения на хост-машине, я вижу, что оба процесса qemu для тестовых виртуальных машин имеют TCP-туннели, открытые для хост-процесса шлюза.

Я действительно невежественен. Какие-нибудь советы о том, что может быть не так или что я могу попробовать дальше?

EDIT: интересно взглянуть на фактические соединения в хост-системе:

qemu-syst 2900 libvirt-qemu   12u  IPv4  22574      0t0  TCP *:5558 (LISTEN)
qemu-syst 2900 libvirt-qemu   17u  IPv4  22639      0t0  TCP localhost:5558->localhost:38714 (ESTABLISHED)
qemu-syst 2946 libvirt-qemu   12u  IPv4  21820      0t0  TCP localhost:38714->localhost:5558 (ESTABLISHED)
qemu-syst 2967 libvirt-qemu   12u  IPv4  21835      0t0  TCP localhost:38717->localhost:5558 (ESTABLISHED)

Похоже, сервер (процесс 2900) принял соединение только от первой виртуальной машины (процесс 2949)

Изучив код libvirt и qemu, я обнаружил, что это предполагаемое поведение (по крайней мере, qemu). libvirt передает параметры TCP-туннеля параметру -net в qemu. Похоже, что в этом патче [1] было введено поведение одного клиента. Также код qemu явно принимает только одного клиента за раз.

Тем не менее документация libvirt звучит так, как будто может быть несколько клиентов. Таким образом, либо функциональность должна быть реализована, либо документация должна быть адаптирована разработчиками.

[1] https://libvirt.org/formatdomain.html#elementsNICSTCP