nmcli: быстрый и безопасный бридж для ВМ на Ubuntu 25.04
Эта заметка — пошаговый гайд по созданию Linux bridge br0 для виртуальных машин, целиком через nmcli (NetworkManager CLI). Основа — практический сценарий: хост по проводу (eno0), нужно дать гостю (Debian 13) L2-доступ в ту же сеть.
TL;DR (5 команд)
# 0) посмотреть активные профили и имя текущего проводного профиля
nmcli -p con show --active
# 1) создать мост (DHCP) — если нужна статика, см. ниже
sudo nmcli con add type bridge ifname br0 con-name br0 ipv4.method auto ipv6.method ignore
# 2) сделать eno0 портом моста
sudo nmcli con add type ethernet ifname eno0 master br0
# 3) запретить автоподъём старого проводного профиля (замени имя ниже)
sudo nmcli con mod "Проводное подключение 1" connection.autoconnect no
# 4) поднять мост (IP переедет на br0)
sudo nmcli con up br0 && sudo nmcli con down "Проводное подключение 1"
Далее в virt-manager у ВМ: Network source → Bridge br0, Model → virtio. Готово.
1) Предпосылки и обозначения
-
Хост: Ubuntu 25.04, NetworkManager активен.
-
Uplink: проводной Ethernet
eno0. -
Старый профиль проводной сети: в примерах — «Проводное подключение 1» (у тебя может называться иначе).
-
Цель: создать
br0, «вложить» в негоeno0, перенести IP сeno0наbr0, подключить ВМ кbr0.
Проверка текущего состояния (полезно сохранить вывод):
nmcli -p con show --active
ip -br a
ip -br link
2) Создаём мост br0
Вариант A — DHCP (проще всего)
sudo nmcli con add type bridge ifname br0 con-name br0 \
ipv4.method auto ipv6.method ignore
Вариант B — статический IP
Подставь свои адрес/шлюз/DNS:
sudo nmcli con add type bridge ifname br0 con-name br0 \
ipv4.method manual \
ipv4.addresses "192.168.1.18/24" \
ipv4.gateway "192.168.1.1" \
ipv4.dns "192.168.1.1 9.9.9.9" \
ipv6.method ignore
Почему адрес — на мосту? Потому что физический интерфейс (
eno0) станет «портом» моста и IP ему не нужен.
3) Добавляем физический порт (eno0) в мост
sudo nmcli con add type ethernet ifname eno0 master br0
Это создаст «подчинённый» профиль (порт моста). Его IPv4/IPv6 не настраиваем — всё живёт на br0.
4) Плавное переключение без сюрпризов
-
Запретить автоподнятие старого профиля на
eno0, чтобы после перезагрузки не мешал:
sudo nmcli con mod "Проводное подключение 1" connection.autoconnect no
-
Поднять мост и опустить старое подключение:
sudo nmcli con up br0
sudo nmcli con down "Проводное подключение 1" # опционально, но лучше явно
-
(На будущее) убедимся, что
br0автоподнимается:
sudo nmcli con mod br0 connection.autoconnect yes
Проверка:
nmcli -f NAME,DEVICE,TYPE,STATE con show --active
ip -br addr show br0
bridge link
Ожидаемо: активен br0 (с IP), eno0 — без IP, числится «портом» моста.
5) Подключаем ВМ к br0
Через GUI (virt-manager)
-
NIC → Network source: Bridge br0
-
Device model: virtio
-
Apply → перезапустить ВМ.
Через CLI (libvirt)
sudo virsh attach-interface --domain <vmname> --type bridge --source br0 \
--model virtio --config --live
--configсохранит изменение в XML ВМ,--liveподключит без ожидания выключения.
Внутри гостя (Debian 13) настраивай сеть как обычно: DHCP или статика — это уже «настоящий» L2 твоей подсети.
6) Опции моста (необязательно)
-
Отключить STP (если точно не нужен):
sudo nmcli con mod br0 bridge.stp no sudo nmcli con up br0 -
Включить IGMP-snooping (в некоторых сетях уменьшает мультикаст-шум):
sudo nmcli con mod br0 bridge.multicast-snooping yes sudo nmcli con up br0
7) Траблшут
Симптом: ВМ не видит сеть через br0.
Проверь:
-
nmcli con show --active— активен лиbr0? -
ip -br a— IP наbr0, а не наeno0? -
bridge link— есть лиeno0среди портов моста? -
ВМ точно подключена к Bridge br0, а не к
NAT (virbr0)?
Ошибка «Operation not supported» при добавлении порта:
-
Нельзя добавлять Wi-Fi (интерфейсы вида
wlp…) в классический Linux-bridge в клиентском режиме 802.11. Решения:-
использовать NAT/роутинг для ВМ;
-
подключить USB-Ethernet и бриджить его;
-
экзотика (macvtap/macvlan, ebtables-хаки) — с ограничениями, обычно не нужно.
-
Старое «Проводное подключение …» постоянно просыпается:
-
Убедись, что у него
connection.autoconnect no. В крайнем случае — удалить профиль:sudo nmcli con delete "Проводное подключение 1"
8) Rollback (вернуть всё, как было)
sudo nmcli con mod "Проводное подключение 1" connection.autoconnect yes
sudo nmcli con up "Проводное подключение 1"
sudo nmcli con down br0
# (опционально) удалить созданные профили
sudo nmcli con delete br0
sudo nmcli con delete "bridge-slave-eno0"
9) Дополнительно: серверный вариант без NetworkManager
Если захочешь декларативно (Netplan + systemd-networkd):
# /etc/netplan/01-br0.yaml
network:
version: 2
renderer: networkd
ethernets:
eno0: {}
bridges:
br0:
interfaces: [eno0]
dhcp4: true # или manual + addresses/gateway/nameservers
parameters:
stp: true
Применение:
sudo netplan try && sudo netplan apply
Итог
-
Мост
br0созданnmcli, физический Etherneteno0— его порт. -
IP живёт на
br0,eno0— без адреса. -
ВМ, подключённая к
br0, получает L2-доступ в твою физическую сеть. -
Процедура обратима, занимает минуты и выдерживает перезагрузку.
