Бывает необходимо, что бы виртуальная машина KVM присутствовала в нескольких подсетях с разными VLAN. Что бы автоматизировать данный процесс я использую openvswich, в котором создаю необходимые мне vlan подсети. Давайте создадим такую конфигурацию:
Есть две подсети одна имеет VLAN100 другая VLAN101 данные сети доступны с хостовой машины по кабелю, который воткнут в транковый порт свича, протегированный в соответствующих вланах. В Fedora в стандартных репозиториях есть пакет openvswitch. Установим его командой:
$ sudo dnf install openvswitch -y
После установки следует запустить сервиc openvswitch
$ sudo systemctl enable openvswitch.service
$ sudo systemctl start openvswitch.service
При запуске сервис создает базу в файле /etc/openvswitch/conf.db в котором и будет содержать все свои настройки. Для управления конфигурациями служит утилита ovs-vsctl. Структура будущей сети такова
Такая структура необходима из-за некоторых особенностей работы libvirt, например невозможно указать какой конкретно интерфейс и в каком vlan следует создать для определенной машины. Проще всего заранее сделать несколько свичей протегированных в различных vlan, средствами libvirt добавлять туда интерфейс не задумываясь об их тегах. Свич root-sw это наш корневой свич в который мы подключаем все остальные свичи. Итак создаем root-sw
$ sudo ovs-vsctl add-br root-sw
В данный свич нужно добавить реальный интерфейс хостовой машины, смотрящий в реальный свич. Осторожно, сетка в этот момент пропадет. О том как сделать хостовую машину доступной из вне ниже. Добавим наш интерфейс
$ sudo ovs-vsctl add-port root-sw eth0
Теперь нужно создать свичи sw-vlan100 и sw-vlan101 укажем что они протегированны во vlan 100 и 101
$ sudo ovs-vsctl add-br sw-vlan100 100
$ sudo ovs-vscrl add-br sw-vlan101 101
Что бы наши машинки сами подцепляли нужные порты в свичах настроим виртуальные сети libvirt. Используем для этого утилиту virsh, входящую в состав пакета libvirt-client.
$ sudo virsh
Дальнейшие команды выполняем в ней:
virsh # net-list
Name State Autostart Persistent
--------------------------------------------------
default active yes yes
Как видно у нас есть только одна дефолтная сеть default используем ее как шаблон.
virsh # net-edit default
В результате выполнения команды видим xml конфиг default сети, приведем ее к виду
<network>
<name>sw-vlan100</name>
<forward mode='bridge'/>
<bridge name='sw-vlan100' />
<virtualport type='openvswitch'/>
</network>
После чего выходим из редактора соответствующей командой с сохранением
файла. Кстати установить редактор по умолчанию поможет системная
переменная
$ export EDITOR="/usr/bin/vim"
так же создаем конфиг второй сети, еще раз запускаем редактирование default сети
virsh # net-edit default
Приводим к виду
<network>
<name>sw-vlan101</name>
<forward mode='bridge'/>
<bridge name='sw-vlan101' />
<virtualport type='openvswitch'/>
</network>
Делаем службы сетей активными и включаем автостарт
virsh # net-autostart sw-vlan100
virsh # net-start sw-vlan100
virsh # net-autostart sw-vlan101
virsh # net-start sw-vlan101
Теперь при создании виртуальной машины следует выбрать нужную сеть в virt-manager и порт автоматически будет создаваться в свиче тегированном в нужном vlan.
Теперь если у вас есть необходимость управлять хостовой машиной по ssh, то создайте интерфейс в нужном vlan и назначьте на него
IP адрес
$ sudo ovs-vsctl add-port man0 sw-vlan100
Делаем интерфейс внутренним
$ sudo ovs-vsctl set interface man0 type=internal
Видим интерфейс в системе
$ ip link show man0
Тепрь можете назначит ему интерфейс вручную:
$ sudo ip addr add 192.168.1.1/24 dev man0
Или установить его по DHCP
$ sudo dhclient man0 -pf /run/dhclient.pid
Спасибо за внимание.