published: June 17, 2019, 2:27 p.m.

Бывает необходимо, что бы виртуальная машина 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

 Спасибо за внимание.