Open vSwitch (OVS) — программный коммутатор уровня L2/L3, который умеет больше обычного Linux bridge: правила OpenFlow, VLAN, туннели VXLAN и GRE, зеркалирование портов, агрегация каналов и централизованное управление. Его используют KVM и libvirt, OpenStack, Proxmox в режиме OVS и Kubernetes-кластеры с OVN. В 2026 году OVS остаётся стандартом там, где виртуальной сети нужна предсказуемая логика, а не только «мост и forward».
Из чего состоит Open vSwitch
Архитектура разделена на две части. Модуль ядра openvswitch отвечает за быстрый путь и хранит flow-таблицы, а пользовательские процессы ovs-vswitchd и ovsdb-server управляют конфигурацией и медленным путём. База конфигурации — /etc/openvswitch/conf.db, она переживает перезагрузку. Утилита ovs-vsctl работает с конфигурацией, ovs-ofctl — с правилами OpenFlow, ovs-appctl — с диагностикой демона.
По умолчанию используется datapath_type=system с модулем ядра. Режим netdev переносит обработку в пространство пользователя и нужен для DPDK или нестандартных интерфейсов, но стоит заметно дороже по CPU.
Установка и проверка
В Debian и Ubuntu пакет называется openvswitch-switch, в RHEL-семействе — openvswitch. После установки проверьте, что модуль ядра загружен, а сервис активен. В контейнерах и на некоторых облачных ядрах модуль может отсутствовать — тогда останется только netdev.
sudo apt install openvswitch-switch
sudo dnf install openvswitch
sudo systemctl enable --now openvswitch-switch
sudo ovs-vsctl show
Пустой вывод ovs-vsctl show — нормальное состояние: база создана, мостов ещё нет. Если команда не находит сокет, проверьте статус ovsdb-server и права на /var/run/openvswitch.
lsmod | grep openvswitch
systemctl status openvswitch-switch --no-pager
sudo ovsdb-client dump unix:/var/run/openvswitch/db.sock | head
Мост и порты
Мост создаётся одной командой и сразу становится видимым для ip link. Физический интерфейс добавляется как порт и перестаёт быть самостоятельным сетевым устройством: адреса и маршруты нужно переносить на мост. Если вы делаете это по SSH, сначала настройте консольный доступ или таймер отката, иначе соединение оборвётся.
sudo ovs-vsctl add-br br0
sudo ovs-vsctl add-port br0 enp3s0
sudo ip link set br0 up
sudo ovs-vsctl show
Внутренний порт (internal) — это интерфейс, который существует только внутри OVS и может получить IP. Так удобно делать шлюз для VLAN или отдельную служебную сеть. Тип интерфейса задаётся через set Interface, а тег — через set Port.
sudo ovs-vsctl add-port br0 vlan10 tag=10 -- set Interface vlan10 type=internal
sudo ip link set vlan10 up
sudo ip addr add 192.168.10.1/24 dev vlan10
ip -br addr show vlan10
NetworkManager может попытаться «починить» интерфейс, который вы отдали OVS. Надёжнее пометить физический порт как неуправляемый: nmcli device set enp3s0 managed no. Для самого моста можно создать отдельный профиль, но в лаборатории проще держать сеть вне NetworkManager.
VLAN и транки
Порт доступа получает один тег: кадры без метки попадают в указанный VLAN, метка при выходе снимается. Транк пропускает список VLAN и требует явной настройки trunks. Смешанный режим с нетегированным трафиком задаётся через vlan_mode=native-untagged.
sudo ovs-vsctl set Port enp3s0 trunks=10,20,30
sudo ovs-vsctl set Port vlan10 tag=10
sudo ovs-vsctl set Port enp3s0 tag=10 vlan_mode=native-untagged
sudo ovs-vsctl list Port enp3s0
Проверять VLAN удобно с другой машины: тегированный кадр должен доходить до внутреннего порта, а нетегированный — отбрасываться, если native VLAN не настроен. MTU на транке должен совпадать на всех участках, иначе крупные пакеты будут теряться.
OpenFlow на практике
Пока flow-таблица пуста, OVS коммутирует как обычный коммутатор с обучением MAC. После первого добавленного правила действует только оно, а остальное отбрасывается. Это удобно для изоляции, но требует дисциплины.
sudo ovs-ofctl show br0
sudo ovs-ofctl dump-flows br0
sudo ovs-ofctl add-flow br0 priority=100,ip,nw_dst=192.168.10.50,actions=output:2
sudo ovs-vsctl set-fail-mode br0 secure
Номера портов в actions берутся из вывода ovs-ofctl show. Для нормальной коммутации оставьте правило по умолчанию с действием NORMAL, а исключения добавляйте с более высоким приоритетом. Удалить все правила можно через del-flows, но на боевом мосте это равносильно обрыву связности.
sudo ovs-ofctl add-flow br0 priority=0,actions=NORMAL
sudo ovs-ofctl del-flows br0
sudo ovs-ofctl dump-ports br0
ofproto/trace показывает, какое правило сработает и почему. Это быстрее, чем снимать tcpdump.
sudo ovs-appctl ofproto/trace br0 in_port=1,dl_src=52:54:00:11:22:33,dl_dst=52:54:00:44:55:66,ip,nw_src=192.168.10.10,nw_dst=192.168.10.50
sudo ovs-appctl dpif/show
sudo ovs-dpctl show
Зеркалирование и диагностика
SPAN-порт в OVS настраивается объектом Mirror. Он копирует трафик выбранных портов на анализатор, не разрывая соединение. Такой приём используют для IDS, отладки VoIP и разбора инцидентов. Направление можно ограничить: select_src_port, select_dst_port или select_all.
sudo ovs-vsctl add-port br0 snoop0 -- set Interface snoop0 type=internal
sudo ovs-vsctl -- set Bridge br0 mirrors=@m -- --id=@o get Port snoop0 -- --id=@m create Mirror name=span select_all=true output-port=@o
sudo ovs-vsctl list Mirror
sudo tcpdump -ni snoop0 -c 20
Счётчики портов и интерфейсов показывают, растут ли ошибки и дропы. ovs-appctl bond/show пригодится, если настроена агрегация: он показывает, какие slave активны и как распределяются потоки. Для поиска проблемы с конкретным гостем смотрите ovs-vsctl list Interface и ovs-appctl dpif/show.
sudo ovs-ofctl dump-ports br0
sudo ovs-vsctl list Interface | grep -E 'name|statistics|error'
sudo ovs-appctl bond/show
sudo journalctl -u openvswitch-switch -n 50 --no-pager
Связка с KVM и libvirt
Libvirt умеет подключать гостя к OVS напрямую: в описании сети указывается тип virtualport openvswitch, а мост должен существовать заранее. После запуска домена на мосте появится порт vnetX, которому можно назначить VLAN тегом.
<network>
<name>ovs-net</name>
<forward mode='bridge'/>
<bridge name='br0'/>
<virtualport type='openvswitch'/>
</network>
Тег на порту гостя задаётся уже после старта: ovs-vsctl set Port vnet0 tag=20. Если гостей много, удобнее заранее создать port group с нужным VLAN и подключать интерфейсы к нему. Не меняйте tag на работающем порту без предупреждения пользователя — связность пропадёт мгновенно.
sudo ovs-vsctl set Port vnet0 tag=20
sudo ovs-vsctl list Port vnet0
sudo virsh domiflist web01
Итог
Open vSwitch даёт управляемую виртуальную сеть: мосты, VLAN, OpenFlow, зеркалирование и интеграцию с гипервизором.
Проверьте перед запуском:
- мост br0 поднят, порты добавлены;
- VLAN и trunks проверены с другой машины;
- flow-таблицы сохранены перед правкой;
- fail-mode проверен на тестовом мосте.
Держите под рукой ovs-vsctl show, ovs-ofctl dump-flows и ofproto/trace — эти три команды закрывают большинство инцидентов. И помните: перенос физического интерфейса под OVS обрывает текущее соединение, поэтому удалённую настройку делайте только с запасным каналом доступа.