На просторах сети нашел интересный вариант про OpenVSwitch, но на базе Ubuntu. Поэтому, воспользуясь одной иллюстрацией с этой статьи, опишу «гвозди» OpenVSwitch на RHEL.
Вот эта иллюстрация:
Рис. 1. Иллюстрация со стороннего ресурса
В этой статье, коллега по цеху строил песочницу на Ubuntu.
Мы же здесь затронем только ту часть, что касается OpenVSwitch.
Итак, в rhel-системах за сеть отвечает NetworkManager. О нем и поговорим в начале.
Установим необходимые компоненты: OpenVSwitch и плагины для NetworkManager:
# NetworkManager
dnf install openvswitch NetworkManager-ovs
# Скрипты для network.service - альтернативная установка (deprecated)
dnf install network-scripts-openvswitch
Запустим и перезапустим необходимое:
systemctl enable --now openvswitch
systemctl restart NetworkManager
На этом все… Шутка. Мы в начале пути. Установили необходимые плагины и сервисы.
Особенность работы ovs - это конфиг-файл пишется «на лету» командой ovs-vsctl
, и применяется сразу и переживает перезагрузку.
Как видно на иллюстрации, физический интерфейс, интерфейс хоста, настройка подключения, поддержка trunk (802.1q) и хоста в сети разделенные процессы. OpenVSwitch поддерживает не только trunk, но и другие фичи, например bonding-интерфейсы и т.д.
Итак, вот тут пойдут отличия реализации ovs-nm Ubuntu vs. RHEL.
trunk.
На физический интерфейс приходит линк с 802.1q, чтобы хостовая машина была в сети, скажем в VLAN ID 70, надо настроить NetworkManager, а для пробрасывания VLAN внутрь ВМ будет использоваться ovs.
Конфиг NetworkManager при получении DHCP будет выглядеть вот так:
[connection]
# название подключения
id=EVL70
# его UUID
uuid=23b6435a-782a-4481-a1dc-4e23f0ae1010
# тип подключения - vlan
type=vlan
# имя поднимаемого интерфейса
interface-name=vlan70
[ethernet]
mtu=1500
[vlan]
flags=1
# номер VLAN
id=70
# название физического интерфейса
parent=enp2s0
[ipv4]
method=auto
[ipv6]
addr-gen-mode=default
method=auto
[proxy]
При этом подключение для физического порта надо отключить (не отключить совсем, а убрать IP и т.д.)
[connection]
id=enp2s0
uuid=4af1a6ac-f2aa-4ed1-ce23-218ddbc9c7b1
type=ethernet
autoconnect-priority=-999
interface-name=enp2s0
[ethernet]
[ipv4]
method=disabled
[ipv6]
addr-gen-mode=eui64
method=disabled
[proxy]
Перегружаем подключения NetworkManager:
nmcli con reload
Вот хост появился в сети. Перейдем в настройку OpenVSwitch
Включаем в ovs все необходимые vlan:
# создаем виртуальный мост
ovs-vsctl add-br vSwitch0
# добавляем порт хоста в созданный мост
ovs-vsctl add-port vSwitch0 enp2s0
# добавляем необходимые VLAN в транк
ovs-vsctl set port enp2s0 trunks=10,20,30,40,50,60,70,80
Посмотрим что получилось:
ovs-vsctl show
d24481ae-5d24-4131-a7fa-3d4d4c8fc3e6
Bridge vSwitch0
Port vSwitch0
Interface vSwitch0
type: internal
Port enp2s0
trunks: [10, 20, 30, 40, 50, 60, 70, 80]
Interface enp2s0
ovs_version: "3.1.1"
Наш OpenVSwitch готов к эксплуатации
Теперь надо создать виртуальную сеть Linux KVM для работы с OpenVSwitch.
Ее конфиг будет такой:
<network>
<name>vSwitch</name>
<forward mode='bridge'/>
<bridge name='vSwitch0'/>
<virtualport type='openvswitch'>
<parameters interfaceid='ade12ae4-68a2-434f-b1f3-0d820cb97c4a'/>
</virtualport>
<portgroup name='vlan10'>
<vlan>
<tag id='10'/>
</vlan>
</portgroup>
<portgroup name='vlan20'>
<vlan>
<tag id='20'/>
</vlan>
</portgroup>
<portgroup name='vlan30'>
<vlan>
<tag id='30'/>
</vlan>
</portgroup>
<portgroup name='vlan40'>
<vlan>
<tag id='40'/>
</vlan>
</portgroup>
<portgroup name='vlan50'>
<vlan>
<tag id='50'/>
</vlan>
</portgroup>
<portgroup name='vlan60'>
<vlan>
<tag id='60'/>
</vlan>
</portgroup>
<portgroup name='vlan70'>
<vlan>
<tag id='70'/>
</vlan>
</portgroup>
<portgroup name='vlan80'>
<vlan>
<tag id='80'/>
</vlan>
</portgroup>
<portgroup name='trunkall'>
<vlan trunk='yes'>
<tag id='10'/>
<tag id='20'/>
<tag id='30'/>
<tag id='40'/>
<tag id='50'/>
<tag id='60'/>
<tag id='70'/>
<tag id='80'/>
</vlan>
</portgroup>
</network>
Запускаем сеть и ставим в автозапуск:
virsh net-define config.xml
virsh net-autostart vSwitch
virsh net-start vSwitch
Виртуальная сеть готова к использованию. Как ее использовать?
В конфиге ВМ надо указать следующие параметры, для использования того или иного VLAN:
<interface type='bridge'>
...
<source network='vSwitch' portgroup='vlan60' portid='40760e7d-5dca-4bd6-8467-34b50955690d' bridge='vSwitch0'/>
<vlan>
<tag id='60'/>
</vlan>
<virtualport type='openvswitch'>
<parameters interfaceid='ade12ae4-68a2-434f-b1f3-0d820cb97c4a'/>
</virtualport>
...
</interface>
По сути, необходимо сменить параметр source посредством команды virsh
, остальное qemu подхватит самостоятельно.
Вот пример проброса VLAN внутрь ВМ.