Подробный гайд: Настройка bridge-интерфейса для ВМ в virt-manager
Важно:
В современных версиях libvirt (≥ 6.0+) рекомендуется создавать мост на уровне ОС, а не через виртуальные сети libvirt. Libvirt будет только подключать ВМ к уже существующему мосту. Это даёт стабильность, прозрачность и совместимость с NetworkManager/netplan.
Требования
- Хост на Linux (Ubuntu/Debian, RHEL/CentOS/Fedora, Arch и др.)
- Установлены
libvirt,qemu-kvm,virt-manager - Доступ
sudoилиroot - Знание имени основного сетевого интерфейса хоста (
eth0,enp3s0,wlan0и т.д.)
Если вы подключаетесь по SSH:
все действия, связанные с изменением сетевого интерфейса, могут разорвать сессию. Используйте tmux/screen или консоль хоста.
Шаг 1. Проверка текущей сети
ip -br a
nmcli dev status # если используется NetworkManager
ip route show default
Найдите интерфейс, через который хост получает интернет/подключен к локальной сети. Запомните его имя (далее в гайде enp3s0).
Шаг 2. Создание bridge на хосте
Выберите вариант, соответствующий вашей системе управления сетью.
Вариант A: NetworkManager (RHEL, Fedora, Ubuntu Desktop, openSUSE)
# 1. Создаём мост br0
nmcli connection add type bridge ifname br0 con-name br0
# 2. Добавляем физический интерфейс как слейв моста
nmcli connection add type bridge-slave ifname enp3s0 master br0 con-name br0-slave
# 3. Если нужен статический IP (опционально, по умолчанию DHCP)
# nmcli connection modify br0 ipv4.method manual ipv4.addresses "192.168.1.10/24" ipv4.gateway "192.168.1.1" ipv4.dns "8.8.8.8"
# 4. Применяем
nmcli connection up br0
nmcli connection up br0-slave
Вариант B: netplan (Ubuntu Server 20.04+)
Отредактируйте /etc/netplan/01-netcfg.yaml (имя может отличаться):
network:
version: 2
renderer: networkd # или NetworkManager
ethernets:
enp3s0:
dhcp4: no
bridges:
br0:
dhcp4: yes # или статический IP
interfaces: [enp3s0]
parameters:
stp: false
Примените:
sudo netplan generate
sudo netplan apply
Вариант C: systemd-networkd (Arch, Debian без NM)
Создайте два файла:
/etc/systemd/network/br0.netdev
[NetDev]
Name=br0
Kind=bridge
/etc/systemd/network/br0.network
[Match]
Name=br0
[Network]
DHCP=yes
# или Address=192.168.1.10/24
# Gateway=192.168.1.1
/etc/systemd/network/99-enp3s0.network (слейв)
[Match]
Name=enp3s0
[Network]
Bridge=br0
Перезапустите: sudo systemctl restart systemd-networkd
Проверка после создания моста
ip -br a | grep br0
ip route show default
ping -c 2 8.8.8.8
IP-адрес хоста теперь должен быть на br0, а enp3s0 будет без IP, но в состоянии UP.
Шаг 3. Настройка в virt-manager
- Откройте virt-manager
2. Edit → Connection Details → Virtual Networks
Здесь не нужно создавать новую сеть типа "Bridge". Мы будем использовать уже созданный br0.
3. Закройте окно сетей.
Шаг 4. Подключение ВМ к bridge
Через GUI (virt-manager)
- Выключите ВМ (если запущена)
Open → Show virtual hardware detailsAdd Hardware → Network
4. Параметры:
- Network source:
Bridge device - Device name:
br0 - Device model:
virtio(рекомендуется) - MAC address: оставьте авто или укажите свой
Finish → Apply → Запустите ВМ
Через CLI (virsh)
virsh attach-interface <vm_name> bridge br0 --model virtio --config
virsh start <vm_name>
Для проверки в XML:
virsh edit <vm_name>
# Ищите:
<interface type='bridge'>
<source bridge='br0'/>
<model type='virtio'/>
</interface>
Шаг 5. Настройка сети внутри ВМ
- В большинстве дистрибутивов ВМ автоматически получит IP по DHCP из той же подсети, что и хост.
- Проверьте:
ip a,ip route,ping 8.8.8.8 - Если нужен статический IP: настройте его в гостевой ОС как на обычной физической машине.
Дополнительные настройки
1. Включение IP-форвардинга (если ВМ должна маршрутизировать или нужен NAT в дополнение)
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-ipforward.conf
sudo sysctl -p /etc/sysctl.d/99-ipforward.conf
2. Файрвол
- firewalld (RHEL/Fedora):
sudo firewall-cmd --permanent --zone=trusted --add-interface=br0
sudo firewall-cmd --reload
- ufw (Ubuntu/Debian):
sudo ufw allow in on br0
sudo ufw enable # если выключен
3. Отключение STP (если не требуется защита от петель)
nmcli connection modify br0 bridge.stp no
sudo netplan apply # или nmcli con up br0
4. Разрешение доступа libvirt к мосту (редко требуется, но бывает)
sudo tee /etc/libvirt/qemu.conf <<EOF
clear_emulator_capabilities = 0
EOF
sudo systemctl restart libvirtd
Обычно достаточно, чтобы пользователь был в группе libvirt или kvm.
Решение типовых проблем
| Симптом | Причина | Решение |
|---|---|---|
Хост потерял сеть после создания br0 |
IP остался на физ. интерфейсе, а не на мосте | Проверьте ip a, убедитесь, что IP на br0. Перезапустите сетевой менеджер. |
| ВМ не получает IP / нет интернета | Мост не подключен к внешнему роутеру, DHCP не отвечает, файрвол блокирует | Проверьте brctl show или bridge link, убедитесь, что br0 в UP. Откройте порты в файрволе. |
virt-manager не видит br0 |
Либа virt не обновилась или нет прав | sudo virsh net-list --all, перезапустите libvirtd, проверьте группу пользователя. |
br0: carrier lost спам в логах |
Физический интерфейс отключён или кабель вынут | Это нормально при hot-plug. Если критично: ethtool -K enp3s0 tx off или отключите carrier detect в NM. |
| ВМ видна в сети, но хост не пингует ВМ | Архитектура сети (VLAN, изоляция порта, провайдерский DHCP) | Проверьте ip neigh, убедитесь, что хост и ВМ в одной подсети и без NAT между ними. |
Диагностика:
ip -d link show br0
bridge link show
journalctl -u NetworkManager --since "10 min ago" | grep br0
virsh domiflist <vm_name>
Заметки на будущее
- Мост, созданный через ОС, переживёт обновления libvirt и не удалится при
virsh net-destroy. - Для production рекомендуется использовать
bonding+bridge, если нужно агрегирование каналов. - IPv6 работает прозрачно: убедитесь, что
net.ipv6.conf.br0.forwarding=1при необходимости. - Резервное копирование: сохраните конфиги NM/netplan до изменений.