Skip to main content

nmcli: быстрый и безопасный бридж для ВМ на Ubuntu 25.04

image.png

Эта заметка — пошаговый гайд по созданию 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) Плавное переключение без сюрпризов

  1. Запретить автоподнятие старого профиля на eno0, чтобы после перезагрузки не мешал:

sudo nmcli con mod "Проводное подключение 1" connection.autoconnect no
  1. Поднять мост и опустить старое подключение:

sudo nmcli con up br0
sudo nmcli con down "Проводное подключение 1"   # опционально, но лучше явно
  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, физический Ethernet eno0 — его порт.

  • IP живёт на br0, eno0 — без адреса.

  • ВМ, подключённая к br0, получает L2-доступ в твою физическую сеть.

  • Процедура обратима, занимает минуты и выдерживает перезагрузку.