Короткий ответ

В 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
Сломан сам vmbr0Linux Bridge
Сеть есть, медленно, MTUVM медленно
После migrate на pve2 VLAN нетtrunk только на порту pve1

Возможные причины

  1. На net0 нет tag=, порт коммутатора trunk.
  2. Есть tag=, порт access.
  3. bridge-vlan-aware yes, но VID не в bridge-vids.
  4. PVID/native на коммутаторе не тот, QinQ случайно.
  5. Гость сам тегирует VLAN (nested) + tag в PVE = двойной тег.
  6. 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, на net0tag=.

На коммутаторе (логика, не выдуманный 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, не копируйте linux tag= один в один без чтения 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.