Короткий ответ
В PVE гостевой VLAN — это обычно tag=40 на net0 плюс порт коммутатора как trunk с разрешённым VID, либо vlan-aware vmbr0 с bridge-vids. Несовпадение: коммутатор access, а PVE шлёт tagged (или наоборот). Не срывайте теги со всех VM, чтобы «заработало как раньше на access-порту».
Снимите qm config 101, bridge vlan, конфигурацию порта и tcpdump с vlan.
Симптомы и как отличить
Типичная картина:
- без
tagгость в native management VLAN, сtag— тишина; - Wireshark на коммутаторе: кадры не тем VID;
- vlan-aware мост, но
bridge-vidsбез 40; - DHCP сервер в VLAN 40 не видит Discover.
Отличия:
| Что видно | Куда |
|---|---|
| Вообще нет линка | Сеть VM |
| Сломан сам vmbr0 | Linux Bridge |
| Сеть есть, медленно, MTU | VM медленно |
| После migrate на pve2 VLAN нет | trunk только на порту pve1 |
Возможные причины
- На
net0нетtag=, порт коммутатора trunk. - Есть
tag=, порт access. bridge-vlan-aware yes, но VID не вbridge-vids.- PVID/native на коммутаторе не тот, QinQ случайно.
- Гость сам тегирует VLAN (nested) + tag в PVE = двойной тег.
- Firewall/ACL на SVI VLAN 40.
Диагностика
pveversion
qm config 101 | grep net
cat /etc/network/interfaces
bridge vlan show
ip -d link show vmbr0Ищите bridge-vlan-aware, bridge-vids, на net0 — tag=.
На коммутаторе (логика, не выдуманный CLI): порт к pve1 должен пропускать VID гостя tagged, native — management, если так задумано.
tcpdump -ni vmbr0 vlan 40 -c 10
# или на физическом slaveНет tagged 40 при ping из гостя с tag=40 — мост снимает/не ставит тег. Есть на проводе, нет на SVI — коммутатор/ACL.
Решение
Сценарий A. Классика: linux bridge без vlan-aware
Физический порт — trunk. На NIC VM: tag=<VID>. Хостовый IP остаётся untagged на vmbr0 (native). Не вешайте хостовый IP на тот же VID, что гости, без отдельного vmbr0.VID.
Сценарий B. vlan-aware vmbr0
В interfaces: bridge-vlan-aware yes и список bridge-vids. Каждый гость с tag=. Добавление новой VLAN = и PVE bridge-vids, и trunk на коммутаторе. Забыли одно — «VLAN не проходит».
ifreload -a
bridge vlan showТолько с консоли, если трогаете vmbr0.
Сценарий C. Отдельный мост vmbr1 под VLAN
vmbr1 на eno1.40 или на tagged bond. Тогда на net0 не ставят tag= (уже в VLAN). Двойной tag — типичная ошибка.
Сценарий D. Гость Windows/Linux сам 802.1Q
Либо тег в PVE, либо в госте, не оба. Для обычных VM тег только в net0.
Сценарий E. Коммутатор
Access порт + tag= в PVE = тупик. Trunk + native management + allowed VLAN list. Согласуйте с сетью до массового Apply.
Две рабочие схемы и типичная путаница PVID
Схема 1: linux bridge, не vlan-aware, тег на net0. На проводе tagged VID, native — IP pve1. Схема 2: vlan-aware, bridge-vids, тег на net0. Схема 3: субинтерфейс eno1.40 как port отдельного vmbr1, гость без tag. Смешение 1+3 на одной VLAN даёт двойной тег или untagged не туда.
bridge vlan show dev vmbr0
ip -d link show type vlan
tcpdump -eni eno1 'vlan 40' -c 5На коммутаторе PVID (native) должен быть management, не гостевой 40, если IP хоста untagged. Если PVID=40, а PVE шлёт tagged 40 — часть стеков отбросит, часть двойной тег.
После migrate на pve2 проверьте, что порт pve2 тоже trunk allowed 40. Иначе «VLAN не проходит» только у переехавшей VM — это не баг qemu.
Не включайте bridge-vlan-aware на живом vmbr0 по SSH без BMC: смена модели моста роняет линк. Делайте в окне.
Как проверить, что проблема устранена
Гость получает DHCP/статику VLAN 40, ping SVI. tcpdump видит правильный VID на uplink. Другие VM с иными tag= не съехали в чужую сеть. После ребута pve1 и VM — то же. На втором узле кластера порт тоже trunk — иначе миграция «ломает сеть».
Гостевой firewall, который фильтрует по VLAN ID, на обычном virtio NIC бесполезен: гость тег не видит. Фильтр должен быть в PVE/vmbr0/на коммутаторе. Если админ «починил VLAN» включением 802.1Q в госте поверх tag= — снимите гостевой тег, оставьте один слой.
Если не помогло
- Только broadcast нет: storm control, IGMP snooping на DHCP — редко, но бывает.
- MTU 1500 vs 1504 tagged: обычно linux справляется; проблемы чаще на jumbo.
- OVS: теги через
vlan_mode, не копируйте linuxtag=один в один без чтения ovs. - PVLAN/private VLAN на коммутаторе изолирует гостей.
- Облачный «trunk» у провайдера не пропускает ваши VID.
Профилактика
- Схема: какая модель VLAN на кластере, таблица VID.
- Одинаковые trunk на всех узлах, куда мигрируют VM.
- Не держать native = гостевой VLAN.
- Чеклист перед сменой коммутатора: проверка PVE.
- Тестовая VM с
tag=до перевода продакшена.
FAQ
tag= на net0 — это access в госте?
Для гостя NIC выглядит обычным untagged Ethernet в этой VLAN. Тег ставит гипервизор.
Нужен ли vlan-id в гостевом Netplan?
Нет, если тег уже в PVE. Да — если вы сознательно делаете тег в госте и PVE без tag.
Сколько VLAN на одном vmbr0?
Ограничение — bridge-vids и коммутатор. Не сотни без нужды.
QinQ (802.1ad) из коробки PVE GUI?
Не как основная модель в этой инструкции. Если видите ethertype 0x88a8 — отдельная задача, не tag=.
Почему ping шлюза есть, а между VM одной VLAN нет?
Порт isolation, ACL, Windows firewall, не обязательно VLAN tagging.
Нужно ли разрешать VLAN 1 на trunk «на всякий случай»?
Нет. Native/PVID и allowed list должны совпадать с схемой: management untagged или отдельный VID, гости — явный tag=. VLAN 1 «на всякий» смешивает мусор и усложняет разбор tcpdump.