Я настраиваю несколько виртуальных машин с помощью 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 звучит так, как будто может быть несколько клиентов. Таким образом, либо функциональность должна быть реализована, либо документация должна быть адаптирована разработчиками.