Иногда виртуальную машину KVM требуется подключить к нескольким сетям, использующим разные VLAN. В этой статье рассмотрена настройка Open vSwitch (OVS), при которой libvirt автоматически подключает виртуальные интерфейсы к нужным VLAN.
Предположим, что виртуальным машинам необходим доступ к VLAN 100 и VLAN 101. Физический интерфейс сервера eth0 подключен к транковому порту коммутатора, на котором разрешены оба VLAN. Имя интерфейса в командах следует заменить на фактическое, например enp1s0.
Внимание. После включения физического интерфейса в мост назначенный непосредственно этому интерфейсу IP-адрес перестанет обеспечивать связь с сервером. Если настройка выполняется удаленно, заранее подготовьте отдельный канал управления или доступ к локальной консоли.
Установка Open vSwitch
Пакет Open vSwitch доступен в репозиториях Fedora:
sudo dnf install -y openvswitch
После установки включите и сразу запустите службу:
sudo systemctl enable --now openvswitch.service
Конфигурация OVS хранится в базе OVSDB, а для управления ею используется утилита ovs-vsctl.
Настройка моста
Создайте мост root-sw и добавьте в него физический интерфейс:
sudo ovs-vsctl add-br root-sw
sudo ovs-vsctl add-port root-sw eth0
По умолчанию порт OVS передает трафик всех VLAN, поэтому eth0 будет работать как транковый порт. На физическом коммутаторе также должны быть разрешены VLAN 100 и VLAN 101.
Проверить конфигурацию можно командой:
sudo ovs-vsctl show
Настройка сетей libvirt
Libvirt умеет назначать VLAN интерфейсам виртуальных машин, подключенным к Open vSwitch. Поэтому отдельный мост для каждого VLAN создавать не требуется. Подготовьте файл /tmp/ovs-vlan100.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:
<network>
<name>ovs-vlan101</name>
<forward mode='bridge'/>
<bridge name='root-sw'/>
<virtualport type='openvswitch'/>
<vlan>
<tag id='101'/>
</vlan>
</network>
Зарегистрируйте сети в libvirt, включите их автоматический запуск и запустите их:
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
Убедитесь, что сети активны:
sudo virsh net-list --all
Теперь при создании или редактировании виртуальной машины в virt-manager можно выбрать сеть ovs-vlan100 либо ovs-vlan101. Libvirt создаст порт OVS и назначит ему соответствующий VLAN. Гостевая система будет получать обычные кадры без тега, то есть подключение будет работать как access-порт выбранного VLAN.
Сетевой интерфейс хоста
Если самому серверу необходим IP-адрес в VLAN 100, создайте внутренний интерфейс OVS и назначьте его порту VLAN 100:
sudo ovs-vsctl add-port root-sw man0 tag=100 \
-- set interface man0 type=internal
sudo ip link set man0 up
Для временной настройки статического адреса выполните:
sudo ip address add 192.168.1.1/24 dev man0
Такая настройка IP-адреса не сохраняется после перезагрузки. Постоянное подключение можно создать с помощью NetworkManager:
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:
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.