odmin@opslog: ~/blog
← cd ..
odmin@opslog:~/blog$ cat ovs.md

Установка и настройка Open vSwitch

Иногда виртуальную машину KVM требуется подключить к нескольким сетям, использующим разные VLAN. В этой статье рассмотрена настройка Open vSwitch (OVS), при которой libvirt автоматически подключает виртуальные интерфейсы к нужным VLAN.

Предположим, что виртуальным машинам необходим доступ к VLAN 100 и VLAN 101. Физический интерфейс сервера eth0 подключен к транковому порту коммутатора, на котором разрешены оба VLAN. Имя интерфейса в командах следует заменить на фактическое, например enp1s0.

Внимание. После включения физического интерфейса в мост назначенный непосредственно этому интерфейсу IP-адрес перестанет обеспечивать связь с сервером. Если настройка выполняется удаленно, заранее подготовьте отдельный канал управления или доступ к локальной консоли.

Установка Open vSwitch

Пакет Open vSwitch доступен в репозиториях Fedora:

bash
sudo dnf install -y openvswitch

После установки включите и сразу запустите службу:

bash
sudo systemctl enable --now openvswitch.service

Конфигурация OVS хранится в базе OVSDB, а для управления ею используется утилита ovs-vsctl.

Настройка моста

Создайте мост root-sw и добавьте в него физический интерфейс:

bash
sudo ovs-vsctl add-br root-sw
sudo ovs-vsctl add-port root-sw eth0

По умолчанию порт OVS передает трафик всех VLAN, поэтому eth0 будет работать как транковый порт. На физическом коммутаторе также должны быть разрешены VLAN 100 и VLAN 101.

Проверить конфигурацию можно командой:

bash
sudo ovs-vsctl show

Настройка сетей libvirt

Libvirt умеет назначать VLAN интерфейсам виртуальных машин, подключенным к Open vSwitch. Поэтому отдельный мост для каждого VLAN создавать не требуется. Подготовьте файл /tmp/ovs-vlan100.xml:

xml
<network>
  <name>ovs-vlan100</name>
  <forward mode='bridge'/>
  <bridge name='root-sw'/>
  <virtualport type='openvswitch'/>
  <vlan>
    <tag id='100'/>
  </vlan>
</network>

Аналогичным образом создайте файл /tmp/ovs-vlan101.xml:

xml
<network>
  <name>ovs-vlan101</name>
  <forward mode='bridge'/>
  <bridge name='root-sw'/>
  <virtualport type='openvswitch'/>
  <vlan>
    <tag id='101'/>
  </vlan>
</network>

Зарегистрируйте сети в libvirt, включите их автоматический запуск и запустите их:

bash
sudo virsh net-define /tmp/ovs-vlan100.xml
sudo virsh net-autostart ovs-vlan100
sudo virsh net-start ovs-vlan100

sudo virsh net-define /tmp/ovs-vlan101.xml
sudo virsh net-autostart ovs-vlan101
sudo virsh net-start ovs-vlan101

Убедитесь, что сети активны:

bash
sudo virsh net-list --all

Теперь при создании или редактировании виртуальной машины в virt-manager можно выбрать сеть ovs-vlan100 либо ovs-vlan101. Libvirt создаст порт OVS и назначит ему соответствующий VLAN. Гостевая система будет получать обычные кадры без тега, то есть подключение будет работать как access-порт выбранного VLAN.

Сетевой интерфейс хоста

Если самому серверу необходим IP-адрес в VLAN 100, создайте внутренний интерфейс OVS и назначьте его порту VLAN 100:

bash
sudo ovs-vsctl add-port root-sw man0 tag=100 \
  -- set interface man0 type=internal
sudo ip link set man0 up

Для временной настройки статического адреса выполните:

bash
sudo ip address add 192.168.1.1/24 dev man0

Такая настройка IP-адреса не сохраняется после перезагрузки. Постоянное подключение можно создать с помощью NetworkManager:

bash
sudo nmcli connection add type ethernet ifname man0 con-name man0 \
  ipv4.method manual ipv4.addresses 192.168.1.1/24 \
  ipv6.method disabled connection.autoconnect yes
sudo nmcli connection up man0

Для получения адреса по DHCP вместо статической конфигурации укажите ipv4.method auto:

bash
sudo nmcli connection add type ethernet ifname man0 con-name man0 \
  ipv4.method auto ipv6.method disabled connection.autoconnect yes
sudo nmcli connection up man0

Выберите только один из двух вариантов настройки NetworkManager. Перед назначением адреса убедитесь, что он не используется другим устройством и соответствует адресному плану VLAN 100.